哨兵(Sentinel)是 redis 的高可用性解决方案,前面我们讲的高可构主从复制它是高可用的基础,但是用架单纯的主从复制需要人工介入才能完成故障转移,哨兵可以解决这个问题,哨兵在主从复制情况下,分钟当主节点发生故障时,高可构哨兵可以自动的用架发现故障并且完成故障转移,实现真正的哨兵 redis 高可用。在哨兵集群中,分钟哨兵会监视所有的高可构 redis 服务器和其他 sentinel 节点状态,及时发现故障完成转移,用架从而保证 redis 的哨兵高可用。 哨兵本质也是一个 redis 服务,只是高可构跟普通的 redis 服务提供了不一样的功能。哨兵是用架一个分布式架构,因为你要保证 redis 高可用,亿华云首先需要保证自己高可用,所以如果我们需要搭建哨兵的话,最少需要部署三个实例,最好是奇数个,因为在后续的故障转移中会涉及到投票。 哨兵的配置文件我们可以在 redis 的 GitHub 项目下下载,在项目下有一个叫做 sentinel.conf 的文件,可以使用它作为我们哨兵的配置模板,当然你也可以使用 redis.conf 配置文件,只需要添加哨兵相关配置就好了。 哨兵相关的配置项不多,主要有以下几个配置项: 对于每个 Sentinel 实例配置除了 port 和 logfile 不同之外,其他配置项都是一样的。修改好配置后,我们可以使用 ./redis-sentinel sentinel.conf 命令来启动哨兵,命令跟 redis 实例启动差不多,因为哨兵也是 redis 实例,所以我们可以使用 ./redis-cli -p 26379 info sentinel 命令查看当前的哨兵信息,如下图所示: 哨兵信息 问题:如何在只配置 master 服务器的情况下,发现从服务器和其他 Sentinel ? 从服务器的发现,Sentinel 可以通过询问主服务器来获取从服务器的信息,对于发现其他 Sentinel 节点,则通过发布与订阅功能实现,通过向频道 sentinel:hello 发送信息来实现的,主要有以下两步: 1、香港云服务器每个 Sentinel 每 2 秒会通过发布与订阅功能向所有的主服务和从服务器的 sentinel:hello 频道发送一条信息, 信息中包含了 Sentinel 的 IP 地址、端口号和运行 ID (runid) 2、每个 Sentinel 都订阅了被它监视的所有主服务器和从服务器的 sentinel:hello 频道, 查找之前未出现过的 sentinel (looking for unknown sentinels)。当一个 Sentinel 发现一个新的 Sentinel 时, 它会将新的 Sentinel 添加到一个列表中, 这个列表保存了 Sentinel 已知的, 监视同一个主服务器的所有其他 Sentinel 故障转移是哨兵的主要工作,这背后的实现逻辑也是非常的复杂,具体的实现逻辑还请查看相关书籍,我对哨兵的故障转移总结了以下三点: 每个 Sentinel 节点每隔 1 秒对主节点、从节点、其他 Sentinel 节点发送 ping 命令做心跳检测,来判断服务器的状态。 节点也会对 Sentinel 进行相应的回复,在这些回复中,以下三种回复是有效回复: 如果节点在哨兵配置文件设置的 master-down-after-milliseconds 选项的值内,一直没有哪怕一次有效回复,那么 Sentinel 会把该服务器标记为下线状态,我们把这种下线称为主观下线,也就是说只有这个 sentinel 认为该服务器是下线状态。 如果被主观下线的服务器是主服务器时,sentinel 为了确认这个主服务器是否真的下线,该 Sentinel 会向其他的同样监听主服务器的 Sentinel 进行询问,看他们是否也认为主服务器进入下线状态,当有足够多的 Sentinel 都认为主服务器下线时,该 Sentinel 会将主服务器判断为客观下线,这是真正的下线了,并且会对它进行故障转移操作。 故障转移并不是所有的 sentinel 共同完成,而是选举出一台 sentinel 节点作为领导者来完成这次故障转移,所以当主服务器被标记为客观下线时,sentinel 之间就会通过 Raft 算法选举出一个领导者来完成故障转移工作。redis 选举领头的 sentinel 的规则和方法大致如下: 选举出来的 sentinel 领导者将完成剩下的故障转移工作,故障转移主要有以下三步: (1)挑选出新的主服务器 在已下线的主服务器的所有从服务器中,挑选出一个从服务器,并将其转换为主服务器,选择新的主服务器的规则如下: 对挑选出来的从服务器执行 slaveof no one 命令,使其成为主节点。 (2)修改其他从服务器的复制目标 当新的主服务器出现后,sentinel 的领导者下一步需要做的就是,让其他从服务器去复制新的主服务器,通过向其他从服务器发送 slaveof new_master port 命令来完成,复制规则和配置文件的 parallel-syncs 参数有关 (3)将旧的主服务器变成从服务器 故障转移操作最后要做的就是将已下线的主服务器设置为新的主服务的从服务器,并保持对其关注,等它恢复后命令它去复制新的主节点。 以上就是我今天要分享的 redis 哨兵知识,希望看完之后你有所收获。什么是分钟哨兵?
哨兵群集的分钟搭建
哨兵故障转移原理
1、监听服务器
2、选举 Sentinel 节点完成转移任务
3、选举新 master 服务器完成故障转移