6

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

 2 years ago
source link: https://tsmliyun.github.io/redis/%E9%98%BF%E8%82%9D%E6%AD%A3%E4%BC%A0%E4%B9%8BRedis%E5%93%A8%E5%85%B5%E6%9C%BA%E5%88%B6(%E4%B8%80)/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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最小的库得分最高。

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK