脑裂是指分布式系统中节点之间失去正常联系,导致集群分成多个孤立的子集,每个子集都认为自己是“活着”的,从而造成数据一致性和可用性的严重问题。脑裂可能由网络故障、节点故障、通信延迟等因素引起,这会导致集群状态的不一致性,进而破坏系统的正常运行。Redis中有两个关键的配置项可以解决脑裂问题,分别是min-slaves-to-write(最小从节点数)和min-slaves-max-lag(从连接的最大延迟时间)。
min-slaves-to-write是指主库最少得有多少个健康的从库存活才能执行写命令。这个配置虽然不能保证所有从库都一定能接收到主库的写操作,但是能避免当没有足够健康的从库时,主库无法正常写入,以此来避免数据的丢失,如果设置为 0 则表示关闭该功能。min-slaves-max-lag是指从库和主库进行数据复制时的ACK消息延迟的最大时间,可以确保从库在指定的时间内,如果ACK时间没在规定时间内,则拒绝写入。
这两个配置项组合后的要求是:主库连接的从库至少有多少个,并且和主库进行数据复制时的ACK消息延迟不能超过多少秒,否则主库就不会再接收客户端的请求了。有了这两项配置后,即使原主库是假故障,它在假故障期间也无法响应哨兵发出的心跳测试,也不能和从库进行同步,自然也就无法和从库进行ACK确认。此时的min-slaves-to-write和min-slaves-max-lag的组合要求就无法得到满足,原主库就会被限制接收客户端请求,客户端也就不能在原主库中写入新数据,就可以避免脑裂现象的发生了。