[Redis]Redis数据库不停服迁移
这篇笔记很久以前就想写出来,一直忘记就没写,现在放出来希望能帮到有需要的人。
由于工作关系,需要将服务器A的redis数据库迁移到服务器B上,一开始是打算停服后再把rdb文件复制过去,但是这个方法显然对现有业务造成很大影响。网上查了一下,再结合自己的研究,发现其实是可以不停服迁移的,而且方法也很简单。
有两种情况,一种是服务器B中没有开启redis服务,可以新建一个配置文件,修改相关字段来实现迁移;另一种是服务器B已经开启redis服务进程,而且不想关闭进程,可以通过一些命令来实现迁移。
情况一:
将默认的配置复制一份,修改好端口、密码、log文件路径……等信息后,将其中两个字段修改为以下值:
slaveof 服务器A的IP 服务器A的redis端口
masterauth 服务器A的redis密码
然后开启redis-server,tail -F /var/log/redis.log查看日志,可以发现出现以下信息:
16813:C 25 Oct 2019 15:18:41.385 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
16813:C 25 Oct 2019 15:18:41.385 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=16813, just started
16813:C 25 Oct 2019 15:18:41.385 # Configuration loaded
16814:S 25 Oct 2019 15:18:41.387 * Running mode=standalone, port=60381.
16814:S 25 Oct 2019 15:18:41.387 # Server initialized
16814:S 25 Oct 2019 15:18:41.387 * Ready to accept connections
16814:S 25 Oct 2019 15:18:41.388 * Connecting to MASTER 服务器A的IP:6379
16814:S 25 Oct 2019 15:18:41.388 * MASTER <-> REPLICA sync started
16814:S 25 Oct 2019 15:18:41.430 * Non blocking connect for SYNC fired the event.
16814:S 25 Oct 2019 15:18:41.473 * Master replied to PING, replication can continue...
16814:S 25 Oct 2019 15:18:41.600 * Partial resynchronization not possible (no cached master)
16814:S 25 Oct 2019 15:18:41.651 * Full resync from master: 45939622c3862dc7604e44fc7a36e0a72825ab65:0
16814:S 25 Oct 2019 15:18:44.773 * MASTER <-> REPLICA sync: receiving 67486222 bytes from master
过了一段时间后,会再次出现一些信息:
16814:S 25 Oct 2019 15:21:37.316 * MASTER <-> REPLICA sync: Flushing old data
16814:S 25 Oct 2019 15:21:37.316 * MASTER <-> REPLICA sync: Loading DB in memory
16814:S 25 Oct 2019 15:21:41.719 * MASTER <-> REPLICA sync: Finished with success
这时查看服务器A的redis日志,会发现出现类似这样的信息:
6368:M 25 Oct 16:11:02.984 * Slave 服务器B的IP:6379 asks for synchronization
6368:M 25 Oct 16:11:02.984 * Full resync requested by slave 服务器B的IP:6379
6368:M 25 Oct 16:11:02.984 * Starting BGSAVE for SYNC with target: disk
6368:M 25 Oct 16:11:02.992 * Background saving started by pid 14348
14348:C 25 Oct 16:11:03.613 * DB saved on disk
14348:C 25 Oct 16:11:03.615 * RDB: 0 MB of memory used by copy-on-write
6368:M 25 Oct 16:11:03.621 * Background saving terminated with success
6368:M 25 Oct 16:11:40.420 * Synchronization with slave 服务器B的IP:6379 succeeded
这证明数据库的同步已经完成,最后需要在B中输入以下命令将从库身份转为主库:
服务器B的IP> slaveof no one
OK
服务器B的IP> info Replication
# Replication
role:master
connected_slaves:0
master_replid:a82f376e91cd05b7ee516b021ad7128c1030e898
master_replid2:3b194e565b4f94595cbefd7ea64431b8437177b3
master_repl_offset:4182242
second_repl_offset:4182243
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:3133667
repl_backlog_histlen:1048576
可以看到role已经是master了,这就说明从库已经变为主库,这时可以修改业务进程的数据库IP为服务器B的IP。
情况二:
方法和修改配置差不多,只不过是通过redis-cli客户端命令行来实现。
先用命令查看主库的密码是否已设置正确:
config get masterauth
如不正确,可以用以下命令修改(123456为主库的密码):
config set masterauth 123456
然后执行以下命令,将数据库从主库迁移到从库:
slaveof 服务器A的IP 服务器A的redis端口
查看迁移情况与“情况一”一样,看到有“MASTER <-> SLAVE sync: Finished with success”就表明迁移成功,后面将从库改为主库的操作也与“情况一”一致,在此不再赘述。