Redis高可用-Redis Sentinel

0 Redis主从复制

使用docker搭建主从复制

1 Redis Sentinel解决了什么问题

1.1 主从复制的问题

Redis的主从复制可以把主节点的数据同步到从节点,从节点可以起到两个作用:

  1. 作为主节点的备份,当主节点宕机的时候,可以代替主节点,一定程度上确保数据不丢失
  2. 因为从节点可以进行读操作,因此可以加大整个Redis的读能力

但是一旦主节点宕机,即需要进行手动干预使其他成为主节点

1.2 Redis Sentinel的高可用

Redis Sentinel包括若干个Sentinel节点和Redis数据节点,每个Sentinel节点会数据节点和其余Sentinel节点进行监控,当它发现节点不可达时,会对节点做下线标识。如果被标识的是主节点,它还会和其他Sentinel节点进行“协商”,当大多数Sentinel节点都认为主节点不可达时。他会选举出一个Sentinel节点来完成自动故障转移的工作,同时会将这个变化实时通知给Redis应用方。整个过程完全自动的,不需要人工介入,所以这套方案很有效地解决高可用问题。

 

2 部署Redis Sentinel

使用docker搭建Redis Sentinel

3 Redis Sentinel实现的背后原理

3.1 三个定时监控任务

3.1.1 10秒任务

每隔10秒每个Sentinel节点会向主节点和从节点发送info命令获取最新的拓补结构

这个定时任务主要作用有:

  • 通过向主节点执行info获取从节点信息,因此Sentinel不需要显示配置从节点内容,当有新节点的时候能立刻感知出来
  • 节点不可达或者故障转移后,可以通过info命令来更新拓补信息

3.1.2 2秒任务

每隔2秒,每个Sentinel节点会向Redis数据节点的_sentinel_:hello频道发送Sentinel节点对于主节点的判断以及当前Sentinel节点的信息,同时Sentinel集群中其他节点都会订阅该频道,因此完成以下工作:

  • 发现新的Sentinel节点,通过订阅_sentinel_:hello从而发现新增的Sentinel节点
  • 获取其他Sentinel节点的主节点状态,作为后续客观下线的依据

 

3.1.3 1秒任务

每隔1秒,每个Sentinel节点会向主节点、从节点、其余Sentinel节点发送一条ping命令做一次心跳检测,来确认这些节点是否可达,用来判断节点失败的重要依据。

 

3.2 下线

3.2.1 主观下线

当在每1秒的定时任务中当节点在down-after-milliseconds内没进行回复,Sentinel节点将会判定这个节点失败,这个行为称之为主观下线。

从节点、Sentinel节点在主观下线后,没有后续的故障转移操作

3.2.2 客观下线

当Sentinel主观下线的节点时,该节点会通过is-master-down-by-addr命令向其他Sentinel节点询问对主节点的判断,,当超过<quorum>个数,Sentinel节点认为主节点确实有问题,这时该Sentinel节点都对主节点的下线做了同意的判定。

is-master-down-by-addr命令在领导者Sentinel选举中也会使用,有必要介绍一下

sentinel is-master-down-by-addr <ip> <port> <current_epoch> <runid>

ip:主节点IP

port:主节点端口

current_epoch:当前配置纪元(同Raft中的Term)

runid:此参数有种类型,不同类型决定了此API作用的不同

当runid等于“*”时,作用是Sentinel节点交换对主节点下线的判定

当runid等于当前Sentinel节点的runid时,作用是当前Sentinel节点希望目标Sentinel节点同意自己成为领导者的请求 

3.3 领导者Sentinel选举

当主服务节点被客观下线后,就需要进行故障转移替换新的节点,虽然Sentinel会建立一个集群,但实际上完成故障转移只需要一个Sentinel节点即可,所以Sentinel集群会做一个领导者选举工作,选取一个Sentinel节点作为领导者进行故障转移。Redis使用了Raft算法实现领导者选举。

关于Raft算法可以参考我这篇博文:分布式一致性算法-Raft

Redis Sentinel进行领导者选举的大致思路:

  1. 每个在线的Sentinel节点都有资格成为领导者,当确认主节点主观下线的时候,会向其他Sentinel发送is-master-down-by-addr,要求将自己设为领导者。
  2. 收到命令的Sentinel节点,如果没有进行过投票则同意请求,否则拒绝
  3. 如果Sentinel节点发现自己票数已经超过大半数,他将成为领导者
  4. 如果这轮选举没有选出领导者,则继续进行下一轮选举

3.4 故障转移 

通过领导者Sentinel进行故障转移

     1.在从节点列表中选出一个节点作为新的主节点,选择流程如下:

1.过滤:“不健康”(主观下线、断线)、5秒内没有回复过Sentinel节点ping响应、与主节点失联超过down-after-milliseconds*10秒

2.选择slave-priority(从节点优先级)最高的从节点列表,如果存在则选择完毕,不存在则继续

3.选择复制偏移量最大的从节点(复制最完整),如果存在则返回,不存在则继续

4.选择runid最小的从节点

     2.Sentinel领导者节点会对第一步选出来的从节点执行slaveof no one命令让其成为主节点

     3.Sentinel领导者节点会向剩余的从节点发送命令,让他们成为新主节点的从节点,复制规则和parallel-syncs参数有关

     4.Sentinel节点集合会将原来的主节点更新为从节点,并保持对其的关注,当其恢复后命令他去复制新的主节点

3.5 原理关系图

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值