redis高可用-哨兵模式原理篇

这篇具有很好参考价值的文章主要介绍了redis高可用-哨兵模式原理篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上一篇,我们介绍了哨兵模式搭建
如果你跟着文档一步步的进行了安装,我相信你可能会有一些疑问。

1、主节点被kill,下线。哨兵是怎么知道的呢?有没有可能误判

哨兵和主节点之前有定时的通信,哨兵每隔1秒就会给主节点发送一个ping消息,同时主节点要给哨兵回复一个pong消息
下面我们使用tcpdump命令抓包看一下这个ping、pong消息。

#监听eth0网卡的tcp通信,将监听结果输出到sentinel.cap文件
tcpdump -i eth0 -w /tmp/sentinel.cap

然后我们将文件下载到本地(可以使用sz命令,如:sz /tmp/sentinel.cap)
之后,需要下载cap文件分析工具wireshark,wireshark下载
下载之后,打开我们下载到本地的sentinel.cap文件
redis高可用-哨兵模式原理篇
可以看到,36891端口给6081端口(主机端口)发了很多消息,我们找一条看看都发了点啥
选中消息,右键—>Follow—>TCP Stream
redis高可用-哨兵模式原理篇
报文里有很多这个消息片段,这个是redis的RESP协议内容
红色部分是请求,蓝色部分是响应
*1:该请求是一个数组,数组中有1个元素
$4:数组的内容长度是4字节
PING:请求内容是PING
+PONG:+代表这是一个响应消息,PONG是响应内容
所以以上tcp消息的意思就是:哨兵给主节点发送了一个PING,主节点给哨兵回复了一个PONG
如果在down-after-milliseconds时间内,主节点没有回复PONG消息,哨兵就会认为主节点已经下线
如果哨兵和主节点之间有网络延迟或者其他原因,是有可能导致误判的。
实际上,当一个哨兵发现主节点通信超时后,它自己会先标记主观下线,然后会给其他哨兵发送is-master-down-by-addr命令,让其他哨兵检查自己和主节点之间的连接情况。如果超过quorum个哨兵反馈主节点连接失败,此时会将主节点置为客观下线,意思是:主节点下线已经是一个客观事实。通过这种方式,就可以避免哨兵误判的情况

2、主节点被kill,哨兵如何选择一个新主节点?

这个过程可以理解为"筛选+打分"
筛选:筛选从节点的网络状态。依据是:和主节点的断连时间超过down-after-milliseconds * 10,意思是:和主节点断连超过10次,说明这个从节点的网络状况不好,不适合作为主节点。
打分:
1)、是否给从节点设置了优先级,如果设置了优先级,此时会优先将这台从机选为新的主节点。可以通过slave-priority参数来设置优先级,越小的数值代表优先级越高。
2)、从机的复制状态,哪一台更接近主机。复制状态的意思是:每一台从机在和主机进行数据同步时,都会有一个slave_repl_offset,master也会有一个master_repl_offset。最接近master_repl_offset的从机得分最高,会直接被选为新的主节点
3)、如果优先级和复制状态都相同,此时会比较实例的id号,每台实例都会有一个id号,哪台从机的id号最小,就会被选为新的主机。

3、选择好了新主节点,3个哨兵,如何确定由哪个哨兵完成主从切换呢?

确定由哪个哨兵完成主从切换,这其中涉及到了Raft算法,选举出的leader进行主从切换。当一台哨兵节点发现主节点宕机后,会立刻通知其他哨兵节点该消息,同时请求成为leader进行主从切换。其他哨兵收到该消息后,会对该请求进行投票。
如果一个哨兵想成为leader,至少需要满足两个条件。
1)、拿到半数以上的赞成票
2)、赞成票的票数需要大于等于配置文件中的quorum值。
我们这个例子,哨兵数量是3,所以一个哨兵想成为leader,拿到2票赞成就可以了。
投票过程如下:
s1发现主节点下线,执行is-master-down-by-addr命令,询问其他哨兵节点对于主节点的连接状态判断,并请求成为领导者。此时s2和s3可能并没有发现主节点失连,他们就会给s1投票,同意s1成为领导者。当s2和s3判断主节点主观下线后,此时他们再想成为领导者已经不行了,因为已经把票投给了s1,每个哨兵只有一票
实际的选举过程会很简单,基本上哪个哨兵先观察到主观下线,那它就是领导者

4、主从切换完成,客户端如何感知新的主节点?

客户端可以订阅+switch-master频道来监听主节点的变化,如果主节点宕机,哨兵领导者选出了新的主节点,会向这个频道发送消息告知客户端新的主节点地址。我们测试一下。
登录一台哨兵节点。订阅+switch-master频道

