如何在Ubuntu14.04上使用主从复制迁移Redis数据
介绍
Redis 是一种内存中的 NoSQL 键值缓存和存储,也可以持久化到磁盘。 它越来越受欢迎,并且在大型和小型项目中都被用作数据存储。 出于多种原因,例如转换到更强大的服务器,有时需要将数据从一台服务器迁移到另一台服务器。
虽然可以将数据库文件从当前服务器复制到新服务器,但迁移 Redis 数据库的推荐方法是以主从方式使用复制设置。 这样的设置比复制文件要快得多,并且几乎不需要停机时间。
本文将展示如何使用主从复制将 Redis 数据从 Ubuntu 14.04 服务器迁移到类似的服务器。 这涉及设置一个新的 Redis 服务器,将其配置为当前服务器的从属服务器(即 master),然后在迁移完成后将slave提升为master。
先决条件
要阅读本文,您将需要一个 Redis 主服务器,其中包含您要导出或迁移的数据,以及第二台新的 Redis 服务器,它将作为从属服务器。
具体来说,这些是 Redis master 的先决条件。
- 一台 Ubuntu 14.04 服务器,具有:
- 一个 sudo 非 root 用户,通过 初始服务器设置指南 设置
- 通过this IPTables tutorial配置的防火墙,通过(可选)更新名称服务器步骤
- 按照 this Redis cluster tutorial 中的步骤 1 和 2 安装 Redis 并将其设置为主节点
- 一些要迁移的数据,你可以按照这篇Redis恢复文章中的步骤1和2进行设置
而这些都是 Redis 从站的先决条件。
- 第二个 Ubuntu 14.04 服务器:
- 一个 sudo 非 root 用户,通过 初始服务器设置指南 设置
- 通过this IPTables tutorial配置的防火墙,通过(可选)更新名称服务器步骤
- 按照 this Redis cluster tutorial 中的步骤 1 和 3 安装 Redis 并将其设置为从属设备
确保在两台服务器上都遵循 IPTables 教程中的名称服务器配置部分; 没有它,apt
将无法工作。
第 1 步 — 更新 Redis 主防火墙
安装和配置 Redis 从站后,您拥有的是两个独立的服务器,它们由于防火墙规则而无法通信。 在这一步中,我们将修复它
修复涉及在主服务器上添加 TCP 规则例外,以允许端口 6379 上的 Redis 流量。 因此,在主服务器上,打开 IPv4 规则的 IPTables 配置文件。
sudo nano /etc/iptables/rules.v4
在允许 SSH 流量的规则下方,为 Redis 添加一条规则,允许 Redis 端口 only 上来自从站 IP 地址的流量。 确保将 your_slave_ip_address
更新为从服务器的 IP 地址。
/etc/iptables/rules.v4
. . . # 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 流量,我们可以验证两台服务器是否可以通信。 这可以通过 this Redis cluster tutorial 的第 4 步中给出的说明来完成。
第 2 步 — 验证数据导入
如果两台服务器都建立了联系,从服务器到从服务器的数据导入应该会自动开始。 您现在只需验证它是否已成功完成。 有多种验证方式。
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 命令行。 在从服务器上输入命令行。
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>
第 3 步——将奴隶提升为主人
一旦你确认slave拥有所有数据,你就可以将它提升为master。 这也在 Redis 集群教程 的 Step 5 中有所介绍,但为简单起见,此处也提供了说明。
首先,在slave上输入Redis命令行。
redis-cli
认证完成后,发出slaveof no one
命令提升为master。
auth your_redis_password slaveof no one
你应该得到这个输出:
输出
OK
然后使用info
命令进行验证。
info
Replication 部分中的相关输出应如下所示。 特别是, role: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
之后,前主日志文件中的单个条目也应确认这一点。
/var/log/redis/redis-server.log
14613:M 07 Oct 14:03:44.159 # Connection with slave 192.168.1.8:6379 lost.
在新的主人(以前的奴隶)上,你应该看到:
/var/log/redis/redis-server.log
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')
此时,您现在可以将应用程序连接到数据库,并且可以删除或销毁原来的 master。
结论
如果操作正确,以这种方式迁移 Redis 数据是一项简单的任务。 错误的主要来源通常是忘记修改主服务器的防火墙以允许 Redis 流量。
您可以通过浏览 更多 Redis 教程 来了解如何使用 Redis 做更多事情。