主从数据不一致
出现原因
主从库间的命令复制是异步进行的
- 网络延迟
- 即使从库及时收到了主库的命令,但是,也可能会因为正在处理其它复杂度高的命令(例如集合操作命令)而阻塞
解决方案
- 在硬件环境配置方面,尽量保证主从库间的网络连接状况良好
- 使用外部程序来监控主从库间的复制进度
- Redis 的 INFO replication 命令
- master_repl_offset 查看主库接收写命令的进度信息
- slave_repl_offset 从库复制写命令的进度信息
- Redis 的 INFO replication 命令
读取过期数据
出现原因
由 Redis 的过期数据删除策略引起
- Redis 同时使用了两种策略来删除过期的数据,分别是惰性删除策略和定期删除策略
- 有些命令给数据设置的过期时间在从库上可能会被延后,导致应该过期的数据又在从库上被读取到了
不合理配置项导致的服务挂掉
- protected-mode 限定哨兵实例能否被其他服务器访问
- 在应用主从集群时,要注意将 protected-mode 配置项设置为 no,并且将 bind 配置项设置为其它哨兵实例的 IP 地址。这样一来,只有在 bind 中设置了 IP 地址的哨兵,才可以访问当前实例,既保证了实例间能够通信进行主从切换,也保证了哨兵的安全性。
- cluster-node-timeout 设置了 Redis Cluster 中实例响应心跳消息的超时时间
- 建议将 cluster-node-timeout 调大些(例如 10 到 20 秒)