一个老RoR项目Redis主从同步问题的解决

        帮朋友看一个2011年开发的老RoR项目,Redis用的是2.2.111版本。由于设计上的一些不合理,Redis里保存了过多的冗余数据,4年积累下来有近4个G,而且其中一些数据居然还是DB里没有的。

        在不久前的一次服务器重启后,Redis就连接不上了,前端数据也就显示不出来。Redis的架构是Master读写+关闭appendonly、Slave备份+开启appendonly,由于Redis版本太老,遂把Master升级到2.6.17(考虑到redis-rb版本还是2.2.2,没有直接部署最新版本,不过试过3.0.5也是可以支持的),重启,从备份的dump.rdb恢复数据,系统可以正常访问了,但是却出现了一个奇怪的问题:Master的CPU使用率会周期性地达到100%,通过日志看到此时是在BGSAVE,这倒不是太大的问题,关键是只有在CPU达到100%的时候,Master的数据才能被访问到,而非100%的时候被卡顿着。

        一开始怀疑是开启着的SAVE造成了系统负载过重,于是把SAVE关闭,问题依旧。之后分别把client-output-buffer-limit slave 设置为512mb 128mb 300、hz 设置为50也是没有解决问题。于是观察了一下Redis在卡顿时(也就是CPU使用率在非100%的时候)的状态,是send_bulk,由此看来也许是主从同步出了问题,遂把Slave摘掉,Master果然正常了,这说明Master在BGSAVE之后向Slave发送数据集的时候不顺畅,导致Master响应异常迟缓。

        那么此时的主从同步为什么会出现这种情况呢,想到Redis2.2~2.4与2.6及以上版本的dump.rdb格式都是不完全兼容的(可以向下兼容但不向上兼容),会不会是不同版本的Redis主从同步就会不顺畅呢,于是把Slave也升级到相同的2.6.17版本,一切OK。

你可能感兴趣的:(一个老RoR项目Redis主从同步问题的解决)