127.0.0.1:26001> subscribe +switch-master

然后kill掉主节点,此时会收到消息。如下:
redis高可用-哨兵模式原理篇主节点已经从6082改为6081,此时客户端就感知到了主节点的变化

5、哨兵配置文件中,没有配置其他哨兵的ip、端口,哨兵之间是怎么相互发现并组成集群的呢?

是通过pubsub机制,哨兵都会订阅一个__sentinel__:hello的频道,当一个哨兵启动后,会将自己的ip和端口发送到这个频道,此时其他哨兵就会得知一个新的哨兵启动了,就可以得到这个哨兵的地址,并和其进行网络连接

6、哨兵配置文件中只配置了主节点的ip地址,哨兵是怎么知道从节点ip地址的呢?

通过给主机发送info命令,获取从机的ip地址,info命令中有一个replication模块,这个模块里记录了所有从机的地址
redis高可用-哨兵模式原理篇

7、3个哨兵节点,最多允许宕几台?

最多允许宕1台,为什么呢?因为哨兵领导者选举时,想成为领导者的实例需要获得一半以上的赞成票,比如3台哨兵,就需要获得3/2 + 1 = 2,获得2票赞成才可以,宕掉一台,2/2 + 1 = 2,还可以获得2票赞成,如果只剩一台,就无法成为领导者了

------切换过程总结

选择新的主节点、切换主节点这些操作都是哨兵领导者来完成,所以我们根据哨兵领导者的日志,来串一下整个主从切换的流程文章来源地址https://www.toymoban.com/news/detail-409200.html

#对6081节点主观下线
27733:X 06 Apr 2023 16:20:37.028 # +sdown master mymaster xx.xx.xx.xx 6081
#对6081节点客观下线
27733:X 06 Apr 2023 16:20:37.086 # +odown master mymaster xx.xx.xx.xx 6081 #quorum 2/2
#更新纪元,这个纪元的作用是为了保证redis集群的一致性
27733:X 06 Apr 2023 16:20:37.086 # +new-epoch 32
#尝试对6081故障转移
27733:X 06 Apr 2023 16:20:37.086 # +try-failover master mymaster xx.xx.xx.xx 6081
#选举哨兵领导者
27733:X 06 Apr 2023 16:20:37.089 # +vote-for-leader e42e7bf1b00bd966376a225f95c583026abe3e12 32
27733:X 06 Apr 2023 16:20:37.098 # 67a03474bea5aa6b8e1324383aabfb404288009f voted for e42e7bf1b00bd966376a225f95c583026abe3e12 32
#选举主节点
27733:X 06 Apr 2023 16:20:37.160 # +elected-leader master mymaster xx.xx.xx.xx 6081
#在从节点中挑选新的主节点
27733:X 06 Apr 2023 16:20:37.160 # +failover-state-select-slave master mymaster xx.xx.xx.xx 6081
#将6082作为新的主节点
27733:X 06 Apr 2023 16:20:37.243 # +selected-slave slave xx.xx.xx.xx:6082 xx.xx.xx.xx 6082 @ mymaster xx.xx.xx.xx 6081
#向6082发送slaveof no one命令,命令其成为新的主节点
27733:X 06 Apr 2023 16:20:37.243 * +failover-state-send-slaveof-noone slave xx.xx.xx.xx:6082 xx.xx.xx.xx 6082 @ mymaster xx.xx.xx.xx 6081
#等待6082成为新的主节点
27733:X 06 Apr 2023 16:20:37.333 * +failover-state-wait-promotion slave xx.xx.xx.xx:6082 xx.xx.xx.xx 6082 @ mymaster xx.xx.xx.xx 6081
#6082成为新的主节点
27733:X 06 Apr 2023 16:20:38.069 # +promoted-slave slave xx.xx.xx.xx:6082 xx.xx.xx.xx 6082 @ mymaster xx.xx.xx.xx 6081
#重新配置主从关系
27733:X 06 Apr 2023 16:20:38.069 # +failover-state-reconf-slaves master mymaster xx.xx.xx.xx 6081
#命令6083节点复制新的主节点
27733:X 06 Apr 2023 16:20:38.129 * +slave-reconf-sent slave xx.xx.xx.xx:6083 xx.xx.xx.xx 6083 @ mymaster xx.xx.xx.xx 6081
#6083节点正在重新配置为6082的从节点,但是同步过程尚未完成
27733:X 06 Apr 2023 16:20:39.093 * +slave-reconf-inprog slave xx.xx.xx.xx:6083 xx.xx.xx.xx 6083 @ mymaster xx.xx.xx.xx 6081
#6083节点完成对6082的同步
27733:X 06 Apr 2023 16:20:39.093 * +slave-reconf-done slave xx.xx.xx.xx:6083 xx.xx.xx.xx 6083 @ mymaster xx.xx.xx.xx 6081
#故障转移顺利完成
27733:X 06 Apr 2023 16:20:39.143 # +failover-end master mymaster xx.xx.xx.xx 6081
#向+switch-master频道发布主节点的切换消息
27733:X 06 Apr 2023 16:20:39.143 # +switch-master mymaster xx.xx.xx.xx 6081 xx.xx.xx.xx 6082

