Redis是一个内存中的NoSQL,键值缓存和存储,也可以保存到磁盘。它越来越受欢迎,并且在大型和小型项目中被用作数据存储区。出于多种原因,例如转换到功能更强大的服务器,有时需要将数据从一台服务器迁移到另一台服务器。
虽然可以将数据库文件从当前服务器复制到新服务器,但迁移Redis数据库的推荐方法是以主从方式使用复制设置。这样的设置比复制文件快得多,并且很少或根本没有停机时间。
本文将介绍如何使用主从复制将Redis数据从Ubuntu 14.04服务器迁移到类似的服务器。这涉及设置新的Redis服务器,将其配置为当前服务器(即主服务器)的从属服务器,然后在迁移完成后将从服务器升级为主服务器。
要阅读本文,您需要一台具有要导出或迁移的数据的Redis主服务器,以及另一台将成为从属服务器的新Redis服务器。
具体来说,这些是Redis master的准备条件。
sudo
命令的非root账号的Ubuntu 14.04服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。-这些是Redis slave的准备条件。
sudo
命令的非root账号的Ubuntu 14.04服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。确保遵循两个服务器上IPTables教程中的nameserver配置部分; 没有它,apt
将无法工作。
安装和配置Redis从站后,您所拥有的是两台因防火墙规则而无法通信的独立服务器。在这一步中,我们将解决这个问题
此修复涉及在主服务器上添加TCP规则的例外以允许端口6379上的Redis流量。因此,在主服务器上,打开IPv4规则的IPTables配置文件。
sudo nano /etc/iptables/rules.v4
在允许SSH流量的规则正下方,为Redis添加规则,该规则仅允许来自从属IP地址的Redis端口上的流量。确保更新your_slave_ip_address
到从属服务器的IP地址。
. . .
# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT
-A TCP -p tcp -s your_slave_ip_address --dport 6379 -j ACCEPT
. . .
这是非常严格和更安全的。否则,服务器将接受来自Redis端口上任何主机的流量。
重新启动IPTables以应用新规则。
sudo service iptables-persistent restart
既然复制系统已启动且主服务器上的防火墙已配置为允许Redis流量,我们可以验证两个服务器是否可以通信。
如果两个服务器都已建立联系,则应自动从服务器向从属设备导入数据。您现在只需要验证它已成功完成。有多种方法可以验证。
验证数据导入成功的一种方法是查看Redis数据目录。现在,主服务器上的相同文件应该位于从服务器上。如果使用此命令在从属服务器的Redis数据目录中执行长文件列表:
ls -lh /var/lib/redis
你应该得到这种输出:
total 32M
-rw-r----- 1 redis redis 19M Oct 6 22:53 appendonly.aof
-rw-rw---- 1 redis redis 13M Oct 6 22:53 dump.rdb
另一种验证数据导入的方法是从Redis命令行。在从属服务器上输入命令行。
redis-cli
然后验证并发出info
命令
auth insert-redis-password-here
info
在输出中,两个服务器上#Keyspace中的键数应该相同。下面的输出取自从服务器,与主服务器上的输出完全相同。
# Keyspace
db0:keys=26378,expires=0,avg_ttl=0
另一种验证从站现在具有与主站上相同数据的方法是使用Redis命令行中的scan
命令。虽然该命令的输出在两个服务器上并不总是相同,但是当在从机上发出时,它至少会让您确认从机是否具有您希望在其上找到的数据。
本文中使用的测试服务器的示例输出如下所示。请注意,该scan
命令的参数只是任何数字,并充当游标:
scan 0
输出应该类似于:
1) "17408"
2) 1) "uid:5358:ip"
2) "nodebbpostsearch:object:422"
3) "uid:4163:ip"
4) "user:15682"
5) "user:1635"
6) "nodebbpostsearch:word:HRT"
7) "uid:6970:ip"
8) "user:15641"
9) "tid:10:posts"
10) "nodebbpostsearch:word:AKL"
11) "user:4648"
127.0.0.1:6379>
一旦确认从站具有所有数据,您就可以将其提升为主站。
首先,在从站上输入Redis命令行。
redis-cli
进行身份验证后,发出slaveof no one
命令将其提升为master。
auth your_redis_password
slaveof no one
你应该得到这个输出:
OK
然后使用该info
命令进行验证。
info
“ 复制”部分中的相关输出应如下所示。特别是,角色:主线显示Slave现在是Master。
# Replication
role:master
connected_slaves:0
master_repl_offset:11705
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
之后,前主日志文件中的单个条目也应该确认。
14613:M 07 Oct 14:03:44.159 # Connection with slave 192.168.1.8:6379 lost.
在新的Master(以前的Slave),你应该看到:
14573:M 07 Oct 14:03:44.150 # Connection with master lost.
14573:M 07 Oct 14:03:44.150 * Caching the disconnected master state.
14573:M 07 Oct 14:03:44.151 * Discarding previously cached master state.
14573:M 07 Oct 14:03:44.151 * MASTER MODE enabled (user request from 'id=4 addr=127.0.0.1:52055 fd=6 name= age=2225 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=slaveof')
此时,您现在可以将应用程序连接到数据库,并且可以删除或销毁原始主服务器。
正确完成后,以这种方式迁移Redis数据是一项简单的任务。错误的主要来源通常是忘记修改主服务器的防火墙以允许Redis流量。
更多Ubuntu教程请前往腾讯云+社区学习更多知识。
参考文献:《How to Migrate Redis Data with Master-Slave Replication on Ubuntu 14.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。