Redis中的哨兵机制
Posted qq_34132502
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis中的哨兵机制相关的知识,希望对你有一定的参考价值。
主库挂了,如何不间断服务?
这时会遇到三个问题:
- 主库真的挂了么
- 该选择哪个从库作为主库
- 怎么把新主库的相关信息通知给主库和客户端
采用哨兵机制
哨兵机制基本流程
哨兵其实就是一个运行在特殊模式的一个Redis进程。负责三个任务:监控、选主、通知。
监控
哨兵会周期性的给所有主从库发送ping命令,如果从库不通,则将其标记为“主观下线”;而如果是主库不通,则不可以这么武断。因为如果发生误判,启动了主从切换,后续的选主和通知操作都会带来额外的计算和通信开销。如果检测的是从库,那么,哨兵简单地把它标记为“主观下线”就行了,因为从库的下线影响一般不太大,集群的对外服务不会间断。
所以采用哨兵集群方式减少误判
如果投票下线的占多数则为“客观下线”
选主
筛选 + 打分
筛选:当前在线状态 + 之前的网络连接状态。有一个不合格则被筛选出去
打分:优先级(根据如内存大小等事先设定) + 与旧主库同步程度 + ID号大小(小的得分高)
通知
哨兵会把新主库的连接信息发给其他从库,让它们执行 replicaof 命令,和新主库建立连接,并进行数据复制。同时,哨兵会把新主库的连接信息通知给客户端,让它们把请求操作发到新主库上。
如果一个哨兵挂了,主从库还能进行切换么?
当然可以。实际上,一旦多个实例组成了哨兵集群,即使有哨兵实例出现故障挂掉了,其他哨兵还能继续协作完成主从库切换的工作。
那么哨兵之间是如何通信的?
基于 pub/sub 机制的哨兵集群组成
pub/sub
机制,也就是发布 / 订阅机制。
主从集群中,主库上有一个名为__sentinel__:hello
的频道,不同哨兵就是通过它来相互发现,实现互相通信的。只有订阅了同一个频道的应用,才能通过发布的消息进行信息交换。
哨兵只要和主库建立起了连接,就可以在主库上发布消息了,比如说发布它自己的连接信息(IP 和端口)。同时,它也可以从主库上订阅消息,获得其他哨兵发布的连接信息。当多个哨兵实例都在主库上做了发布和订阅操作后,它们之间就能知道彼此的 IP 地址和端口。
哨兵除了彼此之间建立起连接形成集群外,还需要和从库建立连接。
这是由哨兵向主库发送INFO
命令来完成的。主库接受到这个命令后,就会把从库列表返回给哨兵。接着,哨兵就可以根据从库列表中的连接信息,和每个从库建立连接,并在这个连接上持续地对从库进行监控。
通过 pub/sub 机制,哨兵之间可以组成集群,同时,哨兵又通过 INFO 命令,获得了从库连接信息,也能和从库建立连接,并进行监控了。
基于 pub/sub 机制的客户端事件通知
但是,哨兵不能只和主、从库连接。因为,主从库切换后,客户端也需要知道新主库的连接信息,才能向新主库发送请求操作。所以,哨兵还需要完成把新主库的信息告诉客户端这个任务。
每个哨兵实例也提供 pub/sub 机制,客户端可以从哨兵订阅消息。哨兵提供的消息订阅频道有很多,不同频道包含了主从库切换过程中的不同关键事件。
如:
所有实例进入客观下线状态的事件
SUBSCRIBE +odown
订阅所有的事件
PSUBSCRIBE *
由哪个哨兵执行主从切换?
也是一个投票仲裁的过程
任何一个实例只要自身判断主库“主观下线”后,就会给其他实例发送 is-master-down-by-addr 命令。接着,其他实例会根据自己和主库的连接情况,做出 Y 或 N 的响应,Y 相当于赞成票,N 相当于反对票。
在投票过程中,任何一个想成为 Leader 的哨兵,要满足两个条件:第一,拿到半数以上的赞成票;第二,拿到的票数同时还需要大于等于哨兵配置文件中的 quorum 值。
以上是关于Redis中的哨兵机制的主要内容,如果未能解决你的问题,请参考以下文章