到了这里,关于redis高可用-哨兵模式原理篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从小白到大神之路之学习运维第41天---第三阶段---Redis高可用集群(redis 的主从复制、redis的哨兵模式操作)

    第三阶段基础 时  间:2023年6月15日 参加人:全班人员 内  容: Redis高可用集群 目录 一、redis主从复制原理介绍 主从复制特点: 主从复制实现原理: 二、主从复制实现操作(多机实例实现)   前提配置: 主库操作: 从库一操作: 从库二操作: 主库变化: 验  证: 三、

    2024年02月09日
    浏览(63)
  • Redis集群(分布式缓存):详解持久化、主从同步原理、哨兵机制、Cluster分片集群,实现高并发高可用

            单机式Redis存在以下问题,因此需要Redis集群化来解决这些问题        Redis数据快照,简单来说就是 把内存中的所有数据都记录到磁盘中 。当Redis实例故障重启后,从 磁盘读取快照文件,恢复数据 。快照文件称为RDB文件,默认是保存在当前运行目录。     (1)

    2024年02月08日
    浏览(59)
  • Redis高可用:哨兵机制(Redis Sentinel)详解

    目录 1.什么是哨兵机制(Redis Sentinel) 2.哨兵机制基本流程 3.哨兵获取主从服务器信息 4.多个哨兵进行通信 5.主观下线和客观下线 6.哨兵集群的选举 7.新主库的选出 8.故障的转移 9.基于pub/sub机制的客户端事件通知 Redis Sentinel,即Redis哨兵,在Redis 2.8版本开始引入。哨兵的核心

    2024年02月12日
    浏览(42)
  • Redis高可用主从复制、哨兵、集群

    在Redis中,实现高可用的技术主要包括持久化、主从复制、哨兵和集群。 1、主从复制 主从复制时高可用Redis的基础,哨兵和cluster都是在主从复制基础上实现高可用的,主从复制主要实现了数据的多级备份,以及对与读操作的负载均衡和简单的故障恢复。 缺陷:①故障恢复无

    2024年02月12日
    浏览(51)
  • Redis高可用(主从复制,哨兵,集群)

    主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。 默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从

    2024年02月07日
    浏览(35)
  • 【Redis】高可用之二:哨兵(sentinel)

     本文是Redis系列第5篇,前4篇欢迎移步  【Redis】不卡壳的 Redis 学习之路:从十大数据类型开始入手_AQin1012的博客-CSDN博客 关于Redis的数据类型,各个文章总有些小不同,我们这里讨论的是Redis 7.0,为确保准确,我们直接看官网。 https://blog.csdn.net/aqin1012/article/details/130365083 【

    2024年02月12日
    浏览(66)
  • Redis 高可用和优化(主从复制、哨兵、集群)

    目录 一:Redis 高可用 二: Redis 持久化 1、持久化的功能 2、Redis 提供两种方式进行持久化 3、 RDB 持久化  (1)触发条件 (1.1)手动触发 (1.2)自动触发 (1.3)其他自动触发机制 4、执行流程 5、 启动时加载 6、AOF 持久化 (1)开启AOF 7、执行流程 (1)命令追加(append) (

    2024年02月12日
    浏览(40)
  • Redis高可用之主从复制、哨兵、cluster集群

    主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。 默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从

    2024年02月06日
    浏览(41)
  • DAY 68 redis高可用的主从复制、哨兵、cluster集群

    在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。 但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服务(如主从分离、快速容灾技术),还需要考虑数据容量的扩展、数据安

    2024年02月06日
    浏览(53)
  • 【Redis】Redis哨兵模式

    Redis主从模式当主服务器宕机后,需要手动把一台从服务器切换为主服务器,需要人工干预费事费力,为了解决这个问题出现了哨兵模式。 哨兵模式是是一个管理多个 Redis 实例的工具,它可以实现对 Redis 的监控、通知、自动故障转移,是Redis实现高可用的方案。哨兵模式能够

    2024年02月12日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包