雨翔河
首页
列表
关于
redis 集群主从切换扩容
2019-09-19 15:03
redis集群因为业务增长导致内存容量不足,理论上单节点内存16g左右的话,扩节点的是很合适的,但是现在单节点内存不高且想无感知的扩容。 如果扩节点的话是需要起节点加节点然后迁移槽和数据,还有一种很骚的操作没这么复杂,直接先升级从节点的内存,然后主从切换,切换好了之后直接升级原主节点的内存,这样无缝无感知的完成了节点内存扩容。 理论上这种方式在PPT上是写的很完美的,先升级从节点的内存,然后主从切换,再升级,但是实际操作上却发现再好的PPT方案也拦不住老代码神奇代码的摧残。 但是在进行主从切换的时候遇到了一个问题,所有的连接到这套redis集群的应用日志报错刷屏了。 ``` redis.clients.jedis.exceptions.JedisDataException: EXECABORT Transaction discarded because of previous errors. at redis.clients.jedis.Protocol.processError(Protocol.java:127) at redis.clients.jedis.Protocol.process(Protocol.java:161) at redis.clients.jedis.Protocol.read(Protocol.java:215) at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340) at redis.clients.jedis.Connection.getAll(Connection.java:310) at redis.clients.jedis.Connection.getAll(Connection.java:302) at redis.clients.jedis.Pipeline.sync(Pipeline.java:99) ``` 看这种情况是在应用里代码写的方式导致的主从切换某些redis指令执行失败,看了下代码大致是集群模式下的批量操作,在 `exec` 之后去拿到每一个 `redis` 集群的连接读取数据流的时候, redis返回了 `EXECABORT Transaction discarded because of previous errors.` 异常,这种情况挺诡异的,查了下原因,一般情况是内存不足导致的。 当时发生这种情况的时候正好是所有从节点的内存已经扩容完毕,所有主节点还处于快饱满没有扩容的情况,主从一切换成功,马上这个报错日志就开始刷。 解决方案: 重启所有连接到这个redis集群的应用即可。
类型:工作
标签:redis,集群,linux
Copyright © 雨翔河
我与我周旋久
独孤影
开源实验室