上一节我们配置了Sentinel,本节我们来测试主节点下线后,Sentinel是否能自动进行切换呢?首先我们必须按照上一节配置并运行主从实例和Sentinel进程。如果运行成功,我们可以使用相关命令查看:
127.0.0.1:26379> info sentinel #查看Sentinel进程信息
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.71.108:6379,slaves=2,sentinels=3
127.0.0.1:26379> sentinel masters #查看主实例信息
1) 1) "name"
2) "mymaster"
3) "ip"
4) "192.168.71.108"
5) "port"
6) "6379"
7) "runid"
8) "5d7c758050152fd447331a00c522bdc100953e96"
9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "429"
19) "last-ping-reply"
20) "429"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "7230"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "37802"
29) "config-epoch"
30) "2"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"
127.0.0.1:26379> sentinel slaves mymaster #查看mymaster对应的从实例信息
1) 1) "name"
2) "192.168.71.105:6379"
3) "ip"
4) "192.168.71.105"
5) "port"
6) "6379"
7) "runid"
8) "bddf303b9033a24b0d985a5af082fea8a92b1908"
9) "flags"
10) "slave"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "314"
19) "last-ping-reply"
20) "314"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "4948"
25) "role-reported"
26) "slave"
27) "role-reported-time"
28) "75366"
29) "master-link-down-time"
30) "0"
31) "master-link-status"
32) "ok"
33) "master-host"
34) "192.168.71.108"
35) "master-port"
36) "6379"
37) "slave-priority"
38) "100"
39) "slave-repl-offset"
40) "171590"
2) 1) "name"
2) "192.168.71.106:6379"
3) "ip"
4) "192.168.71.106"
5) "port"
6) "6379"
7) "runid"
8) "80d7af435cc90d69f24996728924fb3b0da621b5"
9) "flags"
10) "slave"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "810"
19) "last-ping-reply"
20) "810"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "8819"
25) "role-reported"
26) "slave"
27) "role-reported-time"
28) "49018"
29) "master-link-down-time"
30) "0"
31) "master-link-status"
32) "ok"
33) "master-host"
34) "192.168.71.108"
35) "master-port"
36) "6379"
37) "slave-priority"
38) "100"
39) "slave-repl-offset"
40) "171004"
后面我们将不再粘贴相关内容,请读者自行使用以上命令查看。
模拟实例下线,触发自动切换
操作步骤
1、首先我们停掉Master主实例,我这里使用的是命令行直接运行,所以直接使用CTRL+C结束就可以了,如果使用守护进行,可以使用shutdown命令去停止或者使用kill去杀死Redis进程。
2、然后查看Sentinel信息
127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.71.106:6379,slaves=2,sentinels=3
上面master切换到192.168.71.106上去了
Sentinel-1的日志显示为:
...
6195:X 02 Sep 21:32:08.140 # +switch-master mymaster 192.168.71.108 6379 192.168.71.106 6379
6195:X 02 Sep 21:32:08.141 * +slave slave 192.168.71.105:6379 192.168.71.105 6379 @ mymaster 192.168.71.106 6379
6195:X 02 Sep 21:32:08.141 * +slave slave 192.168.71.108:6379 192.168.71.108 6379 @ mymaster 192.168.71.106 6379
6195:X 02 Sep 21:32:38.148 # +sdown slave 192.168.71.108:6379 192.168.71.108 6379 @ mymaster 192.168.71.106 6379
上面日志显示,master从192.168.71.108变为192.168.71.106。并且192.168.71.108成为了192.168.71.106的从实例。
我们还可以使用sentinel slaves mymaster查看从实例的信息:
127.0.0.1:26379> sentinel slaves mymaster
1) 1) "name"
2) "192.168.71.105:6379"
3) "ip"
4) "192.168.71.105"
5) "port"
6) "6379"
7) "runid"
8) "bddf303b9033a24b0d985a5af082fea8a92b1908"
9) "flags"
10) "slave"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "7"
19) "last-ping-reply"
20) "7"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "1368"
25) "role-reported"
26) "slave"
27) "role-reported-time"
28) "192299"
29) "master-link-down-time"
30) "0"
31) "master-link-status"
32) "ok"
33) "master-host"
34) "192.168.71.106"
35) "master-port"
36) "6379"
37) "slave-priority"
38) "100"
39) "slave-repl-offset"
40) "245748"
2) 1) "name"
2) "192.168.71.108:6379"
3) "ip"
4) "192.168.71.108"
5) "port"
6) "6379"
7) "runid"
8) ""
9) "flags"
10) "s_down,slave,disconnected" #108是不能连接,并且是从实例
11) "link-pending-commands"
12) "2"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "192299"
17) "last-ok-ping-reply"
18) "192299"
19) "last-ping-reply"
20) "192299"
21) "s-down-time"
22) "162292"
23) "down-after-milliseconds"
24) "30000"
25) "info-refresh"
26) "1535938520440"
27) "role-reported"
28) "slave"
29) "role-reported-time"
30) "192299"
31) "master-link-down-time"
32) "0"
33) "master-link-status"
34) "err"
35) "master-host"
36) "?"
37) "master-port"
38) "0"
39) "slave-priority"
40) "100"
41) "slave-repl-offset"
42) "0"
3、我们继续可以停掉106这台服务器上的redis实例,很快master将变为105上的redis。106和108都将成为105的从实例。
在以上的整个过程中,希望大家多看看每个Sentinel的日志,这些日志对分析整个选举和自动切换都很有帮助。
模拟Sentinel下线
操作步骤
首先我们将上面停掉的Redis重新启动起来,然后我们来模拟Sentinel下线后再对Redis主实例进行下线。然后观察其自动切换状态。
1、首先我们停用Sentinel-1,并停止当前的Redis的主实例,观察发现会自动进行切换
2、我们在停用Sentinel-2,并停止上一步选出来的主实例后,在继续观察就可以得出,不会进行切换,整个状态变为:sdown
192.168.71.106:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=sdown,address=192.168.71.108:6379,slaves=2,sentinels=3
这就是我们上一节配置的时候至少需要两个Sentinel节点统一后才进行切换。