文档章节

【整理】脑裂问题

摩云飞
 摩云飞
发布于 2012/11/27 19:50
字数 1562
阅读 6607
收藏 9
在心跳失效的时候,就发生了脑裂(split-brain)。

     ( 一种常见的脑裂情况可以描述如下)比如正常情况下,(集群中的)NodeA 和 NodeB 会通过心跳检测以确认对方存在,在通过心跳检测确认不到对方存在时,就接管对应的(共享) resource 。如果突然间,NodeA 和 NodeB 之间的心跳不存在了(如网络断开),而 NodeA 和 NodeB 事实上却都处于 Active 状态,此时 NodeA 要接管 NodeB 的 resource ,同时 NodeB 要接管 NodeA 的 resource ,这时就是脑裂(split-brain)。

脑裂(split-brain)会 引起数据的不完整性 ,并且可能会 对服务造成严重影响

      引起数据的不完整性主要是指,集群中节点(在脑裂期间)同时访问同一共享资源,而此时并没有锁机制来控制针对该数据访问(都脑裂了,咋控制哩),那么就存在数据的不完整性的可能。
     对服务造成严重影响,举例来说,可能你早上上班的时候会发现 NodeA 和 NodeB 同时接管了一个虚拟 IP 。

所以,裂脑这个词是一个很形象的术语,用于描述 HA 系统危机的情景。
曾经看央视 10 套教育频道,获知“裂脑”是治疗“癫痫”病的一种手术。医生们认为癫痫病发作是由于大脑“异常放电”所至。为了阻止“异常放电”波及整个大脑(左、右半脑),就用手术来割断病人左右脑的连接神经。使今后病人在发病时至少还有半个大脑正常、能控制行为。但施行过手术的所谓“裂脑人”在术后有一段不适应期,表现得行为分裂,仿佛体内存在着2个人,时常要发生冲突。例如,右脑想让一只手去脸上挠痒痒,左脑却不认同、以为是谁的手要“登鼻子上脸”就让另一只手去阻止,于是明明是自己的 2 只手,却互不相让、扭在一起扳起了手腕……
      在“双机热备”高可用(HA)系统中,当联系 2 个节点的“心跳线”断开时,本来构成同一个整体、动作协调的 HA 系统,就分裂成为 2 个独立的个体。由于相互失去了联系,都以为是对方出了故障,2 个节点上的 HA 软件像“裂脑人”一样,“本能”地争抢“共享资源”、争着起动“应用服务”,那么必然会发生严重的后果:或者共享资源被瓜分、两边的“服务”都起不来了;或者两边“服务”都起来了,但同时读写“共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。


对付 HA 系统“裂脑”的对策 ,目前我所了解的大概有以下几条:
  • 添加冗余的心跳线。例如双“心跳线”。尽量减少“裂脑”发生机会。
  • 启用磁盘锁。正在服务一方锁住共享磁盘,“裂脑”发生时,让对方完全“抢不走”共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动解锁,另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在 HA 系统中设计了“智能”锁。即正在服务的一方只在发现“心跳线”全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。
  • 设置仲裁机制。例如设置参考 IP(如网关IP),当心跳线完全断开时,2 个节点都各自 ping 一下 参考 IP ,不通则表明断点就出在本端,不仅“心跳线”断了、对外提供“服务”的本端网络链路也路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够 ping 通参考 IP 的一端去起服务。更保险一些,ping 不通参考 IP 的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。
