Redis哨兵模式

哨兵(sentinel)是Redis的高可用性(High Availability)的解决方案: 由一个或多个sentinel实例组成sentinel集群可以监视一个或多个主服务器和多个从服务器。 当主服务器进入下线状态时,sentinel可以将该主服务器下的某一从服务器升级为主服务器继续提供服务,从而保证redis的高可用性。

哨兵模式部署方案:

 一,哨兵模式执行流程

1,启动并完成Sentinel初始化

Sentinel是一个特殊的Redis服务器,不会进行持久化,Sentinel实例启动后,每个Sentinel会创建2个连向主服务器的网络连接 :

  • 命令连接:用于向主服务器发送命令,并接收响应;
  • 订阅连接:用于订阅主服务器的—sentinel—:hello频道。

 2,获取主服务器信息

Sentinel默认每10s一次,向被监控的主服务器发送info命令,获取主服务器和其下属从服务器的信息。

3,获取从服务器信息

当Sentinel发现主服务器有新的从服务器出现时,Sentinel还会向从服务器建立命令连接和订阅连接。 在命令连接建立之后,Sentinel还是默认10s一次,向从服务器发送info命令,并记录从服务器的信息。

 4,向主服务器和从服务器发送消息(以订阅的方式)

默认情况下,Sentinel每2s一次,向所有被监视的主服务器和从服务器所订阅的—sentinel—:hello频道上发送消息,消息中会携带Sentinel自身的信息和主服务器的信息。

PUBLISH _sentinel_:hello "< s_ip > < s_port >< s_runid >< s_epoch > < m_name > <
m_ip >< m_port ><m_epoch>"

5,接收来自主服务器和从服务器的频道信息

当Sentinel与主服务器或者从服务器建立起订阅连接之后,Sentinel就会通过订阅连接,向服务器发送命令: subscribe —sentinel—:hello

(Sentinel彼此之间只创建命令连接,而不创建订阅连接,因为Sentinel通过订阅主服务器或从服务器, 就可以感知到新的Sentinel的加入,而一旦新Sentinel加入后,相互感知的Sentinel通过命令连接来通信就可以了。)

6,检测主观下线状态(Ping-Pong)

Sentinel每秒一次向所有与它建立了命令连接的实例(主服务器、从服务器和其他Sentinel)发送PING命令,实例在down-after-milliseconds毫秒内返回无效回复(除了+PONG、-LOADING、-MASTERDOWN外) 实例在down-after-milliseconds毫秒内无回复(超时) Sentinel就会认为该实例主观下线(SDown)

7,检查客观下线状态

当一个Sentinel将一个主服务器判断为主观下线后 Sentinel会向同时监控这个主服务器的所有其他Sentinel发送查询命令,判断它们是否也认为主服务器下线。如果达到Sentinel配置中的quorum数量的Sentinel实例都判断主服 务器为主观下线,则该主服务器就会被判定为客观下线(ODown)。【误判分析,一般为半数以上就判断下线】

8,选举Leader Sentinel

当一个主服务器被判定为客观下线后,监视这个主服务器的所有Sentinel会通过选举算法(raft),选出一个Leader Sentinel去执行failover(故障转移)操作。

二,哨兵模式Sentinel Leader的选举流程

Raft协议: Raft协议是用来解决分布式系统一致性问题的协议。 Raft协议描述的节点共有三种状态:Leader, Follower, Candidate。

任期term :Raft协议将时间切分为一个个的Term(任期),可以认为是一种“逻辑时间”。

1,Raft采用心跳机制触发Leader选举

触发选举之后,所有的Sentinel节点都变成Follower节点,且任期term皆为0.

2,节点之间的相互通信

节点之间会相互发送RequestVote或者AppendEntries消息,如果有节点接收到了RequestVote或者AppendEntries消息,就会保持自己的Follower身份。

节点如果一段时间内没收到AppendEntries,在该节点的超时时间内还没发现Leader,Follower就 会转换成Candidate,自己开始竞选Leader。

转变成Candidate,首先会对自己的任期term +1 ,然后启动一个新的定时器,给自己投票,然后像其他的所有的节点发送RequestVote消息等待他们的投票

如果在计时器超时前,节点收到多数节点的同意投票,就转换成Leader。同时向所有其他节点发送 AppendEntries,告知自己成为了Leader。

注意任期内的限制:每个节点在一个任期当中都只能投一次票,只能参与一次同意Leader的选票。

3,故障转移

选举出Sentinel Leader之后,它会将失效 Master 的其中一个 Slave 升级为新的 Master , 并让失效 Master 的其他 Slave 改为复制新的 Master ;

当客户端试图连接失效的 Master 时,集群也会向客户端返回新 Master 的地址,使得集群可以使 用现在的 Master 替换失效 Master 。

Master 和 Slave 服务器切换后, Master 的 redis.conf 、 Slave 的 redis.conf 和 sentinel.conf 的配置文件的内容都会发生相应的改变,即Master 主服务器的 redis.conf 配置文件中会多一行 replicaof 的配置, sentinel.conf 的监控目标会随之调换

4,关于主服务器的选择

  • 1. 过滤掉主观下线的节点
  • 2. 选择slave-priority最高的节点,如果由则返回没有就继续选择
  • 3. 选择出复制偏移量最大的系节点,因为复制偏移量越大则数据复制的越完整,如果由就返回了,没 有就继续
  • 4. 选择run_id最小的节点,因为run_id越小说明重启次数越少

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值