redis专题十四:redis的哨兵模式

一、哨兵模式简介

1.1 问题

之前专题,我们已经构建了一个简单的主从结构的集群,可是,如果当master宕机了,那其关联的slave就没法正常工作了;这个时候,需要从slave中选取一个来当master才行;

 那这个过程需要做哪些事情呢?

  • 将宕机的master下线
  • 选取一个slave作为master
  • 通知所有的slave连接新的master
  • 重新启动新的master和slave
  • 有可能出现的全量复制 * N + 部分复制 * N

那么,这里将面临几个问题:

  • 谁来确认master宕机了?
  • 找一个主?怎么找?
  • 修改配置后,原来的master恢复了怎么办?

 解决这些问题的关键:哨兵。哨兵就像是一个监工,监控着整个集群的运行。

 1.2 哨兵的定义

哨兵(sentinel),是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时,通过投票机制选举新的master并将所有的slave连接到新的master。那么我们的集群就转变为:

 1.3 哨兵的作用

  • 时刻监控master和slave是否正常运行
  • 当被监控的服务器出现问题,向其他服务器发送通知
  • 自动故障转移:断开master和slave的连接,选取一个slave作为master,将其他的slave连接到新的master,并告知客户端新的服务器地址

注意:哨兵也是一台redis服务器,只是不提供数据服务,通常哨兵数量配置为单数(防止选举时打平的尴尬局面);

二、启用哨兵

作为哨兵的服务器也有自己的配置文件:例如sentinel.conf(可自定义)

启动哨兵:redis-sentinel sentinel.conf

配置举例 说明
sentinel monitor mymaster 127.0.0.1 6379 2

表明要监控的master主机,mymaster是自定义的master主机的名字;

127.0.0.1和6379是监控主机的IP和端口;2代表如果有两个哨兵认为

它挂了,那它就挂了。

sentinel down-after-milliseonds mymaster 30000

master连接30秒没响应就代表master挂了;注意这里的参数mymaster

和上面自定义保持一致就行

sentinel parallel-syncs mymaster 1

当master挂的时候,新的master上线后,最多有多少个slave可以和master

进行数据同步,设置越小性能越好,速度越快;

这个数字越小,完成failover所需的时间就越长,

但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。

可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。

sentinel failover-timeout mymaster 1800000 在同步的时候,多长时间同步完,算是有效,这里是180秒,即三分钟

三、哨兵的工作原理

哨兵最重要的就是实现主从切换;主从切换主要经历三个阶段:监控、通知、故障转移

3.1 监控阶段

监控阶段主要做的就是同步各个节点的状态信息。

  • 获取各个sentinel状态(是否在线)
  • 获取master的状态,包括master的属性(runid,role,各个slave的详细信息)
  • 获取所有slave的状态,包括slave的属性(runid,role,offset等)

 

 各个sentinel之间组成一个小的网络,相互发送消息,其中一个的消息都会发给其他;

3.2 通知阶段

可以看是一个信息的长期维护阶段;不管哪个sentinel获取到某个阶段状态的信息,都会告知其他的sentinel。维护信息对等。

3.3 故障转移阶段

  • 当一个sentinel向master发送指令,master没有响应,多次尝试未果之后,标记master状态为:SRI_S_DOWN,接着,这个sentinel告诉其他sentinel,当其他sentinel收到之后,也去向master发送消息,得到结果后传递给其他sentinel,有一半以上的sentinel认为这个master挂了,这个master就是真的挂了,这时候标记master状态:SRI_O_DOWN。注意:当一个sentinel认为master挂了,称为主观下线;一半以上认为挂了,称为客观下线;
  • 接下来,要下线掉这个宕机的master,那么这么多的sentinel,由谁去处理呢?sentinel之间通过投票之后,选举出一个代表
  • 选举出来的sentinel在剩下的slave中选取一个作为master,选取规则包括:在线的、响应快的、优先级等;
  • sentinel发送指令,向新的master发送:salveof no one,向其他的slave发送:slave  新masterIp 新masterPort

这一篇就到这里,下一篇写redis的集群。

 

posted @ 2020-11-23 21:50  未知的九月  阅读(181)  评论(0)    收藏  举报