# What does "split-brain" mean? 
"Split brain" is a condition whereby two or more computers or groups of computers lose contact with one another but still act as if the cluster were intact. This is like having two governments trying to rule the same country. If multiple computers are allowed to write to the same file system without knowledge of what the other nodes are doing, it will quickly lead to data corruption and other serious problems. Split-brain is prevented by enforcing quorum rules (which say that no group of nodes may operate unless they are in contact with a majority of all nodes) and fencing (which makes sure nodes outside of the quorum are prevented from interfering with the cluster).
      简单来说,脑裂就是上面提到的当心跳网络出现状况的时候,集群可能分裂成几个节点组,几个节点组都分别接管服务并且访问文件系统资源(例如并发写入文件系统)导致数据损坏。实际上脑裂正常情况下是无法见到的,现代集群都应该有保护机制来避免这种情况发生。例如 RHCS 引入的 fence 的概念。
      具体情况是这样,例如 2 个节点集群,当心跳断开导致节点之间互相无法通信的时候,每个节点会尝试 fence 掉对方(确保对方释放掉文件系统资源)后再继续运行服务访问资源。这样就可以确保只有一个节点可以访问资源而不会导致数据损坏。
      所以这个也是 RHCS 为什么必须有 fence 设备的原因。很多帖子都在讨论到底要不要 fence ,官方讲法是,如果你跑生产,要保证数据不受损坏,就必须有 fence 设备。

集群出现 bug 的时候也会出现脑裂,这里就不提怎么产生脑裂了,希望大家都别碰到。。。 呵呵


© 著作权归作者所有

共有 人打赏支持
摩云飞
粉丝 367
博文 534
码字总数 952694
作品 0
徐汇
程序员
加载中

评论(2)

晴颺
涨姿势了,谢谢~
Xsank
Xsank
使用开源项目搞得集群环境,经常出现脑裂,是个涨姿势的好机会
keepalived的脑裂问题

1、什么是脑裂 脑裂(split-brain):指在一个高可用(HA)系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,结果会导致系...

西鼠
03/22
0
0
heartbeat心跳检测和裂脑

heartbeat的心跳连接:   讲过上面的描述,要部署heartbeat服务,至少需要两台主机才能完成。那么,要实现高可用服务,这两台主机之间,是如何做到互相通信互相监控的呢/   下面是两台h...

1243983186
2017/04/01
0
0
elasticsearch脑裂问题

所谓脑裂问题(类似于精神分裂),就是同一个集群中的不同节点,对于集群的状态有了不一样的理解。 正常情况下,集群中的所有的节点,应该对集群中master的选择是一致的,这样获得的状态信息...

枫林飘影
04/03
0
0
split-brain 脑裂问题(Keepalived)

脑裂(split-brain) 指在一个高可用(HA)系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏...

吞吞吐吐的
2017/09/15
0
0
Elasticsearch部分节点不能发现集群(脑裂)问题处理

什么是脑裂? 让我们看一个有两个节点的elasticsearch集群的简单情况。集群维护一个单个索引并有一个分片和一个复制节点。节点1在启动时被选举为主节点并保存主分片(在下面的schema里标记为...

键走偏锋
2017/09/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

python做文本内容指定区域字符串替换

需求: 因为公司项目需要做SEO优化,所以对项目中的各种长连接做优化,比如本文中提到的精简路径;之前已经批量吧文本的路径名字等做过修改,这里不再赘述;这里的问题是外部的路径修改了,文...

坦途abc
15分钟前
0
0
MySQL 关键字模糊匹配,并按照匹配度排序

MySQL 关键字模糊匹配,并按照匹配度排序。 方式一、按照关键字搜索,然后根据关键字所占比例排序 SELECTdrug_name,pinyinFROMtbl_drugWHEREpinyin LIKE '%AM%'ORDER BY...

yh32
24分钟前
0
0
虚拟机学习之一:java内存区域与内存溢出异常

1.运行时数据区域 java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途和创建、销毁时间,有的区域伴随虚拟机进程的启动而存在,有些区...

贾峰uk
25分钟前
0
0
Spring加载properties文件的两种方式

在项目中如果有些参数经常需要修改,或者后期可能需要修改,那我们最好把这些参数放到properties文件中,源代码中读取properties里面的配置,这样后期只需要改动properties文件即可,不需要修...

架构师springboot
41分钟前
0
0
分布式事务,原来可以这么玩?

多个数据要同时操作,如何保证数据的完整性,以及一致性? 答 : 事务 ,是常见的做法。 举个栗子: 用户下了一个订单,需要修改 余额表 , 订单 表 , 流水 表 ,于是会有类似的伪代码: st...

微笑向暖wx
44分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部