redis cluster配置之read-mode

背景

生产部署了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有三个选项

redis cluster配置之read-mode_第1张图片

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

org.redisson.connection.MasterSlaveEntry#connectionReadOp

redis cluster配置之read-mode_第2张图片

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

redis cluster配置之read-mode_第3张图片

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模式下,三主也是可以正常运行的

你可能感兴趣的:(redis,redis,缓存,分布式)