redis异步复制导致的数据丢失
所有的写请求都指向master,当master完成指令的执行后,就可以返回客户端响应了。执行的写请求命令,会在复制积压缓冲区中,然后开启一个异步线程,源源不断的传给slave,保持slave和master数据的一致性。
但是当写命令执行完,还未从复制积压缓冲区同步给slave节点时,master发生了故障。此时这些命令影响的数据,就丢失了。
由于Sentinel cluster的存在,会将拥有不完整数据的slave节点当成新的master,当旧的master上线时,会把缺少的数据当成完整数据,同步给旧master,导致整个集群相应的数据丢失。
redis集群脑裂导致的数据丢失
当发生脑裂后,client和原master在同一个网络环境中,新master无法和client、master进行网络连接。如果这种情况持久很久,当脑裂恢复时,就会导致出现两个master,而Sentinel cluster会将旧master变为slave,将缺少数据的新master的数据,同步给旧master,导致数据的丢失。
问题解决
很遗憾,redis不保证数据0丢失,只能尽可能的保证高可用,所以以上的情况如果发生,则数据就会永久丢失。
所以解决方案的思路,应该是避免发生以上情况。
当主从节点之间的同步延迟达到一定阈值,并且发生延迟的从节点数量达到一定阈值,就说明目前redis集群整体情况很不好,要暂停对外提供服务;
min-slaves-to-write 发生延迟的从节点数量达到N个
min-slaves-max-lag 主从节点之间的同步延迟达到M秒
client端应该有应对这种情况的降级措施。