Java知识分享网 - 轻松学习从此开始!    

Java知识分享网

Java1234官方群25:java1234官方群17
Java1234官方群25:838462530
        
SpringBoot+SpringSecurity+Vue+ElementPlus权限系统实战课程 震撼发布        

最新Java全栈就业实战课程(免费)

springcloud分布式电商秒杀实战课程

IDEA永久激活

66套java实战课程无套路领取

锋哥开始收Java学员啦!

Python学习路线图

锋哥开始收Java学员啦!
当前位置: 主页 > Java文档 > Java基础相关 >

Redis Sentinel:如何实现自动化地故障转移? PDF 下载


分享到:
时间:2023-03-17 10:51来源:http://www.java1234.com 作者:转载  侵权举报
Redis Sentinel:如何实现自动化地故障转移? PDF 下载
失效链接处理
Redis Sentinel:如何实现自动化地故障转移? PDF 下载


 
本站整理下载:
提取码:7n6q 
 
 
相关截图:
 
主要内容:

普通的主从复制⽅案下,⼀旦 master 宕机,我们需要从 slave 中⼿动选择⼀个新
的 master,同时需要修改应⽤⽅的主节点地址,还需要命令所有从节点去复制新
的主节点,整个过程需要⼈⼯⼲预。⼈⼯⼲预⼤⼤增加了问题的处理时间以及出
错的可能性。
我们可以借助 Redis 官⽅的 Sentinel(哨兵)⽅案来帮助我们解决这个痛点,实
现⾃动化地故障切换。
建议带着下⾯这些重要的问题(⾯试常问)阅读:
1. 什么是 Sentinel? 有什么⽤?
2. Sentinel 如何检测节点是否下线?主观下线与客观下线的区别?
3. Sentinel 是如何实现故障转移的?
4. 为什么建议部署多个 sentinel 节点(哨兵集群)?
5. Sentinel 如何选择出新的 master(选举机制)?
6. 如何从 Sentinel 集群中选择出 Leader ?
7. Sentinel 可以防⽌脑裂吗?
Sentinel(哨兵) 只是 Redis 的⼀种运⾏模式 ,不提供读写服务,默认运⾏在
26379 端⼝上,依赖于 Redis ⼯作。Redis Sentinel 的稳定版本是在 Redis 2.8 之
后发布的。
Redis 在 Sentinel 这种特殊的运⾏模式下,使⽤专⻔的命令表,也就是说普通模
式运⾏下的 Redis 命令将⽆法使⽤。
通过下⾯的命令就可以让 Redis 以 Sentinel 的⽅式运⾏:
Redis 源码中的 sentinel.conf 是⽤来配置 Sentinel 的,⼀个常⻅的最⼩配置
如下所示:
Redis Sentinel 实现 Redis 集群⾼可⽤,只是在主从复制实现集群的基础下,多
了⼀个 Sentinel ⻆⾊来帮助我们监控 Redis 节点的运⾏状态并⾃动实现故障转
移。
当 master 节点出现故障的时候, Sentinel 会帮助我们实现故障转移,⾃动根据
⼀定的规则选出⼀个 slave 升级为 master,确保整个 Redis 系统的可⽤性。整个
过程完全⾃动,不需要⼈⼯介⼊。
根据 Redis Sentinel 官⽅⽂档的介绍,sentinel 节点主要可以提供 4 个功能:
监控:监控所有 redis 节点(包括 sentinel 节点⾃身)的状态是否正常。
故障转移:如果⼀个 master 出现故障,Sentinel 会帮助我们实现故障转移,
⾃动将某⼀台 slave 升级为 master,确保整个 Redis 系统的可⽤性。
通知 :通知 slave 新的 master 连接信息,让它们执⾏ replicaof 成为新的
master 的 slave。
配置提供 :客户端连接 sentinel 请求 master 的地址,如果发⽣故障转移,
sentinel 会通知新的 master 链接信息给客户端。
Redis Sentinel 本身设计的就是⼀个分布式系统,建议多个 sentinel 节点协作运
⾏。这样做的好处是:
多个 sentinel 节点通过投票的⽅式来确定 sentinel 节点是否真的不可⽤,避
免误判(⽐如⽹络问题可能会导致误判)。
Sentinel ⾃身就是⾼可⽤。
如果想要实现⾼可⽤,建议将哨兵 Sentinel 配置成单数且⼤于等于 3 台。
⼀个最简易的 Redis Sentinel 集群如下所示(官⽅⽂档中的⼀个例⼦),其中:
M1 表示 master,R2、R3 表示 slave;
S1、S2、S3 都是 sentinel;
quorum 表示判定 master 失效最少需要的仲裁节点数。这⾥的值为 2 ,也就
是说当有 2 个 sentinel 认为 master 失效时,master 才算真正失效。
如果 M1 出现问题,只要 S1、S2、S3 其中的两个投票赞同的话,就会开始故障
转移⼯作,从 R2 或者 R3 中重新选出⼀个作为 master。
Redis Sentinel 中有两个下线(Down)的概念:
主观下线(SDOWN) :sentinel 节点认为某个 Redis 节点已经下线了(主观下
线),但还不是很确定,需要其他 sentinel 节点的投票。
客观下线(ODOWN) :法定数量(通常为过半)的 sentinel 节点认定某个
Redis 节点已经下线(客观下线),那它就算是真的下线了。
也就是说,主观下线 当前的 sentinel ⾃⼰认为节点宕机,客观下线是 sentinel 整
体达成⼀致认为节点宕机。
每个 sentinel 节点以每秒钟⼀次的频率向整个集群中的 master、slave 以及其他
sentinel 节点发送⼀个 PING 命令。
如果对应的节点超过规定的时间(down-after-millisenconds)没有进⾏有效回
复的话,就会被其认定为是 主观下线(SDOWN) 。注意!这⾥的有效回复不⼀定
是 PONG,可以是-LOADING 或者 -MASTERDOWN 。
如果被认定为主观下线的是 slave 的话, sentinel 不会做什么事情,因为 slave 下
线对 Redis 集群的影响不⼤,Redis 集群对外正常提供服务。但如果是 master 被
认定为主观下线就不⼀样了,sentinel 整体还要对其进⾏进⼀步核实,确保
master 是真的下线了。
所有 sentinel 节点要以每秒⼀次的频率确认 master 的确下线了,当法定数量
(通常为过半)的 sentinel 节点认定 master 已经下线, master 才被判定为 客观
下线(ODOWN) 。这样做的⽬的是为了防⽌误判,毕竟故障转移的开销还是⽐较
⼤的,这也是为什么 Redis 官⽅推荐部署多个 sentinel 节点(哨兵集群)。
随后, sentinel 中会有⼀个 Leader 的⻆⾊来负责故障转移,也就是⾃动地从
slave 中选出⼀个新的 master 并执⾏完相关的⼀些⼯作(⽐如通知 slave 新的
master 连接信息,让它们执⾏ replicaof 成为新的 master 的 slave)。
如果没有⾜够数量的 sentinel 节点认定 master 已经下线的话,当 master 能对
sentinel 的 PING 命令进⾏有效回复之后,master 也就不再被认定为主观下线,
回归正常。
slave 必须是在线状态才能参加新的 master 的选举,筛选出所有在线的 slave 之
后,通过下⾯ 3 个维度进⾏最后的筛选(优先级依次降低):
1. slave 优先级 :可以通过 slave-priority ⼿动设置 slave 的优先级,优先级越
⾼得分越⾼,优先级最⾼的直接成为新的 master。如果没有优先级最⾼的,
再判断复制进度。
2. 复制进度 :Sentinel 总是希望选择出数据最完整(与旧 master 数据最接
近)也就是复制进度最快的 slave 被提升为新的 master,复制进度越快得分
也就越⾼。
3. runid(运⾏ id) :通常经过前⾯两轮筛选已经成果选出来了新的 master,万
⼀真有多个 slave 的优先级和复制进度⼀样的话,那就 runid ⼩的成为新的
master,每个 redis 节点启动时都有⼀个 40 字节随机字符串作为运⾏ id。
我们前⾯说了,当 sentinel 集群确认有 master 客观下线了,就会开始故障转移
流程,故障转移流程的第⼀步就是在 sentinel 集群选择⼀个 leader,让 leader 来
负责完成故障转移。
如何选择出 Leader ⻆⾊呢?
这就需要⽤到分布式领域的 共识算法 了。简单来说,共识算法就是让分布式系统
中的节点就⼀个问题达成共识。在 sentinel 选举 leader 这个场景下,这些
sentinel 要达成的共识就是谁才是 leader 。
⼤部分共识算法都是基于 Paxos 算法改进⽽来,在 sentinel 选举 leader 这个场景
下使⽤的是 Raft 算法。这是⼀个⽐ Paxos 算法更易理解和实现的共识算法—
Raft 算法。更具体点来说,Raft 是 Multi-Paxos 的⼀个变种,其简化了 Multi-
Paxos 的思想,变得更容易被理解以及⼯程实现。
对于学有余⼒并且想要深⼊了解 Raft 算法实践以及 sentinel 选举 leader 的详细
过程的同学,推荐阅读下⾯这两篇⽂章:
Raft 算法详解
Raft 协议实战之 Redis Sentinel 的选举 Leader 源码解析
还是上⾯的例⼦,如果 M1 和 R2、R3 之间的⽹络被隔离,也就是发⽣了脑裂,
M1 和 R2 、 R3 隔离在了两个不同的⽹络分区中。这意味着,R2 或者 R3 其中⼀
个会被选为 master,这⾥假设为 R2。
但是!这样会出现问题了!!
如果客户端 C1 是和 M1 在⼀个⽹络分区的话,从⽹络被隔离到⽹络分区恢复这段
时间,C1 写⼊ M1 的数据都会丢失,并且,C1 读取的可能也是过时的数据。这
是因为当⽹络分区恢复之后,M1 将会成为 slave 节点。
想要解决这个问题的话也不难,对 Redis 主从复制进⾏配置即可。
下⾯对这两个配置进⾏解释:
min-replicas-to-write 1:⽤于配置写 master ⾄少写⼊的 slave 数量,设
置为 0 表示关闭该功能。3 个节点的情况下,可以配置为 1 ,表示 master 必
须写⼊⾄少 1 个 slave ,否则就停⽌接受新的写⼊命令请求。
min-replicas-max-lag 10 :⽤于配置 master 多⻓时间(秒)⽆法得到从
节点的响应,就认为这个节点失联。我们这⾥配置的是 10 秒,也就是说
master 10 秒都得不到⼀个从节点的响应,就会认为这个从节点失联,停⽌
接受新的写⼊命令请求。
不过,这样配置会降低 Redis 服务的整体可⽤性,如果 2 个 slave 都挂掉,
master 将会停⽌接受新的写⼊命令请求。
什么是 Sentinel?
Sentinel 有什么作⽤?
 

------分隔线----------------------------

锋哥公众号


锋哥微信


关注公众号
【Java资料站】
回复 666
获取 
66套java
从菜鸡到大神
项目实战课程

锋哥推荐