Redis哨兵模式详解(附带实例)
本节将带领读者熟悉 Redis 哨兵模式,掌握 Redis 哨兵模式的部署方法,了解 Redis 哨兵模式的应用方法。
这是解决 Redis 故障转移问题的一种方式,但需要手动处理故障,实用性比较差。而 Redis 发生故障时间是 Master 节点无法预知,这时需要一个能自动处理故障转移的自动监控组件。哨兵模式可以解决上述问题。
Redis 哨兵模式是 Redis 的高可用性解决方案。由一个或多个哨兵(Sentinel)实例组成的 Sentinel 系统可以监视任意多个 Master 节点,以及这些 Master 节点下的所有 Slave 节点,并在被监视的 Master 节点进入下线状态时,自动将下线 Master 节点下的某个 Slave 节点升级为新的 Master 节点。
Sentinel 实例其实是一个 Redis 的服务端程序,会定时执行 serverCron() 函数。Sentinel 实例在初始化的时候会清空原来的命令表,写入自己独有的命令。普通 Redis 节点支持的数据读/写命令对 Sentinel 来说,都是找不到命令,因为它没有初始化这些命令的执行器。
Sentinel 实例会定时对自己监控的 Master 节点执行 info 命令,获取最新的主从关系,还会定时给所有的 Redis 节点发送 ping 命令。Sentinel 实例如果检测到某个 Master 节点无法响应,就会给其他 Sentinel 实例发送消息,并主观上认为该 Master 节点死机。
如果集群认同该 Master 节点下线的票数达到一个阈值,那么会一起下线该 Master 节点。下线之前需要做的是找集群中的某一个 Sentinel 来执行下线操作,这个找的过程叫作领导者选举。
选举之后,Sentinel 实例会从该 Master 节点所有的 Slave 节点中挑选合适的作为新的 Master 节点,并让其他 Slave 节点重新同步新的 Master 节点上的数据。这种模式称为哨兵模式,如下图所示:

图 1 哨兵模式
部署 Sentinel 的步骤如下:
1) 安装哨兵软件 redis-sentinel,使用的命令为 sudo apt-get install redis-sentinel,实现主从服务节点一致,如下图所示:

图 2 安装redis-sentinel
2) 配置哨兵模式(为防止一个哨兵程序失效,主从服务节点上都配一个哨兵程序)。使用 sudo vim /etc/redis/sentinel.conf 命令对配置文件进行编辑,先取消仅支持本地连接,并设置主节点和密码,如图 3~5 所示。

图 3 取消仅支持本地连接

图 4 设置主节点

图 5 设置密码
3) 先使用 sudo service redis-sentinel restart 命令来重启哨兵进程,再使用 sudo service redis-sentinel status 命令查看 sentinel 进程的运行状态,若为 active(running) 状态则表示 sentinel 进程正常启动。
从下图中可以看出,sentinel 进程已正常启动:

图 6 重启sentinel进程和查看进程状态
其次,查看 Slave 节点状态,Slave 节点的 IP 地址为 192.168.43.83。代码如下:
再次,查看哨兵状态,代码如下。可以看出,Master 节点有个 192.168.43.83 的哨兵接听。之后,使用 sudo service redis-server stop 命令关闭 Redis 服务:
最后,登录 sentinel 系统,查询状态。此时主从节点自动切换,Master 节点为 192.168.43.83,这说明哨兵模式能够自动完成主从节点的切换:
Redis哨兵模式的作用和架构
我们知道,借助 Redis 主从模式的数据复制技术,可以实现主从节点数据同步备份。如果 Master 节点死机,那么可以将一个正常工作的 Slave 节点选举为新的 Master 节点,并让其他 Slave 节点同步新 Master 节点的数据。这是解决 Redis 故障转移问题的一种方式,但需要手动处理故障,实用性比较差。而 Redis 发生故障时间是 Master 节点无法预知,这时需要一个能自动处理故障转移的自动监控组件。哨兵模式可以解决上述问题。
Redis 哨兵模式是 Redis 的高可用性解决方案。由一个或多个哨兵(Sentinel)实例组成的 Sentinel 系统可以监视任意多个 Master 节点,以及这些 Master 节点下的所有 Slave 节点,并在被监视的 Master 节点进入下线状态时,自动将下线 Master 节点下的某个 Slave 节点升级为新的 Master 节点。
Sentinel 实例其实是一个 Redis 的服务端程序,会定时执行 serverCron() 函数。Sentinel 实例在初始化的时候会清空原来的命令表,写入自己独有的命令。普通 Redis 节点支持的数据读/写命令对 Sentinel 来说,都是找不到命令,因为它没有初始化这些命令的执行器。
Sentinel 实例会定时对自己监控的 Master 节点执行 info 命令,获取最新的主从关系,还会定时给所有的 Redis 节点发送 ping 命令。Sentinel 实例如果检测到某个 Master 节点无法响应,就会给其他 Sentinel 实例发送消息,并主观上认为该 Master 节点死机。
如果集群认同该 Master 节点下线的票数达到一个阈值,那么会一起下线该 Master 节点。下线之前需要做的是找集群中的某一个 Sentinel 来执行下线操作,这个找的过程叫作领导者选举。
选举之后,Sentinel 实例会从该 Master 节点所有的 Slave 节点中挑选合适的作为新的 Master 节点,并让其他 Slave 节点重新同步新的 Master 节点上的数据。这种模式称为哨兵模式,如下图所示:

