redis cluster配置之read-mode

文章描述了一个生产环境中Redis集群在主节点挂掉后导致服务不可用的问题。经过分析,发现原因是Redission默认配置只从从节点读取数据,当从节点不可用时,连接耗尽,导致集群整体不可用。解决方案是将`redis.cluster.read-mode`配置更改为`MASTER-SLAVE`,允许在从节点异常时从主节点读取数据。该事件强调了正确配置Redis集群的重要性以及开发人员对这类问题的了解和处理能力。

背景

生产部署了redis集群,三台机器(三主三从,主从不在同一台机器上),redission连接使用。当有一个master节点挂掉时,redis整个集群不可用。

解决过程

  1. 运维登上机器上,执行cluster info发现集群OK状态

  1. 执行cluster nodes发现挂掉的master节点fail状态,对应的slave已经变成了master节点(fail over成功)

  1. 手动连接上集群,redis-cli -h -c,指定读写操作正常

  1. 1、2、3操作说明,redis集群是可用且正常故障转移了

  1. 此时,说明应用程序只能从slave节点读取数据,不能正常从master读取数据

  1. 查看apollo上redis cluster的配置发现并未配置相关的参数

  1. 说明应用了默认的redis集群读数据配置

  1. 翻阅redis cluster配置,发现redis.cluster.read-mode有关

  1. read-mode有三个选项

追踪redission的源码发现,默认情况下使用的SLAVE,也就是仅从从节点读取数据,当从节点挂掉后,连接用完后,会导致集群整体不可用状态,非常危险。建议改成MASTER_SLAVE,工作原理可以从redission的源码中看到。

org.redisson.connection.MasterSlaveEntry#connectionReadOp

如果配置的是MASTER那么会去获取写连接,否则会通过负载均衡算法获取从节点的连接,继续追踪从节点获取连接的代码

public boolean isMasterForRead() {

return this.getFreezeReason() == ClientConnectionsEntry.FreezeReason.SYSTEM && this.connectionManager.getConfig().getReadMode() == ReadMode.MASTER_SLAVE && this.getNodeType() == NodeType.MASTER;

}

如果read-mode配置的是MASTER-SLAVE,那么允许应用程序在slave节点异常的情况下,从master中读取数据。

  1. 运维将redis.cluster.read-mode指定为MASTER-SLAVE后,程序运行正常,redis集群正常故障转移,且可以从master中读取数据。

复盘

  1. redis集群配置时一定要注意配置的默认选项,否则会造成重大生产事故

  1. 开发也要引起重视,不能依赖运维人员,这样在出现问题时,才能独立应对,从容有序

  1. 合理推测很重要,依据现场情形,做出合理推断

  1. redis cluster模式下,三主也是可以正常运行的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值