脑裂
June 27, 2024About 2 min
脑裂
脑裂(split-brain),指在一个高可用(HA)系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏。
对于无状态服务的HA,无所谓脑裂不脑裂;但对有状态服务(比如MySQL)的HA,必须要严格防止脑裂。(但有些生产环境下的系统按照无状态服务HA的那一套去配置有状态服务,结果可想而知...)
在HA集群系统中,假设节点A和节点B通过心跳检测对方的存活状态。在正常情况下,如果节点A检测不到节点B,就会接管B的资源,同理B也可能接管A的资源。如果出现网络故障,就会导致A和B同时检测不到对方的存活状态,互相接管对方的资源,这样就导致了同一个资源被多个节点访问,这种情况就是脑裂。
脑裂导致的问题:
1)数据不完整性(同时读写共享资源,导致数据损坏)。
2)服务异常(共享资源被瓜分,服务起不来)。
如何解决脑裂:
1)添加冗余的心跳线,减少脑裂出现的机会。
2)启用磁盘锁,在发生脑裂的时候协助控制资源访问。
3)设置仲裁机制。
4)fence机制(当不确定某个节点的状态时,通过fence设备强行关闭该心跳节点,确保共享资源被释放)。
备注:
对于无状态服务的HA,无所谓脑裂不脑裂,但对有状态服务(比如MySQL、Redis)的HA,必须要严格防止脑裂。