Redis哨兵模式浅析

背景

两种主从复制的模式,一种是一主多从,另一种是主-从(主)-从的链路模式。对于任意模式,主节点宕机后都需要再次选一个主机,这个动作不会自动完成,需要手动配置。

slaveof no one # 不以服从于任何节点,即自己是主节点

手动配置繁琐易出错且花费时间长,使得Redis的可用性下降,所以出现了哨兵模式,当主节点宕机之后,自动根据从节点的投票结果选举新的主节点。

哨兵模式是Redis的一种运行模式,它专注于对Redis实例(主从节点)运行状态的监控,并能够在主节点发生故障时通过一系列的机制实现选主及主从切换,实现故障转移,确保整个Redis系统的可用性。

哨兵集群搭建

redis 多哨兵模式 redis哨兵模式需要几个节点_服务器

上图是一个典型的3哨兵节点、3数据节点(一主二从)方式搭建。

首先搭建好一个一主二从的Redis集群(参考链接),然后搭建哨兵集群

搭建哨兵集群步骤

在安装路径下新建3个Redis Sentinel配置文件,作为三个监控节点,内容如下

# sentinel-26379.conf 文件名,其他类比,将端口和logfile名字改掉即可
port 26379
daemonize yes
dir "./"
logfile "26379.log"

#配置监听的主服务器,sentinel monitor 代表监控,mymaster代表服务器的名称,可以自定义,127.0.0.1 6379 为监控的主服务器的ip和端口,2表示只有两个或者两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作
sentinel monitor mymaster 127.0.0.1 6379 2 

# 判断主节点时间
sentinel down-after-millseconds mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
# 启动命令 windows
redis-server ./sentinel-26379.conf --sentinel
redis-cli -p 26379 # 连接哨兵进程
info sentinel # 查看哨兵消息

此时shutdown主机6379,则主机会自动换,再将6379恢复,则自动变为从机。

发布订阅的应用

哨兵集群中多个哨兵之间的通信就是使用发布订阅的功能来实现的,哨兵们通过一个约定好的通道发布/订阅hello信息进行通信

redis 多哨兵模式 redis哨兵模式需要几个节点_服务器_02

如上图所示:

  • 每隔2秒,每个哨兵会通过它所监控的主节点、从节点向__sentinel__:hello通道发布一条hello消息。
  • 每个哨兵会通过它所监控的主节点、从节点订阅__sentinel__:hello通道的消息,以此接收其他哨兵发布的信息。

我们可以通过Redis客户端直接订阅该channel:连接到其中一个节点,然后输入命令:SUBSCRIBE __sentinel__:hello,如下图所示:

redis 多哨兵模式 redis哨兵模式需要几个节点_redis 多哨兵模式_03

如上图所示,hello信息中包含8个信息,依次是:哨兵ip、哨兵端口、哨兵runId、当前纪元、主节点名称、主节点ip、主节点端口、主节点纪元,除了纪元应该都可以理解。这样每个哨兵发布的消息都会被其他哨兵接收到,从而达到信息交换的目的。纪元是epoch,当节点的状态发生变化,epoch数目会加一。

优缺点对比

优点:

  1. 哨兵集群是基于主从复制模式的,所有的主从配置的优点都有
  2. 主从可以自动切换,故障可以转移,系统的可用性好
  3. 哨兵模式是主动模式的升级,手动到自动,更加鲁棒

缺点:

  1. 不好在线扩容,集群容量一旦达到上限,在线扩容很麻烦
  2. 实现哨兵的配置其实很多,不好配置。

小结

哨兵模式是常用的Redis集群模式,可以大大提高服务的可用性

哨兵模式节点的发现通过主机的info信息,发现其从节点信息

哨兵们的发现是借助正在被监控的数据节点以类似广播的方式,实现节点的发现