1. Redis哨兵模式介绍
Redis哨兵模式(Redis Sentinel)是用来在Redis主从复制架构中监控和管理Redis实例的自动化机制。它提供了高可用性,可用于确保Redis在部分节点出现故障时继续可用。哨兵的主要任务是监控Redis的健康状况,当Redis故障或者主从复制配置发生变化时,执行自动化的故障转移操作。
哨兵模式有以下几个特点:
监控:哨兵系统会对Redis节点进行监控,确保它们正常运作并不断检测它们的状态。
自动故障转移:当Redis节点故障或者主从复制配置发生变化时,哨兵会自动完成故障转移的操作,避免了人工操作。
配置提供者:哨兵还可以作为配置提供者。当一个Redis客户端初始化连接时,它可以从哨兵那里获取Redis节点的地址列表,以便建立连接。
灵活:哨兵系统可以配合Redis集群模式使用,以便确保整个集群高可用。
2. 哨兵架构
哨兵架构由三种类型的节点组成:
主节点:处理客户端的请求,并可以拥有一个或多个从节点来进行数据备份。
从节点:根据主节点的状态进行数据同步,网络配置和需要恢复的数据会由主节点来控制。
哨兵节点:它们是独立的进程,主要负责监控主节点和从节点的状态以及执行自动化故障转移操作。
下面是一张典型的Redis哨兵架构图:
+--------+ +--------+ +--------+
| | | | | |
| Master | | Master | | Master |
| | | | | |
+---+----+ +--------+ +--------+
| ^
v |
+---+----+ +--------------+-------------+
| | | |
| Slave | | Slave |
| | | |
+---+----+ +--------------+-------------+
| ^
v |
+---+----+ +--------+ +--------+
| | | | | |
| Slave | | Slave | | Slave |
| | | | | |
+---+----+ +--------+ +--------+
^ ^
| |
+---+------------+ +-------+----------+
| | | |
| Sentinel node <---+ Sentinel node |
| | | |
+----------------+ +------------------+
2.1. 哨兵节点组成
一个典型的哨兵模式集群至少需要三个哨兵节点。当一个哨兵进程启动时,它会成为哨兵模式群集的一部分,并加入到哨兵的消息总线中。
哨兵节点的角色:
监控器(monitor):定期地对Redis实例运行状况进行检查,并在出现故障的情况下报告给管理员。当发生主观故障(即哨兵认为这个节点已经不能正常工作,但与其他哨兵的意见不一致)时,哨兵会设置投票令牌,并在投票获胜时开始进行自动化故障转移。
投票者(voter):参与哨兵模式群集中的投票。当哨兵发现出现主观故障时,哨兵会向其他哨兵请求投票,以便取得更多的投票令牌,并掌握更大的选举优势。这个实现可以确保只有一个哨兵能够进行自动化故障转移。哨兵节点可以相互通信,交换故障信息,并定期检查其他哨兵的状态。
领导者(leader):在哨兵群集中,只有一个哨兵被选举为领导者。领导者的任务是领导自动故障转移过程,其它哨兵会依照领导者的指令执行自动故障转移。
2.2. 哨兵消息总线
哨兵节点在启动时就会加入到指定端口,并且在该端口上监听Redis节点和其他哨兵的广播消息。当哨兵检测到一个Redis节点或哨兵宕机时,它会通过广播消息通知其他哨兵节点。下面是哨兵节点的消息总线广播消息的格式:
SENTINEL message_id type channel pattern payload
其中:
message_id
:一个随机的32位无符号整数,用于唯一标识一条消息。
type
:一条消息的类型。
channel
:消息要广播到Redis频道的名称。
pattern
:用于订阅该频道的模式(可选参数)。
payload
:一个JSON对象,包含了有关消息的详细信息。
3. Redis哨兵模式的使用
使用Redis哨兵模式需要完成以下基本步骤:
安装并配置Redis哨兵节点
将主节点和从节点添加到哨兵配置文件中
启动哨兵节点
使用Redis哨兵模式连接到Redis实例
下面我们分别来看这四个步骤。
3.1. 安装并配置Redis哨兵节点
首先需要在主机上安装Redis哨兵节点。安装步骤可以参照Redis的官方文档。当完成这个过程后,需要在哨兵节点的配置文件中添加以下选项:
sentinel monitor master-name ip port quorum
其中:
master-name
:主节点的名称。
ip
:主节点的IP地址。
port
:主节点的端口号。
quorum
:指定了哨兵节点数量中超过半数认为出现某个节点故障时,才认为该节点出现故障。
这个选项告诉哨兵模式该如何监控主节点的状态。这个文件保存在哨兵模式节点的配置路径下,文件名为sentinel.conf
。
3.2. 将主节点和从节点添加到哨兵配置文件中
在主节点和从节点上,需要创建一个名为redis-sentinel.conf
的文件,并添加以下选项:
port port
sentinel monitor master-name ip port quorum
sentinel down-after-milliseconds master-name milliseconds
sentinel failover-timeout master-name timeout
sentinel parallel-syncs master-name value
其中:
port
:指定哨兵节点使用的端口号。
master-name
:主节点名称。
ip
:主节点的IP地址。
port
:主节点的端口号。
quorum
:使用哨兵模式的最小节点数。当有主观故障发生时,如果维护这个主节点的节点数低于这个值,那么哨兵模式会认为主节点已经下线了。
down-after-milliseconds
:指定哨兵触发故障转移所需等待的时间。
failover-timeout
:指定触发故障转移所需等待的最大时间。
parallel-syncs
:指定同步主节点数据的从节点数量。
3.3. 启动哨兵节点
当完成了哨兵模式配置后,可以开启哨兵模式节点。使用以下命令启动哨兵进程:
$ redis-server /path/to/redis-sentinel.conf --sentinel
以上--sentinel
是启用哨兵模式的标识。重复这个步骤,在所有哨兵节点上启用哨兵模式。
3.4. 使用Redis哨兵模式连接到Redis实例
当Redis哨兵模式已经启用时,可以使用以下语法来连接Redis实例:
SENTINEL get-master-addr-by-name master-name
这个命令将返回主节点的IP地址和端口号。
4. Redis哨兵模式的自动故障转移
当出现下线事件时,哨兵群集会在各个哨兵节点之间进行互相协调,在经过一系列投票的过程之后决定哪个从节点将会替代主节点。自动故障转移操作的步骤如下:
检测主节点是否在线:当一个哨兵检测到主节点下线时,它会发送一条命令给另外的哨兵进行验证。如果这些哨兵同样认为主节点已经下线,那么它们将发送通知给所有哨兵成员。
选择领导者:当多个哨兵成员都在同意出现故障并进行自动故障转移时,它们将会选出一个领导者进行整个故障转移过程的指挥工作。
选择从节点:哨兵群集会选择一个合适的从节点作为新的主节点。哨兵会认为最适合成为新主节点的从节点是从节点的优先级最高,最新一次同步的从节点。
重配置集群:Reds将会进行重配置,并使用新的主节点。
唤醒客户端:在完成重配置之后,哨兵群集会发送一条广播消息给所有客户端,告诉它们去连接新的主节点。
5. 总结
Redis哨兵模式为Redis实例提供了高可用性,增强了Redis在生产环境下的可靠性。使用哨兵模式的关键是正确地配置哨兵模式节点和主节点,以及进行自动化故障转移的步骤。