Java笔试面试

《Redis开发与运维》学习笔记--哨兵(Redis Senti

2018-10-27  本文已影响27人  小北觅

本文是《Redis开发与运维》的学习笔记。同时参考了Redis中文网。
注:本文不去介绍如何搭建Redis Sentinel。

Redis 的 主从复制 模式下,一旦 主节点 由于故障不能提供服务,需要手动将 从节点 晋升为 主节点,同时还要通知 客户端 更新 主节点地址,这种故障处理方式从一定程度上是无法接受的。Redis 2.8 以后提供了 Redis Sentinel 哨兵机制 来解决这个问题。

一、Redis高可用概述

在介绍哨兵之前,首先从宏观角度回顾一下Redis实现高可用相关的技术。它们包括:持久化、复制、哨兵和集群,其主要作用和解决的问题是:

二、Redis Sentinel的基本概念

Redis Sentinel 是 Redis 高可用 的实现方案。Sentinel 是一个管理多个 Redis 实例的工具,它可以实现对 Redis 的 监控、通知、自动故障转移。下面先对 Redis Sentinel 的 基本概念 进行简单的介绍。

2.1架构

如图所示,Redis 的 主从复制模式 和 Sentinel 高可用架构 的示意图:

其中有哨兵节点和数据节点:

2.2 深入Redis Sentinel架构

本节更深入的介绍Redis Sentinel架构。其实每个哨兵节点除了监视数据节点外,还会监视其他的哨兵节点,如下图所示:

Redis官方文档对于哨兵功能的描述:

三、实现原理

这部分介绍哨兵的实现原理,包括:三个定时任务,主观下线和客观下线,Sentinel领导者选举,故障转移。

3.1三个定时任务

每个哨兵节点维护了3个定时任务。定时任务的功能分别如下:通过向主从节点发送info命令获取最新的主从结构;通过发布订阅功能获取其他哨兵节点的信息;通过向其他节点发送ping命令进行心跳检测,判断是否下线。

3.2 主观下线与客观下线

主观下线:在心跳检测的定时任务中,如果其他节点超过一定时间没有回复,哨兵节点就会将其进行主观下线。顾名思义,主观下线的意思是一个哨兵节点“主观地”判断下线;与主观下线相对应的是客观下线。

客观下线:哨兵节点在对主节点进行主观下线后,会通过sentinel is-master-down-by-addr命令询问其他哨兵节点该主节点的状态;如果判断主节点下线的哨兵数量达到一定数值,则对该主节点进行客观下线。

3.3领导者Sentinel选举

当主节点被判断客观下线以后,各个哨兵节点会进行协商,选举出一个领导者哨兵节点,并由该领导者节点对其进行故障转移操作。

监视该主节点的所有哨兵都有可能被选为领导者,选举使用的算法是Raft算法;Raft算法的基本思路是先到先得:即在一轮选举中,哨兵A向B发送成为领导者的申请,如果B没有同意过其他哨兵,则会同意A成为领导者。选举的具体过程这里不做详细描述,一般来说,哨兵选择的过程很快,谁先完成客观下线,一般就能成为领导者。

3.4 故障转移

选举出的领导者哨兵,开始进行故障转移操作,该操作大体可以分为3个步骤:

在从节点中选择新的主节点:选择的原则是,首先过滤掉不健康的从节点;然后选择优先级最高的从节点(由slave-priority指定);如果优先级无法区分,则选择复制偏移量最大的从节点;如果仍无法区分,则选择runid最小的从节点。
更新主从状态:通过slaveof no one命令,让选出来的从节点成为主节点;并通过slaveof命令让其他节点成为其从节点。
将已经下线的主节点(即6379)设置为新的主节点的从节点,当6379重新上线后,它会成为新的主节点的从节点。

3.5过程总结

所以整个的流程大约是如下:

参考资料:
https://juejin.im/post/5b7d226a6fb9a01a1e01ff64
https://www.cnblogs.com/kismetv/p/9609938.html
《Redis开发与运维》
《Redis设计与实现》

上一篇下一篇

猜你喜欢

热点阅读