Redis怎么解决主从不同步?

案例:Redis 做大规模迁移升级,采用模拟复制的协议进行数据的传输同步

引发问题:

  1. 迁移前后Redis过期时间不一致。
  2. 迁移前后Redis key 数量不一致。

解决方案:

1、迁移前后Redis过期时间不一致

首先,在Redis社区版本中正常的主从复制也会出现过期时间不一致问题,主要是由于主从进行全同步期间,如果主库此时有expire 命令,那么到从库中,该命令将会被延迟执行。因为全同步需要耗费时间,数据量越大,那么过期时间差距就越大。

这个问题其实已经是官方的已知问题,解决方案有两个:

1、业务采用expireat timestamp 方式,这样命令传送到从库就没有影响

2、在Redis代码中将expire命令转换为expireat命令

官方没有做第二个选择,反而是提供expireat命令来给用户选择。其实从另外一个角度来看,从库的过期时间大于主库的过期时间,其实影响不大。因为主库会主动触发过期删除,如果该key删除之后,主库也会向从库发送删除的命令。但是如果主库的key已经到了过期时间,redis没有及时进行淘汰,这个时候访问从库该key,那么这个key是不会被触发淘汰的,这样如果对于过期时间要求非常苛刻的业务还是会有影响的。
而且目前针对于我们大规模迁移的时间,在进行过期时间校验的时候,发现大量key的过期时间都不一致,这样也不利于我们进行校验。

所以针对第一个问题,我们将expire/pexpire/setex/psetex 命令在复制到从库的时候转换成时间戳的方式,比如expire 转成expireat命令,setex转换成set和expireat命令

2、迁移前后Redis key 数量不一致。

针对于第二个问题,Redis key 迁移前后数量不一致问题,其实在Redis社区版本的主从复制中,也会经常出现key数量不一致。其中一个非常关键的问题是,redis在做主从复制的时候,会对当前的存量数据做一个RDB快照(bgsave命令),然后将RDB快照传给从库,从库会解析RDB文件并且load到内存中。然而在下面的两个步骤中Redis会忽略过期的key:

1、主库在做RDB快照文件的时候,发现key已经过期了,则此时不会将过期时间写在RDB中

2、从库在load RDB 文件到内存中的时候,发现key已经过期了,则此时不会将过期的key load进去

针对上述问题,目前我们将以上两个步骤都改为不忽略过期key,过期key的删除统一由主库触发删除,然后将删除命令传送到从库中。这样key的数量就完全一致了。
最终在打上以上两个patch之后,再进行迁移测试的时候,验证key过期时间以及数量都是完全一致的

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值