目录
一、redis环境
二、redis手工分片步骤
1. 配置级联复制
2. 去掉老哨兵监控
3. 停止新实例从老实例的复制
4. 添加新哨兵监控
5. 重启新哨兵
6. 添加老哨兵监控
7. 重启老哨兵
三、注意事项
随着数据量越来越大,一个redis实例可能需要分成多个以形成数据分片。此时通常可以采取两种方式操作:一是启用cluster模式自动完成数据分片;二是手工分片,即配置需要分片redis实例的副本,再修改应用程序按一定方式(如取模等)访问不同redis实例。cluster方式的配置可以参考“初学乍练redis:Redis 5.0.3单实例数据迁移到Cluster”。本文说明第二种方式的具体操作步骤。
假设现有三台物理机192.168.1.36、192.168.1.37、192.168.1.38,分别配置为redis一主两从,通过哨兵进行访问。192.168.1.36为主实例,端口为20007,master name为redis7。三台机器上分别启动一个哨兵进程,端口为30001。从哨兵查看复制信息如下:
[root~]#sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.36 -p 30001 info | grep redis7
master1:name=redis7,status=ok,address= 192.168.1.36:20007,slaves=2,sentinels=3
[root~]#sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.37 -p 30001 info | grep redis7
master1:name=redis7,status=ok,address= 192.168.1.36:20007,slaves=2,sentinels=3
[root~]#sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.38 -p 30001 info | grep redis7
master1:name=redis7,status=ok,address= 192.168.1.36:20007,slaves=2,sentinels=3
目标是将现有的一组redis(一主两从)拆分为四组(每组为一主两从),由应用程序实现数据分片策略。新增的三组redis实例所在物理机192.168.1.39、192.168.1.40、192.168.1.41,并且三台机器上分别启动一个哨兵进程,依然是通过哨兵进行访问。
(1)在192.168.1.39、192.168.1.40、192.168.1.41上配置三组标准一主两从redis复制,39为主,端口分别是20001、20002、20003。
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.40 -p 20001 -a 123456 slaveof 192.168.1.39 20001
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.40 -p 20002 -a 123456 slaveof 192.168.1.39 20002
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.40 -p 20003 -a 123456 slaveof 192.168.1.39 20003
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.41 -p 20001 -a 123456 slaveof 192.168.1.39 20001
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.41 -p 20002 -a 123456 slaveof 192.168.1.39 20002
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.41 -p 20003 -a 123456 slaveof 192.168.1.39 20003
(2)配置为老实例的slave,进行数据复制
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.39 -p 20001 -a 123456 slaveof 192.168.1.36 20007
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.39 -p 20002 -a 123456 slaveof 192.168.1.36 20007
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.39 -p 20003 -a 123456 slaveof 192.168.1.36 20007
此步完成后形成一个级联复制,192.168.1.36:20007具有5个slave,分别是192.168.1.37:20007、192.168.1.38:20007、192.168.1.39:20001、192.168.1.39:20002、192.168.1.39:20003。而192.168.1.39上三个redis实例(20001、20002、20003)又分别带有192.168.1.40、192.168.1.42两个slave(端口同192.168.1.39)。可以使用以下命令查看各个实例上的键数:
# 查看key数量,在192.168.1.39执行
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.36 -p 20007 -a 123456 info | grep db0:keys=
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.37 -p 20007 -a 123456 info | grep db0:keys=
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.38 -p 20007 -a 123456 info | grep db0:keys=
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.39 -p 20001 -a 123456 info | grep db0:keys=
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.39 -p 20002 -a 123456 info | grep db0:keys=
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.39 -p 20003 -a 123456 info | grep db0:keys=
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.40 -p 20001 -a 123456 info | grep db0:keys=
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.40 -p 20002 -a 123456 info | grep db0:keys=
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.40 -p 20003 -a 123456 info | grep db0:keys=
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.41 -p 20001 -a 123456 info | grep db0:keys=
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.41 -p 20002 -a 123456 info | grep db0:keys=
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.41 -p 20003 -a 123456 info | grep db0:keys=
# 在192.168.1.36执行
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.36 -p 30001 sentinel remove redis7
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.37 -p 30001 sentinel remove redis7
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.38 -p 30001 sentinel remove redis7
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.36 -p 30001 info | grep redis7
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.37 -p 30001 info | grep redis7
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.38 -p 30001 info | grep redis7
# 在192.168.1.39执行
cat ~/remove_repl.txt | sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.41 -p 20003 -a 123456
cat ~/remove_repl.txt | sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.41 -p 20004 -a 123456
cat ~/remove_repl.txt | sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.41 -p 20005 -a 123456
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.39 -p 20003 -a 123456 info replication
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.39 -p 20004 -a 123456 info replication
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.39 -p 20005 -a 123456 info replication
~/remove_repl.txt文件内容:
slaveof no one
config rewrite
info replication
# 在192.168.1.39执行
cat /home/redis/tmp_sentinel_monitor | sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.39 -p 30001
cat /home/redis/tmp_sentinel_monitor | sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.40 -p 30001
cat /home/redis/tmp_sentinel_monitor | sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.41 -p 30001
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.39 -p 30001 info | grep master
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.40 -p 30001 info | grep master
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.41 -p 30001 info | grep master
/home/redis/tmp_sentinel_monitor文件内容:
sentinel monitor redis1 192.168.1.39 20001 2
sentinel set redis3 auth-pass 123456
sentinel set redis3 down-after-milliseconds 5000
sentinel set redis3 failover-timeout 10000
sentinel monitor redis2 192.168.1.39 20002 2
sentinel set redis4 auth-pass 123456
sentinel set redis4 down-after-milliseconds 5000
sentinel set redis4 failover-timeout 10000
sentinel monitor redis3 192.168.1.39 20003 2
sentinel set redis5 auth-pass 123456
sentinel set redis5 down-after-milliseconds 5000
sentinel set redis5 failover-timeout 10000
# 分别在192.168.1.41、192.168.1.40、192.168.1.39执行
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -p 30001 shutdown
sudo -u redis /home/redis/redis-5.0.3/src/redis-sentinel /home/redis/sentinel/sentinel.conf > /home/redis/sentinel/sentinel.log 2>&1 &
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -p 30001 info | grep master
# 在192.168.1.36执行
cat /home/redis/tmp_sentinel_monitor | sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.36 -p 30001
cat /home/redis/tmp_sentinel_monitor | sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.37 -p 30001
cat /home/redis/tmp_sentinel_monitor | sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.38 -p 30001
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.36 -p 30001 info | grep redis7
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.37 -p 30001 info | grep redis7
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -h 192.168.1.38 -p 30001 info | grep redis7
/home/redis/tmp_sentinel_monitor文件内容:
sentinel monitor redis7 192.168.1.36 20007 2
sentinel set redis7 auth-pass 123456
sentinel set redis7 down-after-milliseconds 5000
sentinel set redis7 failover-timeout 10000
# 在192.168.1.38、192.168.1.37、192.168.1.36执行
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -p 30001 shutdown
sudo -u redis /home/redis/redis-5.0.3/src/redis-sentinel /home/redis/sentinel/sentinel.conf > /home/redis/sentinel/sentinel.log 2>&1 &
sudo -u redis /home/redis/redis-5.0.3/src/redis-cli -p 30001 info