脑裂指一个集群由于网络的故障,被分为至少两个彼此无法通信的单独集群,此时如果两个集群都各自工作,则可能会产生严重的数据冲突和错误。
redis哨兵机制-脑裂:
主节点由于网络等原因,不能被哨兵感知,选举出新主节点,然后数据仍写入旧主节点,新主节点无法同步数据,旧主节点网络恢复后,被哨兵降级为从节点,从而造成数据丢失。
解决:
min-slaves-to-write 1 // 要求至少有1个slave
min-slaves-max-lag 10 // 数据复制和同步的延迟不能超过10秒
如果不能继续给指定数量的slave发送数据,而且slave超过10秒没有给自己ack消息,那么就直接拒绝客户端的写请求。这样脑裂后的旧master就不会接受client的新数据,最多就丢失10秒的数据,也就避免了大量长时间的数据丢失。
zookeeper脑裂
leader、follow节点之间的连接中断,从而选出多个leader,造成数据混乱等问题。
解决:
过半机制:只有得到集群中超过过半节点的投票,才能成为leader节点。
follow节点在处理leader节点的写请求时,会判断leader节点的epoch是否是最新的,从而只处理最新leader的请求。
其他方法:
--添加冗余的心跳线:减少脑裂发生。
--添加磁盘锁:正在服务一方锁住共享磁盘,其他节点无法获取,但需要注意异常情况下锁的释放。
--添加仲裁机制:通过第三方判断,比如ping参考IP,不通则说明自己节点存在问题,不再提供服务。