1、简介
- Redis 哨兵(Redis Sentinel)是 Redis 的高可用性解决方案,它可以在主节点(master)发生故障时自动进行故障转移,将其中的一个从节点(slave)提升为新的主节点,确保 Redis 服务的连续性。
- 简单来说,当主库宕机,在从库中选择一个,切换为主库。
2、功能
- 监控(Monitoring):哨兵会持续检查主节点和从节点的健康状况,包括实例是否在运行,主从复制是否正常等。
- 自动故障转移(Automatic Failover):当主节点发生故障时,哨兵会进行投票,选择一个从节点作为新的主节点,并更新其他从节点的配置,让它们指向新的主节点。
- 通知(Notification):哨兵可以将故障转移的结果通知给客户端或管理员。
- 配置提供者(Configuration Provider):哨兵可以作为客户端的配置提供者,客户端可以从哨兵获取最新的主节点地址。
3、工作原理
- 哨兵是一个独立的进程,它可以与多个 Redis 实例(主节点和从节点)进行交互。
- 哨兵之间会相互通信,形成一个哨兵集群。
- 当一个哨兵检测到主节点故障时,它会与其他哨兵进行通信,并尝试进行故障转移。
- 故障转移的过程包括选择新的主节点、更新从节点的配置、通知客户端等步骤。
4、配置
4.1配置建议
- 为了确保故障转移的正确性,你需要确保哨兵集群中的哨兵数量是奇数个(如 1、3、5 等),这样可以避免投票时出现平局的情况。
- 哨兵只能解决 Redis 的主从复制中的单点故障问题,对于其他类型的故障(如磁盘故障、网络分区等)可能无法完全解决。
- 在使用哨兵时,建议同时配置持久化(如 RDB 或 AOF),以确保数据的可靠性。
- 客户端在连接 Redis 时,应该使用哨兵提供的地址进行连接,而不是直接连接到 Redis 实例。这样,当发生故障转移时,客户端可以自动连接到新的主节点。
4.2实际配置
1、主从配置
主节点配置(redis.conf)
bind <ip>
:绑定IP地址。port <port>
:指定端口号(例如:6379)。daemonize yes
:以守护进程方式运行。pidfile /var/run/redis_<port>.pid
:指定PID文件位置。logfile "<logfile-path>"
:指定日志文件路径。dir "<data-dir>"
:指定数据目录。requirepass <password>
(可选):设置密码。
从节点配置(redis.conf)
在从节点的配置文件中,除了上述主节点的配置外,还需要添加:
replicaof <master-ip> <master-port>
:指定主节点的IP地址和端口号。masterauth <password>
(如果主节点设置了密码):指定主节点的密码。
2、哨兵配置
哨兵节点配置
对于每个哨兵节点,你需要一个sentinel.conf
配置文件,其中包含以下关键配置:
sentinel monitor <master-name> <master-ip> <master-port> <quorum>
<master-name>
:给主节点起的名字,可以自定义。<master-ip>
和<master-port>
:主节点的IP地址和端口号。<quorum>
:表示多少个哨兵节点同意某个主节点不可用时,才进行故障转移。通常是哨兵节点数量减一。
其他哨兵配置选项
sentinel down-after-milliseconds <master-name> <milliseconds>
:指定哨兵认为主节点不可用的时间阈值。sentinel failover-timeout <master-name> <milliseconds>
:指定故障转移的超时时间。sentinel parallel-syncs <master-name> <numslaves>
:指定在故障转移期间,可以同时重新配置为新的主节点的从节点数量。
3、启动哨兵和Redis节点
- 启动Redis主从节点。
- 启动哨兵节点,使用
redis-sentinel /path/to/sentinel.conf
命令。
4、验证配置
- 使用
redis-cli -p <sentinel-port> sentinel masters
命令来查看哨兵监控的主节点状态。 - 使用
redis-cli -p <redis-port> info replication
命令来查看Redis节点的复制信息。
5、哨兵集群
5.1简介
- 采用多个哨兵,组成一个集群,以少数服从多数的原则,来判断主库是否已客观下线。
5.2功能
- 监控:哨兵集群会定期向Redis主节点和从节点发送PING命令,检测它们的健康状态。
- 故障检测:当哨兵检测到主节点未能在规定的时间内响应PING命令时,它会将该主节点标记为客观下线(SDOWN)。
- 故障转移:当足够数量的哨兵(根据配置,通常是过半数)同意主节点已经客观下线时,哨兵集群会选择一个从节点作为新的主节点,并通知其他从节点进行主从切换。
- 通知:哨兵集群会通过发布/订阅机制通知客户端新的主节点地址,以便客户端重新连接。
- 配置管理:哨兵集群会更新并维护Redis主从复制的配置信息,确保系统的一致性。
5.3原理
- 监控阶段:哨兵节点通过定期发送PING命令来检测Redis主从节点的状态。如果主节点无法响应,哨兵会将其标记为疑似下线(PDOWN)。
- 通知阶段:哨兵节点之间会进行通信,交换各自对Redis主从节点的监控结果。
- 故障转移阶段:当足够数量的哨兵节点认为主节点已经客观下线时,会进行故障转移。首先,通过选举算法选择一个哨兵节点作为领导者(Leader),然后由领导者负责执行故障转移操作,包括选择一个从节点作为新的主节点,并通知其他从节点进行主从切换。
5.4配置
1、配置主从复制
配置一个Redis主节点和至少一个从节点。
在Redis的配置文件(通常是redis.conf
)中:
- 主节点:不需要特殊配置,只需确保Redis实例正在运行。
- 从节点:使用
replicaof
(旧版本中是slaveof
)指令指定主节点的IP地址和端口。例如:replicaof <master-ip> <master-port>
。
2、配置哨兵实例
对于每个哨兵实例,创建一个配置文件(通常是sentinel.conf
),并指定以下关键参数:
-
哨兵监控的主节点:使用
sentinel monitor
命令指定要监控的主节点的名称、IP地址、端口和quorum值(即认为主节点已不可用的哨兵数量)。例如:sentinel monitor mymaster <master-ip> <master-port> <quorum>
。<master-name>
:给主节点起的名字,可以自定义。<master-ip>
:主节点的IP地址。<master-port>
:主节点的端口号。<quorum>
:在多少个哨兵实例认为主节点不可用时,才进行故障转移。
-
哨兵间通信:确保所有哨兵实例都知道其他哨兵实例的地址和端口,以便它们可以相互通信和协作。这通常通过在哨兵配置文件中添加
sentinel known-sentinel <master-name> <sentinel-ip> <sentinel-port>
指令来实现。 -
故障转移超时时间:使用
sentinel down-after-milliseconds <master-name> <milliseconds>
指定哨兵在多长时间内没有收到主节点的响应后,将其标记为不可用。 -
故障转移过程中的投票时间:使用
sentinel failover-timeout <master-name> <milliseconds>
指定故障转移过程中,哨兵等待其他哨兵响应的最长时间。
3、启动哨兵实例
- 使用
redis-sentinel /path/to/sentinel.conf
命令启动每个哨兵实例。
4、验证配置
- 使用Redis客户端连接到其中一个哨兵实例,并使用
SENTINEL masters
命令来验证哨兵是否正在监控您指定的主节点。 - 使用
SENTINEL slaves <master-name>
命令来查看主节点的从节点列表。