前言
因为公司服务器架构调整,现在需要将redis cluster迁移到其他机器上,但中间服务又不能停,且数据不能丢失。
环境
原搭建环境的服务器
IP | hostname | 角色 |
---|---|---|
10.1.24.127 | bd127 | master |
10.1.24.128 | bd128 | master |
10.1.24.129 | bd129 | master |
10.1.24.130 | bd130 | slave |
10.1.24.131 | bd131 | slave |
10.1.24.132 | bd132 | slave |
选择想要迁移的服务器
IP | hostname | 角色 |
---|---|---|
10.1.24.126 | bd126 | master |
10.1.24.127 | bd127 | master |
10.1.24.132 | bd132 | master |
10.1.24.198 | bd198 | slave |
10.1.24.199 | bd199 | slave |
10.1.24.205 | bd205 | slave |
然后在这几台机器上搭建好redis的环境。并修改redis相关配置,要和原环境的一致。
迁移
redis cluster模式通过redis-trib.rb
,这个工具进行节点的增删改等操作。因为这个脚本工具是用ruby
开发的,所以还需要安装ruby语言环境,并下载ruby语言的redis
依赖包gem install redis
。需要注意的是,redis依赖包需要ruby2.2.2
版本以上,但centos的yum命令对ruby只支持到2.0.0
,所以yum install ruby
是不行的,只能手动安装。
- 启动所有需要加入到集群的节点
redis-server ./cluster/redis.conf
- 然后将所有需要迁移到的服务器按照预先设计的架构添加到对应的master下。
src/redis-trib.rb add-node --slave --master-id <node_id> new_host:new_port existing_host:existing_port
那么添加完成之后的架构应该如下这样:
master | slave |
---|---|
bd127 | bd130, bd199 |
bd128 | bd131, bd126, bd199 |
bd129 | bd132, bd205 |
- 删除掉不需要的
slave
,bd130, bd131
src/redis-trib.rb del-node existing_host:existing_port node_id
- shutdown不需要的
master
,bd128, bd129
连接到相应服务器,然后netstat -tunlp|grep 28275
,然后kill
即可。这时候集群会自动从slave中选举一个节点作为新的master。 - 启动第四步中shutdown的master,这时候这些master就会变成slave,直接删除掉即可。
说明
node id
所有节点的node_id,可以在redis.conf
中配置的cluster-config-file /home/redis/redis-5.0.5/cluster/nodes-28275.conf
中查看。内容如下:
9429cdaad3fe4d606d0c8783b8263bdfcd37c31d 10.1.24.132:28275@38275 master - 0 1592384081025 7 connected 5461-10922
3e66f565c33b4eeeee0f25d9de57a9ed8b9ecc64 10.1.24.127:28275@38275 master - 0 1592384083031 1 connected 0-5460
e6ee647f394f4c59ac4c60240f585fa8d9a166fd 10.1.24.205:28275@38275 slave 9429cdaad3fe4d606d0c8783b8263bdfcd37c31d 0 1592384084033 7 connected
a9e28984ae28467fdb98edf67e61062b67dd4532 10.1.24.198:28275@38275 slave dcb99c462a462fae131271676d14d0065a2dc2f7 0 1592384081000 8 connected
dcb99c462a462fae131271676d14d0065a2dc2f7 10.1.24.126:28275@38275 master - 0 1592384082028 8 connected 10923-16383
a65861d7fc132d175b1877155781e9ca68d2b014 10.1.24.199:28275@38275 myself,slave 3e66f565c33b4eeeee0f25d9de57a9ed8b9ecc64 0 1592384082000 0 connected
使用redis-trib.rb
的密码问题
修改/usr/local/rvm/gems/ruby-2.5.1/gems/redis-4.0.3/lib/redis/client.rb
文件,将password
修改为redis的密码即可。
class Client
DEFAULTS = {
:url => lambda { ENV["REDIS_URL"] },
:scheme => "redis",
:host => "127.0.0.1",
:port => 6379,
:path => nil,
:timeout => 5.0,
:password => "redisPass",
:db => 0,
:driver => nil,
:id => nil,
:tcp_keepalive => 0,
:reconnect_attempts => 1,
:reconnect_delay => 0,
:reconnect_delay_max => 0.5,
:inherit_socket => false
}