Redis高可用实战:Jedis Sentinel自动故障转移全配置

Redis高可用实战:Jedis Sentinel自动故障转移全配置

【免费下载链接】jedis 【免费下载链接】jedis 项目地址: https://gitcode.com/gh_mirrors/jed/jedis

你是否还在手动切换Redis主从节点?当主节点宕机时,业务中断风险、人工操作延迟和配置易错性是否困扰着你?本文将详细介绍如何通过Jedis Sentinel实现Redis自动故障转移,让你无需人工干预即可保障Redis服务持续可用。读完本文,你将掌握Sentinel环境搭建、Jedis配置、故障转移验证及最佳实践,轻松应对Redis单点故障问题。

为什么需要Sentinel

在Redis单机部署中,一旦主节点故障,整个服务将不可用。传统主从架构虽能提供数据备份,但无法自动切换主节点。Redis Sentinel(哨兵)通过监控主从节点、自动故障转移和配置提供者三大功能,解决了这一痛点。Jedis作为Redis官方推荐的Java客户端,提供了JedisSentinelPoolJedisSentineled等工具类,无缝集成Sentinel实现高可用。

官方文档详细说明了故障转移机制:故障转移文档。核心实现位于JedisSentinelPool类,通过监听Sentinel的+switch-master事件自动更新主节点信息:JedisSentinelPool.java

环境准备与配置

基础环境要求

  • Redis 6.2+(推荐)
  • Jedis 4.0+(本文基于最新稳定版)
  • JDK 8+
  • Maven/Gradle构建工具

Redis Sentinel配置

  1. 主从节点配置(redis.conf):

    # 主节点配置
    port 6379
    daemonize yes
    logfile "master.log"
    
    # 从节点配置(至少2个)
    port 6380
    replicaof 127.0.0.1 6379
    logfile "slave1.log"
    
  2. Sentinel配置(sentinel.conf,至少3个实例):

    port 26379
    sentinel monitor mymaster 127.0.0.1 6379 2  # 监控主节点,2票同意触发故障转移
    sentinel down-after-milliseconds mymaster 30000  # 30秒未响应标记为不可用
    sentinel parallel-syncs mymaster 1  # 故障转移后同步从节点的并发数
    sentinel failover-timeout mymaster 180000  # 故障转移超时时间
    

Jedis依赖配置

Maven项目需在pom.xml中添加依赖:

<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>4.4.6</version>  <!-- 使用最新版本 -->
</dependency>

Jedis Sentinel核心配置

创建Sentinel连接池

通过JedisSentinelPool创建支持自动故障转移的连接池:

// 1. 配置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");

// 2. 配置连接池参数
GenericObjectPoolConfig<Jedis> poolConfig = new GenericObjectPoolConfig<>();
poolConfig.setMaxTotal(16);  // 最大连接数
poolConfig.setMaxIdle(8);    // 最大空闲连接
poolConfig.setMinIdle(4);    // 最小空闲连接

// 3. 创建Sentinel连接池
JedisSentinelPool pool = new JedisSentinelPool(
  "mymaster",  // 主节点名称(需与sentinel.conf一致)
  sentinels,   // Sentinel节点集合
  poolConfig,  // 连接池配置
  2000,        // 连接超时时间(ms)
  "redis-password",  // Redis密码(如无密码可省略)
  0           // 数据库索引
);

核心实现逻辑:JedisSentinelPool通过initSentinels方法发现当前主节点,并启动MasterListener线程监听Sentinel消息:JedisSentinelPool.java#L229-L286

使用UnifiedJedis API(推荐)

Jedis 4.0+提供的UnifiedJedis接口简化了Sentinel模式使用:

// 创建Sentinel连接提供者
SentineledConnectionProvider provider = new SentineledConnectionProvider(
  "mymaster",
  DefaultJedisClientConfig.builder().password("redis-password").build(),
  poolConfig,
  sentinels.stream().map(HostAndPort::from).collect(Collectors.toSet()),
  DefaultJedisClientConfig.builder().build()
);

// 创建UnifiedJedis实例
UnifiedJedis jedis = new JedisSentineled(provider);

// 执行Redis操作
jedis.set("user:1001", "Alice");
System.out.println(jedis.get("user:1001"));  // 输出"Alice"

JedisSentineled类封装了Sentinel连接逻辑,提供与普通Jedis一致的API体验:JedisSentineled.java

故障转移验证与监控

手动触发故障转移测试

  1. 模拟主节点故障

    redis-cli -p 6379 debug segfault  # 强制崩溃主节点
    
  2. 验证自动切换

    // 循环检查当前主节点
    new Thread(() -> {
      while (true) {
        try {
          HostAndPort currentMaster = pool.getCurrentHostMaster();
          System.out.println("Current master: " + currentMaster);
          Thread.sleep(5000);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }).start();
    

    正常输出应显示主节点从6379切换到6380(或其他从节点)。

关键监控指标

指标说明正常范围
sentinel master mymaster主节点状态status:ok
sentinel replicas mymaster从节点数量≥2个在线
sentinel sentinels mymaster可用Sentinel数量≥3个

可通过jedis.sentinelGetMasterAddrByName("mymaster")获取当前主节点信息,测试代码示例:JedisSentinelPoolTest.java

最佳实践与注意事项

架构设计要点

  1. 奇数Sentinel节点:推荐3或5个Sentinel实例,避免脑裂(投票机制要求多数同意)。
  2. 独立部署:Sentinel与Redis节点应部署在不同物理机/容器,避免单点故障。
  3. 资源隔离:生产环境中主从节点需配置独立CPU、内存和磁盘资源。

连接池优化配置

poolConfig.setTestOnBorrow(true);  // 借出连接时测试可用性
poolConfig.setTestWhileIdle(true);  // 空闲时定期测试
poolConfig.setTimeBetweenEvictionRunsMillis(30000);  // 30秒检查一次空闲连接

常见问题处理

  1. Sentinel无法发现主节点

    • 检查网络连通性:telnet sentinel-ip 26379
    • 验证主节点名称匹配:Sentinel配置与Jedis初始化时的masterName必须一致。
  2. 故障转移后数据不一致

    • 启用min-replicas-to-write 1确保主节点至少有1个健康从节点才接受写操作。
    • 配置replica-serve-stale-data no禁止从节点提供过期数据。
  3. 客户端连接泄漏

    • 使用try-with-resources确保连接自动归还:
      try (Jedis jedis = pool.getResource()) {
        // 执行操作
      } catch (Exception e) {
        // 异常处理
      }
      

总结与进阶方向

通过Jedis Sentinel实现Redis高可用的核心是:多Sentinel监控+自动故障转移+连接池动态更新。本文介绍的配置方案可满足中小规模业务需求,大规模集群建议结合:

  • Redis Cluster:分片存储+跨节点故障转移
  • Metrics监控:集成Prometheus+Grafana监控Sentinel指标
  • 自动化运维:通过Ansible/Kubernetes管理配置文件和服务启停

完整示例代码可参考测试用例:JedisSentinelPoolTest.java。建议收藏本文,关注项目README.md获取最新更新。


操作指引:点赞+收藏本文,关注作者获取《Redis高可用架构系列》后续内容(下一篇:Jedis Cluster分布式锁实现)。

【免费下载链接】jedis 【免费下载链接】jedis 项目地址: https://gitcode.com/gh_mirrors/jed/jedis

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值