图 1 哨兵模式
部署Redis哨兵模式
部署 Redis 哨兵模式的环境说明如下表所示:主机名称 | IP 地址 | 角色说明 |
---|---|---|
redis-master | 192.168.43.246:6379 | Master节点 |
redis-slave01 | 192.168.43.83:6379 | Slave节点 |
redis-master | 192.168.43.246:26379 | Sentinel01 |
redis-slave01 | 192.168.43.83:26379 | Sentinel02 |
部署 Sentinel 的步骤如下:
1) 安装哨兵软件 redis-sentinel,使用的命令为 sudo apt-get install redis-sentinel,实现主从服务节点一致,如下图所示:

图 2 安装redis-sentinel
2) 配置哨兵模式(为防止一个哨兵程序失效,主从服务节点上都配一个哨兵程序)。使用 sudo vim /etc/redis/sentinel.conf 命令对配置文件进行编辑,先取消仅支持本地连接,并设置主节点和密码,如图 3~5 所示。

图 3 取消仅支持本地连接

图 4 设置主节点

图 5 设置密码
3) 先使用 sudo service redis-sentinel restart 命令来重启哨兵进程,再使用 sudo service redis-sentinel status 命令查看 sentinel 进程的运行状态,若为 active(running) 状态则表示 sentinel 进程正常启动。
从下图中可以看出,sentinel 进程已正常启动:

图 6 重启sentinel进程和查看进程状态
哨兵模式应用
我们在 Master 节点上查看哨兵模式的应用,先登录 Master 节点(192.168.43.246),查看系统状态,并执行操作。首先,查看 Master 节点状态,代码如下:# 使用Master节点连接Redis,并查看Master节点信息,可以看出Master节点的名称是mymaster, # IP地址是已配置的192.168.43.246。 192.168.43.246:26379> sentinel master mymaster 1) "name" 2) "mymaster" 3) "ip" 4) "192.168.43.246" 5) "port" 6) "6379"
其次,查看 Slave 节点状态,Slave 节点的 IP 地址为 192.168.43.83。代码如下:
192.168.43.246:26379> sentinel slaves mymaster 1) 1) "name" 2) "192.168.43.83:6379" 3) "ip" 4) "192.168.43.83" 5) "port" 6) "6379"
再次,查看哨兵状态,代码如下。可以看出,Master 节点有个 192.168.43.83 的哨兵接听。之后,使用 sudo service redis-server stop 命令关闭 Redis 服务:
192.168.43.246:26379> sentinel sentinels mymaster 1) 1) "name" 2) "192.168.43.83:26379" 3) "ip" 4) "192.168.43.83" 5) "port" 6) "26379"
最后,登录 sentinel 系统,查询状态。此时主从节点自动切换,Master 节点为 192.168.43.83,这说明哨兵模式能够自动完成主从节点的切换:
ubuntu@ubuntu:~$ redis-cli -h 192.168.43.246 -p 26379 192.168.43.246:26379> sentinel sentinels mymaster 1) 1) "name" 2) "192.168.43.83:26379" 3) "ip" 4) "192.168.43.83" 5) "port" 6) "26379"