Redis主从同步与故障切换常见问题

主从数据不一致

原因

异步复制导致数据不一致,可能是

  • 网络传输延迟
  • 从库处理复杂命令阻塞

措施

  • 保证良好的网络环境

  • 监控从库复制进度
    通过INFO replication可以查看主库从库各自写命令的偏移(master_repl_offset及slave_repl_offset),SDK或者中间件组件可以实现复制进度的监控,避免从差值较大的从库读取数据,定期从获取用户的实例集群中移除落后从库实例。

读取过期数据

原因

惰性删除及定期删除

Redis删除策略为惰性删除及定期删除同时使用。

  • 惰性删除
    当一个数据的过期时间到了以后,并不会立即删除数据,而是等到再有请求来读写这个数据时,对数据进行检查,如果发现数据已经过期了,再删除这个数据。
    Redis3.2前从库不会进行数据过期检查,会返回旧值,3.2以上的版本会返回空值。

  • 定期删除
    Redis 每隔一段时间(默认 100ms),就会随机选出一定数量的数据,检查它们是否过期,并把其中过期的数据删除。

从库命令延后

比如执行expire命令时,从库由于未知原因阻塞导致较长时间才执行,那么最后主从库此数据过期的时间点便不一致,便会从从库读到过期时间。类似情况还有实例宕机时,利用aof恢复时重新执行了expire命令,也会导致数据生命周期延长。

措施

针对惰性删除问题,建议使用Redis3.2以上版本,当前此原因不多见了。

针对从库延迟执行expire命令问题,建议使用EXPIREAT 和 PEXPIREAT将数据过期设置为具体的时间点,当然这个要求业务实例及Redis实例有时钟同步。

配置不合理服务宕机

protected-mode 配置项

此配置项限定哨兵实例能否被其他服务器访问。

这个配置项设置为 yes 时,哨兵实例只能在部署的服务器本地进行访问。当设置为 no 时,其他服务器也可以访问这个哨兵实例。
如果 protected-mode 被设置为 yes,而其余哨兵实例部署在其它服务器,那么,这些哨兵实例间就无法通信。当主库故障时,哨兵无法判断主库下线,也无法进行主从切换,最终 Redis 服务不可用。
只有在 bind 中设置了 IP 地址的哨兵,才可以访问当前实例,既保证了实例间能够通信进行主从切换,也保证了哨兵的安全性。

protected-mode no
bind 192.168.10.3 192.168.10.4 192.168.10.5

cluster-node-timeout 配置项

此配置项设置Redis Cluster中实例响应心跳消息的超时时间。

Redis Cluster 正常运行的条件就是,有半数以上的实例都能正常运行。
如果执行主从切换的实例超过半数,而主从切换时间又过长的话,就可能有半数以上的实例心跳超时,从而可能导致整个集群挂掉,建议将cluster-node-timeout调大些(例如10~20秒)。

posted @ 2023-11-20 16:51  kiper  阅读(45)  评论(0编辑  收藏  举报