阿肝正传之Redis哨兵机制(一)

前言

Redis主从同步是提升了可用性,从库挂了,还有多个从库可以使用。但是如果主库挂了,该怎么办呢?

这就要提到哨兵机制了。在Redis主从集群中,哨兵机制是实现主从库自动切换的关键机制,有效的解决了主从复制模式下故障转移的问题。

哨兵机制的基本流程

哨兵机制就是一个运行在特殊模式下的Redis进程,主从库实例运行的同时,它在运行。

哨兵主要负责的三个任务:监控、选主和通知。

监控

哨兵在运行时,周期性的会给主库和从库发送PING命令,对应的主库或者从库没有在规定时间内响应,则会标记为“下线状态”。

自动切换

主库挂了之后,哨兵需要从多个从库里,按照一定规则,选举一个从库为主库。

通知

哨兵会将新的主库信息发送给其他从库,让他们执行replicaof命令,和新主库建立连接,并进行数据复制。

同时新的主库信息会通知给客户端,让他们将新的请求发送到新主库上。

主观下线和客观下线

上面我们提到,哨兵进程会通过PING命令检测它和主从库网络的连接状况,用来判断示例的状态。

如果检测的是从库,简单的标记为“主观下线”即可,因为从库下线影响不大,集群对外服务不会间断。

如果检测的是主库,则不能轻易标记为“主观下线”。因为哨兵存在误判的情况,主库其实没有故障。但是一旦开启了主从切换,后续的选主和通知操作都会带来额外的计算和通信开销。

那么如何减少误判呢?

通常会采用多实例组成的集群模式进行部署,也就是哨兵集群。

引入多个哨兵实例一起判断,可以避免单个实例因自身网络状态不好,而导致误判的情况。当大多数的哨兵实例都判断主库为“主观下线”时,主库才会被标记为“客观下线”。遵循原则“少数服从多数”。

如何选择新主库?

这里我们先来看一个流程图:

Redis哨兵选主筛选评分

主要的过程就是筛选和打分。

筛选

保证所选择的从库仍然在线运行,其次还要判断之前的网络连接状态。如何判断呢?有个配置项down-after-milliseconds,是主从库断连的最大连接超时时间。在这个时间内,主从库还没连接上,我们可以认为是断连。如果断连次数超过10次,则认为这个库的网络状况不好,不适合做新主库。

打分

三轮打分,只要某一轮某个库的得分最高,就选定为主库;如果没有,则进行下一轮。

优先级最高的从库得分最高

手动配置slave-priority,给不同的从库设置不同的优先级。根据配置,我们可以给配置更好的从库设置高优先级。

和旧主库同步最近的那个从库作为主库

主库会用master_repl_offset记录当前最新的写操作在repl_backlog_buffer缓冲区中的位置,从库会用slave_repl_offset记录从库当前复制的位置,两者距离最近则评分高。

ID号小的从库得分高

每个示例都会有个ID,这里类似于从库的编号。

Redis在选主库时,有个默认的规定:在优先级和复制进度都一样的情况下,ID最小的库得分最高。

通过以上三步,可以选出新主库。

其他

原文链接:tsmliyun.github.io/redis/%E9%98%BF...

参考资料

极客时间《Redis核心技术与实战》

本作品采用《CC 协议》,转载必须注明作者和本文链接
不积跬步,无以至千里;不积小流,无以成江海
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!