redis主从环境配置
本文介绍redis主从环境下的手工failover操作及排错过程,实现主实例宕机的时候,将从实例提升为主实例,继续写入数据;等到原主实例恢复后,同步原从实例上的数据完成后,恢复初始的主从实例角色!环境介绍
操作系统版本均为:rhel5.4 64bit
redis版本:2.6.4
redis实例端口均为:6379
redis实例密码均为:123
主实例为server11(192.168.1.112)
从实例为server12(192.168.1.113)
一:未配置持久化情况下的手工切换
1:正常情况下,server11为主实例,server12为从实例,数据同步正常
01.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123
02.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 info |grep -A 3 'Replication'
03.# Replication
04.role:master
05.connected_slaves:1
06.slave0:192.168.1.113,6379,online
07.
08.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 config get save
09.1) "save"
10.2) ""
11.
12.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 config get save
13.1) "save"
14.2) ""
15.
16.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 set 5 e
17.OK
18.
19.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 get 5
20."e"
21.
22.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 523."e" 2:当主实例挂掉的时候,从实例可以正常查询,但无法写入数据
01.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 shutdown
02.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 get 5
03.Could not connect to Redis at 192.168.1.112:6379: Connection refused
04.
05.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 5
06."e"
07.#/usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 set 6 f08.(error) READONLY You can't write against a read only slave. 3:将从实例提升为主实例,从而实现数据写入
01.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 SLAVEOF NO ONE
02.OK
03.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 info |grep -A 3 'Replication'
04.# Replication
05.role:master
06.connected_slaves:0
07.
08.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 5
09."e"
10.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 set 6 f
11.OK
12.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 6
13."f" 4:主实例恢复后尝试从server12实例上获取最新的数据,实际测试表明这种方法不可行,最终导致server11和server12的数据不一致,如果强行恢复初始实例角色,则会导致数据丢失
01.# /usr/local/redis2/bin/redis-server /usr/local/redis2/etc/redis.conf
02.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 info |grep -A 3 'Replication'
03.# Replication
04.role:master
05.connected_slaves:0
06.
07.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123get 5
08.(nil)
09.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123get 6
10.(nil)
11.
12.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123get 5
13."e"
14.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123get 6
15."f"
16.
17.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -p 6379 -a 123 SLAVEOF 192.168.1.113 6379
18.OK
19.
20.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 info |grep -A 10 'Replication'
21.# Replication
22.role:slave
23.master_host:192.168.1.113
24.master_port:6379
25.master_link_status:down
26.master_last_io_seconds_ago:-1
27.master_sync_in_progress:0
28.master_link_down_since_seconds:517
29.slave_priority:100
30.slave_read_only:1
31.connected_slaves:0
32.
33.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 info |grep -A 3 'Replication'
34.# Replication
35.role:master
36.connected_slaves:0
37.
38.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 get 5
39.(nil)
40.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 get 6
41.(nil)
42.
43.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 6
44."f"
45.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 5
46."e" 二:开启从实例快照持久化下的测试
1:恢复原测试环境后,开启从实例的快照持久化,因为是测试环境,所以设置60秒内如果有1条数据变更则保持一次快照
01.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 config get save02.1) "save"03.2) ""04. 05.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 config get save06.1) "save"07.2) "60 1"08. 09.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 info |grep -A 3 'Replication'10.# Replication11.role:master12.connected_slaves:113.slave0:192.168.1.113,6379,online14. 15.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 info |grep -A 3 'Replication'16.# Replication17.role:slave18.master_host:192.168.1.11219.master_port:6379 2:写入测试数据主从环境数据是否同步正常
01.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 set 5 e02.OK03. 04.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 get 505."e"06. 07.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 508."e" 3:模拟主实例宕机,手动将从实例提升为主实例,继续写入新数据
01.# killall -9 redis-server02.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 info |grep -A 3 'Replication'03.Could not connect to Redis at 192.168.1.112:6379: Connection refused04. 05.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 506."e"07.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 set 6 f08.(error) READONLY You can't write against a read only slave09. 10.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 slaveof no one11.OK12.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 info |grep -A 3 'Replication'13.# Replication14.role:master15.connected_slaves:016. 17.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 518."e"19. 20.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 set 6 f21.OK22. 23.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 624."f" 4:原主实例恢复后的数据同步及角色复原,这里同步数据采取将从实例的快照文件复制到主实例的方式实现
01.# scp /usr/local/redis2/slave_dump.rdbserver11:/usr/local/redis2/master_dump.rdb02.# /usr/local/redis2/bin/redis-server /usr/local/redis2/etc/redis.conf 03.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 info |grep -A 2 'Replication'04.# Replication05.role:master06.connected_slaves:007.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 get 508."e"09.# /usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 get 610."f"11. 12.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 slaveof 192.168.1.112 637913.OK14.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 info |grep -A 10 'Replication'15.# Replication16.role:slave17.master_host:192.168.1.11218.master_port:637919.master_link_status:up20.master_last_io_seconds_ago:121.master_sync_in_progress:022.slave_priority:10023.slave_read_only:124.connected_slaves:025.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 526."e"27.# /usr/local/redis2/bin/redis-cli -h 192.168.1.113 -a 123 get 628."f29. 30.#/usr/local/redis2/bin/redis-cli -h 192.168.1.112 -a 123 info |grep -A 3 'Replication'31.# Replication32.role:master33.connected_slaves:134.slave0:192.168.1.113,6379,online
页:
[1]