Redis Sentinel的使用方法
Redis Sentinel是Redis官方提供的高可用性解决方案,用于监控Redis主从实例的运行状态,当主节点出现故障时自动完成故障转移,无需人工介入,有效保障Redis服务的可用性。
Redis Sentinel核心功能
Redis Sentinel主要具备以下几项核心能力:
监控:定期检查主节点和从节点的运行状态,判断实例是否可用
通知:当被监控的Redis实例出现问题时,可以通过API向管理员或其他应用发送通知
自动故障转移:当主节点无法正常工作时,Sentinel会自动将一个从节点升级为新的主节点,并让其他从节点重新指向新的主节点
配置提供者:客户端连接Sentinel询问当前可用的主节点地址,Sentinel会返回当前的主节点信息,实现服务发现的动态更新
环境准备与配置
使用Redis Sentinel前需要先部署Redis主从复制环境,假设我们有1个主节点、2个从节点,再部署3个Sentinel节点避免单点故障,节点信息如下:
| 节点类型 | IP地址 | 端口 | 说明 |
|---|---|---|---|
| Redis主节点 | 127.0.0.1 | 6379 | 主节点,负责处理写请求 |
| Redis从节点1 | 127.0.0.1 | 6380 | 从节点,复制主节点数据 |
| Redis从节点2 | 127.0.0.1 | 6381 | 从节点,复制主节点数据 |
| Sentinel节点1 | 127.0.0.1 | 26379 | 监控Redis实例的Sentinel节点 |
| Sentinel节点2 | 127.0.0.1 | 26380 | 监控Redis实例的Sentinel节点 |
| Sentinel节点3 | 127.0.0.1 | 26381 | 监控Redis实例的Sentinel节点 |
Redis主从节点配置
主节点使用默认配置即可,从节点需要在配置文件中添加replicaof 127.0.0.1 6379指定主节点地址,或者启动从节点时通过命令行参数指定:
# 启动从节点1,指定主节点为127.0.0.1:6379 redis-server --port 6380 --replicaof 127.0.0.1 6379 # 启动从节点2,指定主节点为127.0.0.1:6379 redis-server --port 6381 --replicaof 127.0.0.1 6379
Sentinel节点配置
Sentinel节点可以通过配置文件启动,以下是Sentinel的基础配置示例,保存为sentinel.conf:
# Sentinel端口 port 26379 # 后台运行 daemonize yes # 日志文件路径 logfile "sentinel_26379.log" # 监控的主节点名称、IP、端口,2表示至少2个Sentinel节点认为主节点不可用才判定故障 sentinel monitor mymaster 127.0.0.1 6379 2 # 主节点无响应超过30000毫秒(30秒)则判定不可用 sentinel down-after-milliseconds mymaster 30000 # 故障转移时同时向新主节点同步数据的从节点数量,越小故障转移越快 sentinel parallel-syncs mymaster 1 # 故障转移超时时间,单位毫秒 sentinel failover-timeout mymaster 180000
其他两个Sentinel节点只需要修改port、logfile为对应的值即可,其余配置保持一致。
启动Sentinel节点的命令如下:
# 启动Sentinel节点1 redis-sentinel sentinel_26379.conf # 启动Sentinel节点2,配置文件为sentinel_26380.conf redis-sentinel sentinel_26380.conf # 启动Sentinel节点3,配置文件为sentinel_26381.conf redis-sentinel sentinel_26381.conf
Sentinel基本操作命令
连接Sentinel节点后,可以执行以下常用命令查看状态或进行管理:
sentinel masters:查看所有被监控的主节点信息sentinel master <主节点名称>:查看指定主节点的详细信息sentinel slaves <主节点名称>:查看指定主节点的所有从节点信息sentinel sentinels <主节点名称>:查看监控指定主节点的其他Sentinel节点信息sentinel get-master-addr-by-name <主节点名称>:获取当前主节点的IP和端口sentinel failover <主节点名称>:手动触发指定主节点的故障转移sentinel remove <主节点名称>:移除对指定主节点的监控
示例:查看名称为mymaster的主节点地址:
# 连接Sentinel节点 redis-cli -p 26379 # 执行命令获取主节点地址 127.0.0.1:26379> sentinel get-master-addr-by-name mymaster 1) "127.0.0.1" 2) "6379"
客户端连接Sentinel
不同编程语言的Redis客户端都提供了对Sentinel的支持,以下是Java和Python的示例:
Java客户端(Jedis)示例
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisSentinelPool;
import java.util.HashSet;
import java.util.Set;
public class SentinelExample {
public static void main(String[] args) {
// Sentinel节点集合
Set<String> sentinels = new HashSet<>();
sentinels.add("127.0.0.1:26379");
sentinels.add("127.0.0.1:26380");
sentinels.add("127.0.0.1:26381");
// 创建Sentinel连接池,指定主节点名称、Sentinel集合、密码(如果没有密码可以省略)
JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels);
try (Jedis jedis = pool.getResource()) {
// 执行Redis操作
jedis.set("test_key", "sentinel_value");
String value = jedis.get("test_key");
System.out.println("获取到的值:" + value);
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.close();
}
}
}Python客户端(redis-py)示例
from redis.sentinel import Sentinel
# 初始化Sentinel客户端,传入Sentinel节点列表
sentinel = Sentinel([('127.0.0.1', 26379), ('127.0.0.1', 26380), ('127.0.0.1', 26381)])
# 获取主节点连接,执行写操作
master = sentinel.master_for('mymaster', socket_timeout=0.1)
master.set('test_key', 'sentinel_value')
# 获取从节点连接,执行读操作
slave = sentinel.slave_for('mymaster', socket_timeout=0.1)
value = slave.get('test_key')
print(f"获取到的值:{value.decode('utf-8')}")注意事项
Sentinel节点建议部署奇数个,避免故障判定时出现平票情况
Sentinel监控的
down-after-milliseconds参数需要根据实际网络情况调整,设置过短容易出现误判,过长则故障发现延迟高客户端需要支持Sentinel协议,否则无法自动获取更新后的主节点地址
生产环境中Sentinel节点和Redis节点建议部署在不同的服务器上,避免同机器故障导致整体不可用
如果Redis主节点设置了密码,需要在Sentinel配置中添加
sentinel auth-pass mymaster <密码>,否则Sentinel无法连接主节点进行监控