2024年最全三分钟带你入门-redis-高可用架构之哨兵,美团优选java面试

最后

学习视频:

大厂面试真题:

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

// 完成故障转移之后,最多多少个从服务器可以同时发起数据复制,数字越小,说明完成全部从服务数据复制的时间越长
// 数字越大,对主服务器的压力就变大了
sentinel parallel-syncs mymaster 1
// 故障转移超时时间
sentinel failover-timeout mymaster 180000

对于每个 Sentinel 实例配置除了 port 和 logfile 不同之外,其他配置项都是一样的。修改好配置后,我们可以使用 ./redis-sentinel sentinel.conf 命令来启动哨兵,命令跟 redis 实例启动差不多,因为哨兵也是 redis 实例,所以我们可以使用 ./redis-cli -p 26379 info sentinel 命令查看当前的哨兵信息,如下图所示:

哨兵信息

问题:如何在只配置 master 服务器的情况下,发现从服务器和其他 Sentinel ?

从服务器的发现,Sentinel 可以通过询问主服务器来获取从服务器的信息,对于发现其他 Sentinel 节点,则通过发布与订阅功能实现,通过向频道 sentinel:hello 发送信息来实现的,主要有以下两步:

1、每个 Sentinel 每 2 秒会通过发布与订阅功能向所有的主服务和从服务器的 sentinel:hello 频道发送一条信息, 信息中包含了 Sentinel 的 IP 地址、端口号和运行 ID (runid)

2、每个 Sentinel 都订阅了被它监视的所有主服务器和从服务器的 sentinel:hello 频道, 查找之前未出现过的 sentinel (looking for unknown sentinels)。当一个 Sentinel 发现一个新的 Sentinel 时, 它会将新的 Sentinel 添加到一个列表中, 这个列表保存了 Sentinel 已知的, 监视同一个主服务器的所有其他 Sentinel

哨兵故障转移原理

故障转移是哨兵的主要工作,这背后的实现逻辑也是非常的复杂,具体的实现逻辑还请查看相关书籍,我对哨兵的故障转移总结了以下三点:

1、监听服务器

每个 Sentinel 节点每隔 1 秒对主节点、从节点、其他 Sentinel 节点发送 ping 命令做心跳检测,来判断服务器的状态。

节点也会对 Sentinel 进行相应的回复,在这些回复中,以下三种回复是有效回复:

  • 返回 +PONG
  • 返回 -LOADING
  • 返回 -MASTERDOWN

如果节点在哨兵配置文件设置的 master-down-after-milliseconds 选项的值内,一直没有哪怕一次有效回复,那么 Sentinel 会把该服务器标记为下线状态,我们把这种下线称为主观下线,也就是说只有这个 sentinel 认为该服务器是下线状态。

如果被主观下线的服务器是主服务器时,sentinel 为了确认这个主服务器是否真的下线,该 Sentinel 会向其他的同样监听主服务器的 Sentinel 进行询问,看他们是否也认为主服务器进入下线状态,当有足够多的 Sentinel 都认为主服务器下线时,该 Sentinel 会将主服务器判断为客观下线,这是真正的下线了,并且会对它进行故障转移操作。

2、选举 Sentinel 节点完成转移任务

故障转移并不是所有的 sentinel 共同完成,而是选举出一台 sentinel 节点作为领导者来完成这次故障转移,所以当主服务器被标记为客观下线时,sentinel 之间就会通过 Raft 算法选举出一个领导者来完成故障转移工作。redis 选举领头的 sentinel 的规则和方法大致如下:

  • 所有在线的 sentinel 都有资格被选为领导者,也就是说每个 sentinel 都有成为领导者的机会
  • 当 sentinel 标记主服务器为主观下线时,会向其他 Sentinel 节点发送 sentinel is-master-down-by-addr 命令, 要求将自己设置为领导者
  • 收到命令的 Sentinel 节点,采用先到先得的规则,如果没有同意过其他 Sentinel 节点的 sentinel is-master-down-by-addr 命令,将同意该请求,否则拒绝
  • 如果该 Sentinel 节点发现自己的票数已经超过半数,那么它将成为领导者
  • 如果在规定时间内,没有选举出 sentinel 领导者,那么将在一段时间后再次选举,知道选出 sentinel 领导者为止。

3、选举新 master 服务器完成故障转移

选举出来的 sentinel 领导者将完成剩下的故障转移工作,故障转移主要有以下三步:

1、挑选出新的主服务器

在已下线的主服务器的所有从服务器中,挑选出一个从服务器,并将其转换为主服务器,选择新的主服务器的规则如下:

  • 在失效主服务器属下的从服务器当中, 那些被标记为主观下线、已断线、或者最后一次回复 PING 命令的时间大于五秒钟的从服务器都会被淘汰
  • 在失效主服务器属下的从服务器当中, 那些与失效主服务器连接断开的时长超过 down-after 选项指定的时长十倍的从服务器都会被淘汰
  • 在经历了以上两轮淘汰之后剩下来的从服务器中, 选出复制偏移量(replication offset)最大的那个从服务器作为新的主服务器;如果复制偏移量不可用, 或者从服务器的复制偏移量相同, 那么带有最小运行 ID 的那个从服务器成为新的主服务器

最后

很多程序员,整天沉浸在业务代码的 CRUD 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。

我把私藏的这套并发体系的笔记和思维脑图分享出来,理论知识与项目实战的结合,我觉得只要你肯花时间用心学完这些,一定可以快速掌握并发编程。

不管是查缺补漏还是深度学习都能有非常不错的成效,需要的话记得帮忙点个赞支持一下

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

需要这份系统化的资料的朋友,可以点击这里获取**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值