Redis 可用看懂是被广泛使用的基础软件之一,对于架构师和运维人员来说,原理了解 Redis 可用看懂的高可用方案和背后的原理,是原理必备的基础知识。
本文作者深入分析了 Redis 可用看懂高可用的方方面面,并且做了有效总结,原理相信对广大读者可以起到很好的可用看懂领路作用。
Redis 原理中为了实现高可用采用了如下两个方式:
主从复制
Redis 中主从节点复制数据有全量复制和部分复制之分。
旧版本全量复制功能的实现
全量复制使用 Snyc 命令来实现,其流程是:
旧版本全量复制功能,其***的问题是从服务器断线重连时,即便在从服务器上已经有一部分数据了,也需要进行全量复制,这样做的效率很低,于是新版本的 Redis 在这部分做了改进。
新版本全量复制功能的实现
新版本 Redis 使用 Psync 命令来代替 Sync 命令,该命令既可以实现完整全同步也可以实现部分同步。
复制偏移量
执行复制的双方,主从服务器,分别会维护一个复制偏移量:
主服务器每次向从服务器同步了 N 字节数据之后,将修改自己的复制偏移量 +N。
从服务器每次从主服务器同步了 N 字节数据之后,将修改自己的复制偏移量 +N。
复制积压缓冲区
主服务器内部维护了一个固定长度的先进先出队列做为复制积压缓冲区,其默认大小为 1MB。
在主服务器进行命令传播时,不仅会将写命令同步到从服务器,还会将写命令写入复制积压缓冲区。
服务器运行 ID
每个 Redis 服务器,都有其运行 ID,运行 ID 由服务器在启动时自动生成,主服务器会将自己的运行 ID 发送给从服务器,而从服务器会将主服务器的运行 ID 保存起来。
从服务器 Redis 断线重连之后进行同步时,就是根据运行 ID 来判断同步的进度:
Psync 命令流程
有了前面的准备,下面开始分析 Psync 命令的流程:
前面两种情况主服务器收到 Psync 命令之后,会出现以下三种可能:
其中,runid 是当前主服务器运行 id,而 offset 是当前主服务器的复制偏移量。
哨兵机制概述
Redis 使用哨兵机制来实现高可用的大概工作原理是:
以上将 Redis 节点分为两类:
以上是大体的流程,这个流程需要解决以下几个问题:
以下来逐个回答这些问题。
三个监控任务
哨兵节点通过三个定时监控任务监控 Redis 数据节点的服务可用性。
①info 命令
每隔 10 秒,每个哨兵节点都会向主、从 Redis 数据节点发送 info 命令,获取新的拓扑结构信息。
Redis 拓扑结构信息包括了:
这样,哨兵节点就能从 info 命令中自动获取到从节点信息,因此那些后续才加入的从节点信息不需要显式配置就能自动感知。
②向 __sentinel__:hello 频道同步信息
每隔 2 秒,每个哨兵节点将会向 Redis 数据节点的 __sentinel__:hello 频道同步自身得到的主节点信息以及当前哨兵节点的信息。
由于其他哨兵节点也订阅了这个频道,因此实际上这个操作可以交换哨兵节点之间关于主节点以及哨兵节点的信息。
这一操作实际上完成了两件事情:
③向数据节点做心跳探测
每隔 1 秒,每个哨兵节点向主、从数据节点以及其他 Sentinel 节点发送 Ping 命令做心跳探测,这个心跳探测是后续主观判断数据节点下线的依据。
主观下线和客观下线
①主观下线
上面三个监控任务中的第三个探测心跳任务,如果在配置的 down-after-milliseconds 之后没有收到有效回复,那么就认为该数据节点“主观下线(sdown)”。
为什么称为“主观下线”?因为在一个分布式系统中,有多个机器在一起联动工作,网络可能出现各种状况,仅凭一个节点的判断还不足以认为一个数据节点下线了,这就需要后面的“客观下线”。
②客观下线
当一个哨兵节点认为主节点主观下线时,该哨兵节点需要通过”sentinel is-master-down-by addr”命令向其他哨兵节点咨询该主节点是否下线了,如果有超过半数的哨兵节点都回答了下线,此时认为主节点“客观下线”。
选举哨兵***
当主节点客观下线时,需要选举出一个哨兵节点做为哨兵***,以完成后续选出新的主节点的工作。
这个选举的大体思路是:
可以看到,这个选举***的流程很像 Raft 中选举 Leader 的流程。
选出新的主节点
在剩下的 Redis 从节点中,按照以下顺序来选择新的主节点:
提升新的主节点
选择了新的主节点之后,还需要***的流程让该节点成为新的主节点:
作者:codedump
简介:codedump.info 博主,多年从事互联网服务器后台开发工作。可访问作者博客 https://www.codedump.info 更多文章。
责任编辑:武晓燕 来源: 高可用架构 Redis高可用数据
(责任编辑:综合)
神火股份:3月23日融资净偿还37.10万元 当前融资余额为6.29亿元
节能元件(08231.HK)年度由亏转盈64.6万美元 每股盈利0.04美仙
每日产品辣评:重量8g售价4万美元,比黄金还贵几十倍的东西是什么鬼?
央行上海总部:10月人民币贷款增加357亿元 住户部门贷款增加202亿元