上一节我们配置了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节点统一后才进行切换。