Redis Sentinel(哨兵)是一种用于管理 Redis 实例的高可用性解决方案。它提供了监控、通知和自动故障转移等功能,确保 Redis 服务在发生故障时能够自动恢复,提供高可用性和可靠性。以下是详细介绍 Redis Sentinel 的功能及其代码示例。
Redis Sentinel 的功能
-
监控(Monitoring):
- Sentinel 会持续监控主节点和从节点的运行状态,检查它们是否正常工作。
-
通知(Notification):
- 如果 Sentinel 检测到某个节点发生故障,它会通过 API 向系统管理员或其他应用程序发送通知。
-
自动故障转移(Automatic Failover):
- 如果主节点发生故障,Sentinel 会将其中一个从节点提升为新的主节点,并将其他从节点指向新的主节点。
-
配置提供者(Configuration Provider):
- Sentinel 允许客户端应用程序查询当前 Redis 集群的状态信息,以便客户端能够始终连接到正确的主节点。
Sentinel 配置示例
1. 配置 Redis 实例
配置主从架构的 Redis 实例。
主节点配置(master.conf):
plaintext
port 6379
bind 127.0.0.1
dir /var/lib/redis
appendonly yes
从节点配置(slave.conf):
plaintext
port 6380
bind 127.0.0.1
dir /var/lib/redis
appendonly yes
slaveof 127.0.0.1 6379
启动主从节点:
sh
redis-server master.conf
redis-server slave.conf
2. 配置和启动 Sentinel
创建 Sentinel 配置文件(sentinel.conf):
plaintext
port 26379
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 60000
启动 Sentinel:
sh
redis-sentinel sentinel.conf
3. Java 代码示例:使用 Jedis 连接带有 Sentinel 的 Redis 集群
以下 Java 代码展示了如何使用 Jedis 库连接和操作带有 Sentinel 的 Redis 集群。
java
import redis.clients.jedis.JedisSentinelPool;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.HostAndPort;
import java.util.HashSet;
import java.util.Set;
public class RedisSentinelExample {
public static void main(String[] args) {
// 定义 Sentinel 节点
Set<String> sentinels = new HashSet<>();
sentinels.add("127.0.0.1:26379");
// 创建 JedisSentinelPool 对象
JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels);
try (Jedis jedis = pool.getResource()) {
// 操作 Redis
jedis.set("key", "value");
String value = jedis.get("key");
System.out.println("Get key: " + value);
} finally {
// 关闭连接池
pool.close();
}
}
}
详细解释
-
监控:
- Sentinel 持续监控主节点和从节点的运行状态。配置文件中的
sentinel monitor mymaster 127.0.0.1 6379 2
表示 Sentinel 监控的主节点是127.0.0.1:6379
,并且至少需要 2 个 Sentinel 同意主节点失效,才会进行故障转移。
- Sentinel 持续监控主节点和从节点的运行状态。配置文件中的
-
通知:
sentinel down-after-milliseconds mymaster 5000
配置了 Sentinel 判断主节点失效的时间阈值(毫秒)。超出这个时间后,Sentinel 会认为主节点失效并发送通知。
-
自动故障转移:
sentinel failover-timeout mymaster 60000
配置了 Sentinel 进行故障转移的超时时间。故障转移过程中,Sentinel 会将其中一个从节点提升为新的主节点,并将其他从节点指向新的主节点。
-
配置提供者:
- 客户端应用程序(如 Java 代码中的
JedisSentinelPool
)可以通过 Sentinel 获取当前主节点的信息,并确保连接的是正确的主节点。
- 客户端应用程序(如 Java 代码中的
故障转移的示例
为了测试自动故障转移,您可以强制关闭 Redis 主节点,观察 Sentinel 的行为。
sh
# 停止 Redis 主节点
redis-cli -p 6379 shutdown
此时,Sentinel 会检测到主节点失效,并自动提升从节点为新的主节点,然后重新配置集群。
总结
Redis Sentinel 提供了一种高可用性解决方案,通过监控、通知、自动故障转移和配置提供等功能,确保 Redis 服务的可靠性。通过配置 Sentinel 和使用 Jedis 库,客户端应用程序可以方便地连接和操作带有 Sentinel 的 Redis 集群,从而实现高可用性和自动故障恢复。