Redis哨兵模式(故障转移测试)

1、问题

哨兵模式是在主备模式的基础上,加上哨兵,实现redis集群的故障转移。哨兵负责监控集群状态,当redis主节点发生故障,哨兵通过选举,选出替代的master节点。一般需要单数的哨兵进行选举,大多数达成一致。

问题:如果哨兵集群也有部分实例down了,出现偶数哨兵,或者只剩下一个哨兵会如何,还能进行故障转移吗。

为什么会出现这个问题:哨兵其实也是redis实例,一般情况下,哨兵是为了保证redis集群的故障转移。由于资源,以及网络通信的性能考虑,一般哨兵和redis会部署在同一物理机。如果一台物理机出现了物理故障,哨兵实例和redis服务实例会一起down掉。

本文章针对这个问题做一下实验。

2、实验环境搭建

使用3+3模式,3redis+3sentinel。

三台虚拟机,每台虚拟机运行1个redis+1个sentinel

ip、角色规划

    192.168.237.101:master,sentinel

    192.168.237.100:slave,sentinel

    192.168.237.103:slave,sentinel

安装redis、redis sentinel

    apt-get install redis-server

    apt-get install redis-sentinel

redis-server配置修改(/etc/redis/redis.conf)

   

redis-server配置就改


redis-server slave配置修改

redis-server slave配置

启动redis-server

    /etc/init.d/redis-server restart

查看redis-server主从集群情况


redis-server集群情况

修改sentinel配置(/etc/redis/sentinel.conf)

    sentinel monitor mymaster 192.168.237.101 6379 2

    sentinel known-slave mymaster 192.168.237.100 6379

    protected-mode no

启动sentinel

    /etc/init.d/redis-sentinel start

查看redis-sentinel情况

   

命令行登录sentinel


sentinel集群情况

3.实验场景

3.1.关掉redis-server master

预期:故障转移,哨兵选举出新的master

关掉redis-server(192.168.237.101)


关掉redis-server master,模拟down

查看sentinel日志(/var/log/redis/redis-sentinel.log)

可以看到,+odown master,哨兵检测master客观下线

然后进行投票:vote-for-leader

选出新的master:switch-master mymaster 192.168.237.101 6379 192.168.237.103 6379

192.168.237.101的sentinel日志:


192.168.237.101的sentinel日志


192.168.237.100的sentinel日志


192.168.237.103的sentinel日志

查看redis和sentinel集群状态,确认master变成了192.168.237.103(master host)


redis server集群


sentinel集群

恢复192.168.237.101的redis-server,查看日志,192.168.237.101转换成slave


启动101redis server


101转为slave


3.2 关掉redis-server master、一个redis-sentinel

预期:有两个sentinel,可能会出现,剩下两个slave各得一票的情况,按照哨兵原理,会等待一段时间进行再选举,直到某个slave有两票,完成故障转移。

经过3.1实验,master转换到了192.168.237.103,现在先后关掉103上的sentinel和redis-server

查看两台sentinel的redis-sentinel日志,可以选出master,进行故障转移:


1


2

查看redis集群状态,确认master(192.168.237.100)


redis-server集群状态


sentinel状态

3.3 关掉redis-server master、两个redis-sentinel

预期:无法切换

依次关掉两个sentinel,一个redis-server master。3.2节master转移到了100,恢复环境后,依次关掉103,100的sentinel,100的redis-server master


查看101上的sentinel日志,由于只有一个sentinel,只有101上的sentinel投票


101的sentinel

恢复一个redis-sentinel,现有两个redis-sentinel

恢复一个sentinel

查看sentinel日志,选出101为master

两个sentinel选举出master


4 结论

      有两个sentinel或以上可以进行故障切换。单数sentinel更容易选出master,进行故障转移。

5 日志名词解释

+sdown:主观down机

+odown:客观down机

+new-epoch:集群递增版本号

+vote-for-leader:在哨兵集群中投票选举出一个哨兵,作为本次执行故障转移操作的leader

+try-failover:开始对某ip进行故障转移

voted for:另一个哨兵进行投票

+elected-leader:在哨兵集群中再次确认进行即将执行故障转移的leader是哪一个哨兵。 

+selected-slave slave:选出leader

 +failover-state-send-slaveof-noone slaveLeader:向目标slave发送"slaveof-noone"指令,令其不要再做其它任何节点的slave了,从现在开始,它就是老大,完成从slave到master的转换。

+failover-state-wait-promotion slave:等待其它的sentinel确认slave

+promoted-slave slave:其它的sentinel全部确认成功

+failover-state-reconf-slaves:开始对集群中的所有slave做reconf操作(更新配置信息)

+slave-reconf-sent:向指定的slave发送"slaveof"指令,令其跟随新的master

+switch-master:故障转移完毕后,各个sentinel开始监控新的master

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容