凌晨两点,数据王国有限公司的董事会会议室被一堵隔音墙劈成两半:左边两位董事、右边三位董事,谁也听不见谁。两边的董事各自举手,选出了两位董事长。第二天公司乱成一锅粥——仓库收到两份互相矛盾的发货单,财务账本对不上,客户电话被打爆。这个荒诞又真实的灾难,在 Elasticsearch 世界里每天都在上演,名字令人毛骨悚然:脑裂(Split Brain)。 ES 集群由多台服务器手拉手组成“董事会”,唯一的 master 负责调度分片、维护集群状态。可一旦网络分区把服务器隔成两个互不知晓的小组——光缆被挖断、交换机拥塞、甚至某台机器 JVM 垃圾回收卡了十几秒——两个小组就可能各自冒出 master,集群从此有了两个大脑。两个大脑同时下令写数据,同一份文档被写进不同位置,数据互相覆盖,后果比宕机可怕得多。 好消息是,分布式系统早已发明了对抗脑裂的数学武器:法定人数(quorum)与最小 master 节点配置。今天我们从这场董事会危机讲起,看看 ES 如何用“过半数”这条朴素的规则,把两个大脑重新拧成一个。

岗位关联

对 AI 从业者而言,脑裂是分布式系统“一致性 vs 可用性”博弈的浓缩案例;吃透它的成因、quorum 防线与恢复套路,是 ES 运维与平台工程师的核心竞争力。

目录
  1. 可视化演示
  2. 脑裂现象
  3. 分区成因
  4. 法定人数
  5. 选举规则
  6. 预防策略
  7. 恢复处理
  8. 高可用设计
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

分步演示Elasticsearch集群在网络分区下的脑裂过程,展示quorum机制如何通过最小master节点数防止双主问题。

本节配有交互动效(进入视口后自动加载,约 3KB)。

集群正常状态 所有5个节点互联,Node1当选Master,集群状态正常 Quorum = ⌊n/2⌋ + 1 = 3 点击下方步骤按钮查看脑裂演变过程

脑裂现象

数据王国有限公司的董事会常年风平浪静,五位董事坐在同一个会议室里,用表决器选出董事长,公司大小事务只认董事长一个人签发的文件。然而一个月黑风高的晚上,施工队不小心在会议室中央砌了一堵隔音墙,五位董事被分成东、西两个房间,彼此听不见对方的声音。第二天一早,两个房间居然各自举手,选出了两位董事长,公司上下顿时陷入混乱。

这个经典灾难场景,就是 Elasticsearch 集群的脑裂(Split Brain)。ES 集群由多个节点组成,正常情况下只有一台 master 节点负责管理集群状态、分配分片。当网络发生分区(network partition)时,节点被割裂成两个互不知晓的小集群,两边都试图维持或选出自己的 master,集群便“裂开”成两个大脑。

脑裂最直接的恶果是数据不一致。两个 master 同时收到写请求,都认为自己有权分配分片、维护集群元数据,于是同一份文档可能被写进两个不同位置,索引的分片路由表发生冲突;当网络恢复、两边尝试合并时,数据已然互相覆盖,某些提交从日志视角消失了——这就是典型的“双写覆盖”问题。轻则数据丢失,重则整个集群红屏并要求手工重建分片。

回到董事会:两位董事长都拿着唯一的公章,各自给财务部、仓库部下指令,仓库根本不知道该听谁的,账目自然对不上。脑裂的本质不是“多了一台机器”,而是“决策权出现了双头”。理解了这一点,才能理解为什么所有防脑裂手段的终极目标都是——让集群永远只有一个头。

分区成因

隔音墙不是凭空出现的。工程师走上天台发现,西北角的交换机闪了三个小时红灯,两根光缆一根被工地挖断、一根被老鼠咬穿;而楼下机房的老旧服务器风扇嗡嗡作响,其中一台每过几小时就要“打盹”一分钟。任何让节点之间无法通信的故障,都可能成为那堵墙。

在 ES 中,节点间通过心跳(heartbeat)保持联络,discovery.zen.ping_timeout 规定了容忍的失联时长。网络抖动、交换机拥塞丢包、防火墙误杀端口、光缆被挖断——这些网络层面的故障是最常见的分区来源,它们让节点“实际活着、逻辑失联”。

更隐蔽的元凶在应用层:JVM 长时间 Full GC。垃圾回收进入 Stop-The-World 时,整个 JVM 暂停数秒甚至数十秒,节点发不出任何请求,其他节点收不到心跳,就会把它标记为“失联节点”并触发重新选举。明明进程没死,却跟死了一样——这就是“假分区”。此外,磁盘 IO 卡死、内存交换(swap)也会造成类似假死。

所以排查脑裂,不要只盯着网线。先看网络层,再看 GC 日志,再看磁盘 IO。把每一种可能的“隔音墙材料”列出来逐一排除,才是合格的 ES 运维习惯。记住:分区是现象,“消息无法送达”才是本质。

不可达判定:Δt心跳>Ttimeout\displaystyle \text{不可达判定}:\quad \Delta t_{\text{心跳}} > T_{\text{timeout}}
这条公式说的是:只要心跳间隔超过超时阈值,节点就被判为失联,无论它其实只是在打盹。
  1. 心跳间隔$\Delta t_{\text{心跳}}$ 表示相邻两次心跳到达的时间间隔,长期收不到即为失联。
    Δt心跳\Delta t_{\text{心跳}}
  2. 超时阈值$T_{\text{timeout}}$ 由 discovery.zen.ping_timeout 决定,是容忍上限,默认约 3 秒。
    TtimeoutT_{\text{timeout}}
  3. 判定失联一旦间隔超过阈值,节点被标记不可达,触发退位与重选流程。
    Δt心跳>Ttimeout\Delta t_{\text{心跳}} > T_{\text{timeout}}

法定人数

董事会章程里有句话后来被奉为圣经:“任何决议须有过半数董事在场方为有效。”五个人至少要三人同意才能批钱、换人、签合同。这不是民主礼仪,而是数学防身术——因为世界上不可能同时存在两个“超过一半”的群体,只要坚持过半数,就永远不会出现两个合法决策中心。

这正是 ES 的 quorum(法定人数)机制。集群里真正有资格参与 master 选举的节点数记为 n,quorum 的计算公式是半数加一。选出的 master 必须获得至少 q 票;当网络分区发生时,只有节点数 ≥ q 的那一侧才被允许继续持有 master,另一侧必须乖乖退位。

为什么是“半数 + 1”而不是“半数”?因为两个恰好一半的子集可以同时存在(例如 4 节点平均切成 2 和 2,两个 2 都算“半数”),而两个“过半数组”在数学上必须相交,不可能各占半壁江山。$+1$ 这颗子就是用来打破平票的。这也解释了为什么生产环境偏爱奇数节点:3、5、7。偶数节点(比如 4)被切成 2-2 时,两边都凑不满 3 票,集群失去 master、全体拒绝写入,虽然避免了脑裂,却“死”得更彻底。奇数加过半数,才是既防脑裂又保活命的最优解。

q=⌊n2⌋+1\displaystyle q = \left\lfloor \frac{n}{2} \right\rfloor + 1
例如 5 节点集群的法定人数是 3,4 节点集群的法定人数也是 3——这个“加一”是防脑裂的数学核心。
  1. 候选总数n 为可参与 master 选举的节点总数,只有“董事”才有投票权。
    nn
  2. 取半数$\left\lfloor \frac{n}{2} \right\rfloor$ 对半数向下取整,算出半边。
    ⌊n2⌋\left\lfloor \frac{n}{2} \right\rfloor
  3. 加一防平$+1$ 保证严格过半,任何两个合法多数派必然相交,彻底杜绝双主。
    ⌊n2⌋+1\left\lfloor \frac{n}{2} \right\rfloor + 1

选举规则

董事长不能空降。章程写明了继任流程:先喊话确认现任董事长是否还在位,喊三声没人应,才轮到下面的人拉票。ES 的 master 选举也遵循同样的“先探活、后投票”流程。当节点发现 master 失联(ping 超时),就会把候选节点加入票箱,发动一轮选举。

选举不是比嗓门大。每个 master 候选节点都会为自己投票并拉取其他节点的投票,最终统计得票。只有当得票数同时满足两个条件——达到法定人数 q,且高于所有竞争对手——才宣布自己当选。任何一条不满足,选举作废,等待下一次触发。

防脑裂的硬性约束就嵌在当选校验里:假设集群被切成 3 和 2,右侧 3 人凑够了 q=3 票,左侧 2 人只有 2 票。左侧即使强行开会,选出的“董事长”也过不了法定校验——他拿不到合法身份,自然不会获得客户端信任。选举规则本身就是最后一道防火墙。回到比喻:两个房间确实都会尝试选举,但章程规定“得票不过半的当选无效”。房间里贴着的公式 q=⌊n/2⌋+1,就是每间房票箱旁的显眼告示,这就是 ES 把 quorum 写进选举逻辑的智慧。

v候选≥q且v候选>v其他\displaystyle v_{\text{候选}} \geq q \quad\text{且}\quad v_{\text{候选}} > v_{\text{其他}}
当选是“过线 + 第一”的双重校验:既要凑满法定人数,又必须是得票最高者。
  1. 候选得票$v_{\text{候选}}$ 表示某个候选节点获得的票数。
    v候选v_{\text{候选}}
  2. 过法定线先要求 $v_{\text{候选}} \geq q$,票数不够直接出局。
    v候选≥qv_{\text{候选}} \geq q
  3. 压过对手再要求比所有其他候选人都高,避免平票僵局。
    v候选>v其他v_{\text{候选}} > v_{\text{其他}}
  4. 同时成立两个条件取交集,缺一不可,这就是当选举校验的完整判决。
    v候选≥q  且  v候选>v其他v_{\text{候选}} \geq q \;\text{且}\; v_{\text{候选}} > v_{\text{其他}}

预防策略

光在章程里写“过半数有效”还不够,如果没人执行就是废纸。数据王国的做法是把这条规则用钢板刻在门厅,并派专人每天检查:任何房间门口的核对表都写着“必须看到至少 3 位董事在场,才允许进行董事长交接”。在 ES 里,这块钢板就是 discovery.zen.minimum_master_nodes 配置项。

minimum_master_nodes 的值应该设置为可参与 master 选举节点数(记作 M)的半数加一。配置后,即使发生分区,任一区块的节点数少于该值,就既不能选举新 master,也不允许已持有的 master 继续工作,从源头扼杀脑裂。

配套策略同样重要:一是把决策和存储分离,设置专用 master 节点(node.master: true、node.data: false),让最重要的选举过程不被数据查询拖累;二是保证网络与 JVM 稳定,合理设置堆大小、避免 swap、控制 GC 停顿;三是扩容缩容时同步修改 minimum_master_nodes,否则配置陈旧会让防线形同虚设。这块钢板不怕断电、不认人情,但它只会执行写好的数字。节点从 3 台扩到 5 台,法定数若还停留在 2,两个分区各 3 人时两边都能“过半数”,脑裂照样发生。防脑裂的最后一句话永远是:改集群规模,先改章程。

minimum_master_nodes=⌊M2⌋+1\displaystyle \text{minimum\_master\_nodes} = \left\lfloor \frac{M}{2} \right\rfloor + 1
M 表示有资格成为 master 的节点数;此配置是 ES 防脑裂最经典的“钢板条款”。
  1. 候选节点数M 为集群中有资格成为 master 的节点数,只算“董事”不算“员工”。
    MM
  2. 半数取整$\left\lfloor \frac{M}{2} \right\rfloor$ 先对半数向下取整。
    ⌊M2⌋\left\lfloor \frac{M}{2} \right\rfloor
  3. 法定下限加一后得到配置值,例如 M=5 时应填 3,M=3 时应填 2。
    ⌊M2⌋+1\left\lfloor \frac{M}{2} \right\rfloor + 1

恢复处理

如果隔音墙已经砌好、两位董事长都已经上任,第一步不是冲进去砸墙,而是先冷静盘点:墙哪边的董事更多?哪边的决策才是合法的?在 ES 里,危机响应同样讲究“先诊断,后处置”。

排查阶段使用集群状态接口:GET _cluster/health 查看集群颜色,GET _cat/nodes 查看节点归属,GET _cat/master 确认两边的 master。根据 quorum 判定哪一侧是多数派:保留多数派的 master,把少数派一侧的 master 进程停掉,或临时降级其角色,逼它重新加入多数派。

网络恢复后数据如何收敛?多数派的分片数据被视为“正本”,少数派节点重新加入时,会以多数派为准同步副本,少数派在分区期间产生的孤立写入可能被丢弃。这听上去残酷,但分布式系统必须接受“少数服从多数”的最终一致性——毕竟两本账里只能留一本。

若两边都凑不够法定人数(比如 4 节点切成 2-2),集群会整体停摆。此时需人工介入强制恢复:先恢复网络,再以集群最大可用性为首要目标,手动指定一个 master 候选并重启相关节点,让分片重新调度。就像总公司派督导一锤定音——人类管理员的最后一击,永远是分布式系统兜底的王牌。

高可用设计

真正成熟的董事会不会等隔音墙出现才想对策。他们在选址时就把董事分散安置在三栋不同的大楼里,大楼之间各有独立供电与网络链路,还故意把董事总数定成奇数——这样无论哪栋楼失联,剩下几栋加起来仍是多数派。ES 高可用设计的底层逻辑,与之如出一辙。

首先是节点布局:master 候选节点保持奇数(3/5/7),并分散到不同机架、不同可用区(AZ);数据节点同理,副本分片分布在至少两个 AZ,单机房失联也不丢数据。同时避免 2 节点集群——它一裂就全挂,是生产环境的高危脆皮。

其次是参数与流程:minimum_master_nodes 随集群规模动态调整;discovery 的 ping 超时与重试次数要兼顾“灵敏”与“不误伤”;版本升级、扩缩容都走滚动方式,保证任何时刻多数派在线。还可增加协调节点分担查询压力,让 master 候选节点更纯粹。

最后是最朴素的成本观:高可用不是堆机器,而是算清楚“能容忍几次失败”。$f=\left\lfloor (n-1)/2 \right\rfloor$ 告诉你可以容忍多少个节点同时挂掉;当业务要 99.99% 可用性时,你自然明白该买 5 台而非 3 台。隔音墙无法预测,但你可以让公司无论如何都有一间能开会的房间。

f=⌊n−12⌋\displaystyle f = \left\lfloor \frac{n - 1}{2} \right\rfloor
容错评估公式:n 个 master 候选节点最多能容忍多少个节点同时挂掉而不失去法定人数。
  1. 节点总数n 为 master 候选节点数。
    nn
  2. 自身占位$n - 1$ 先去掉一个 master 本身的故障额度。
    n−1n - 1
  3. 对半容忍除以 2 向下取整,得到最大可容忍故障数,例如 n=5 时 f=2,n=3 时 f=1。
    ⌊n−12⌋\left\lfloor \frac{n-1}{2} \right\rfloor

AI 应用场景

电商大促前的集群脑裂体检

阶段:集群稳定性评估与预案演练

解决的问题:大促流量高峰前,网络抖动和 GC 压力都可能诱发分区。传统做法靠人肉盯监控,发现问题时脑裂已造成写入失败。AI 化思路是训练“心跳异常检测模型”,基于节点心跳延迟、GC 耗时、丢包率等时序特征,提前数分钟预测“假失联”风险,并自动校验 quorum 与 minimum_master_nodes 是否匹配当前节点数,把事故消灭在萌芽。

具体案例:某电商在大促前对 5 节点 ES 集群做分区演练,模拟右侧 3、左侧 2 的切割,监控脚本自动比对两侧可投票数,确认只有右侧满足 q=3,随后自动下掉左侧旧 master 并恢复链路,全程 2 分钟完成收敛。

日志平台的多可用区高可用改造

阶段:架构设计与容量规划

解决的问题:单机房部署的日志集群一旦遭遇机房级故障就整体脑裂或停摆。采用奇数 master 候选 + 多 AZ 分散 + minimum_master_nodes 动态配置,以及分片副本跨 AZ 存放,让单机房失联时其余 AZ 仍构成多数派,写入不中断。

具体案例:某金融日志平台把 5 个 master 候选分散到两个可用区(3+2),副本数设为 2,并在维护脚本中内置“扩容先改法定数”的检查器,出现配置陈旧时直接拦截变更,从流程上杜绝人为疏漏。

脑裂自动仲裁与告警恢复

阶段:智能运维(AIOps)故障自愈

解决的问题:脑裂发生后人工排查耗时且易出错。通过定时采集 _cluster/health、_cat/master 数据,用规则引擎判断是否存在两个 master,自动对照 quorum 判定多数派,执行“保多杀少”的降级脚本,并向值班人推送处置报告。

具体案例:某 SaaS 厂商为 10+ 个 ES 集群部署统一仲裁器,检测到双主后 30 秒内完成多数派保留与少数派下线,事后自动比对分片版本,把冲突写入标记出来供业务侧做数据补偿。

Python 演示

python48 行
# -*- coding: utf-8 -*-import random  def quorum(n):    return n // 2 + 1  def split_cluster(nodes, cut):    return nodes[:cut], nodes[cut:]  def elect(side, limit):    votes = len(side)    if votes >= limit:        return random.choice(side), votes, True    return None, votes, False  def simulate(nodes, cut, limit):    left, right = split_cluster(nodes, cut)    l_leader, l_votes, l_ok = elect(left, limit)    r_leader, r_votes, r_ok = elect(right, limit)    print("左侧 %s 得票 %d, 有效=%s" % (left, l_votes, l_ok))    print("右侧 %s 得票 %d, 有效=%s" % (right, r_votes, r_ok))    if l_ok and r_ok:        print(">>> 脑裂: 两个分区各有一个 master")    elif l_ok or r_ok:        print(">>> 安全: 只有多数派持有 master")    else:        print(">>> 停摆: 两边都凑不齐法定人数")    print()  def main():    nodes = [0, 1, 2, 3, 4]    q = quorum(len(nodes))    print("集群 %s, 法定人数 q=%d" % (nodes, q))    for cut in (2, 3):        print("===== 网络分区: 切在索引 %d 之后 =====" % (cut - 1))        print("[模拟] 没有 quorum 规则: 任何分区都能选主")        simulate(nodes, cut, 1)        print("[模拟] 启用 quorum 规则: 得票须达到 %d" % q)        simulate(nodes, cut, q)  if __name__ == "__main__":    main()
目的:用一台“模拟董事会”完整演示 5 节点集群在有无 quorum 规则下的脑裂、安全与停摆三种结局。
  1. def quorum(n):定义法定人数函数,核心是“半数加一”。
  2. return n // 2 + 1向下取整求半再 +1,严格过半且打破平票。
  3. def split_cluster(nodes, cut):把集群按索引切成左右两个“隔音房间”。
  4. l_leader, l_votes, l_ok = elect(left, limit)模拟左侧房间选举,返回得票与是否有效。
  5. if l_ok and r_ok:两侧都有效即双主,这正是脑裂。
  6. simulate(nodes, cut, 1)无规则(limit=1)时小房间也能选主,必然脑裂。
  7. simulate(nodes, cut, q)启用 quorum 后只有多数派能持主,防线生效。
  8. if __name__ == "__main__":可执行入口,直接运行即可看到对比输出。

常见误区

误区我觉得脑裂就是网络断开导致的,只要机房网络足够稳定,就永远不会发生脑裂。

正解网络断开只是最常见的诱因之一。凡是让心跳消息无法送达的情形——交换机拥塞、防火墙拦截、JVM 长时间 Full GC 停摆、磁盘 IO 卡死——都会让节点被误判为失联。心跳超时的判定是“一定时间内没收到消息”,它并不区分对方是死了还是打盹了。比喻:董事不是离开了会议室,只是低头睡着了,别人就当他缺席开始重新投票。

为何常见:因为“分区”这个词听起来就是网络的事,而 GC 停顿这类内部原因要翻日志才能发现,初学者容易被表面现象带偏。

误区把最小 master 节点数设为 1,这样随便哪个分区都能快速选出 master,服务不中断,不是更好吗?

正解设为 1 等于取消防线:任何一个小分区(哪怕只有 1 个节点)都能单方面宣布自己拥有 master,网络恢复时必然出现多主并存。正确做法是半数加一,宁可让少数派暂时失去 master,也不能让两个 master 同时存在。比喻:把“过半数在场”改成“一个人在也算开会”,会议室肯定变成“一人一个公司”。

为何常见:初学者天然把“可用性”理解为“随时有主”,却忽略了脑裂导致的数据损坏远比短暂不可用更致命。

误区只要把集群节点加得足够多,脑裂就不会发生。

正解节点多不等于防线强。脑裂取决于分区两侧的节点数量对比和 quorum 配置。5 节点被切成 3-2 时只有一侧够法定数;但如果扩到 6 台却配成 3-3,或扩容后忘记更新 minimum_master_nodes,照样可能出问题。关键不是数量而是“奇数 + 配置同步”。

为何常见:人们直觉以为“人多力量大”,却忽略了分布式系统的容错取决于算法参数而非绝对规模。

误区出了双主就把其中一个 master 节点重启一下,数据会自动恢复一致。

正解直接重启风险很大:如果重启的是多数派一侧的 master,或重启时机不对,可能让少数派的旧数据“翻身”,已提交数据被回滚丢弃。正确流程是:先确认哪一侧满足法定人数并保留它,再降级/下线少数派,最后等分片重新同步收敛。比喻:两位董事长都在批单,不先分清谁合法就乱撤职,只会让已经批出去的单子更乱。

为何常见:运维新手习惯“重启大法”,但分布式环境下重启是“改变集群成员”的高危操作,必须先确认多数派。

面试题

Q1. ES 集群中“脑裂”指的是什么?

单选题 · easy

  • A.主分片数据在宕机后直接丢失
  • B.集群降级成黄色且拒绝写入
  • C.一个集群分裂成两个独立集群← 正确答案
  • D.多台节点同时重启导致服务中断

答案:C。脑裂特指一个集群被网络分区切成两个互不知晓的小集群,且各自选出 master。A 是节点故障后果,B 是集群降级,D 是运维操作,均非“双主并存”的脑裂定义。比喻:两个房间各选一位董事长,才是脑裂。

Q2. 一个 5 节点 ES 集群的 quorum(法定人数)是多少?

单选题 · easy

  • A.至少需要 2 票
  • B.至少需要 3 票← 正确答案
  • C.至少需要 4 票
  • D.至少需要 5 票

答案:B。q = ⌊5/2⌋ + 1 = 2 + 1 = 3。选举与持主都要求至少 3 票,2 票只是半数无法形成多数派;4、5 票超过法定人数,不可能是 quorum。公式的“加一”就是用来杜绝平票的。

Q3. 配置 discovery.zen.minimum_master_nodes 的主要目的是什么?

单选题 · easy

  • A.提升集群写入吞吐与并发性能
  • B.只有多数派才可持有 master 权← 正确答案
  • C.自动修复分片未分配的问题
  • D.强制所有节点同时完成升级

答案:B。该配置的目的是:只有达到法定人数的分区才有资格持有或选出 master。它不提升吞吐(A)、不修分片(C)、也与升级无关(D)。比喻:它就是章程里“过半数才许开会”的钢板条款。

Q4. 以下哪个因素可能诱发“假分区”导致脑裂误判?

单选题 · mid

  • A.网络分区只是交换机的物理故障
  • B.JVM 长时间停顿导致心跳超时← 正确答案
  • C.分片副本数量配置得过少
  • D.索引模板设置发生了改变

答案:B。JVM 长时间 Full GC 会停摆所有心跳,节点被其他节点误判为失联,形成“假分区”。A 是真实分区的物理成因,C、D 与心跳无关。比喻:董事只是睡着了,别人却以为他走了。

Q5. 下列哪些属于 ES 脑裂的预防措施?

多选题 · mid

  • A.使用奇数数量的候选 master 节点← 正确答案
  • B.配置最小 master 节点为半数加一← 正确答案
  • C.把最小 master 节点配置成一票
  • D.专用 master 与数据节点分离← 正确答案

答案:ABD。奇数候选、最小值=半数+1、专用 master 分离职责,都是防脑裂的正规军;把最小值设成 1 等于撤掉防线,任何小分区都能自立为王,C 错误。

Q6. 6 节点 master 候选集群被切成 3-3,会发生什么?

单选题 · hard

  • A.两侧都无法凑足法定人数而停摆← 正确答案
  • B.两侧各选出一个 master 继续运行
  • C.自动合并成一个 master 保持服务
  • D.数据全量复制到一侧快速恢复

答案:A。6 节点 quorum = ⌊6/2⌋+1 = 4,切成 3-3 后两侧都只有 3 票 < 4,两边都选不出 master,集群整体停摆。这正是偶数节点既防了脑裂、又害自己“死透”的死穴。

Q7. 已经发生脑裂后,恢复处理的第一步应该做什么?

单选题 · hard

  • A.直接重启全部分区中的所有节点
  • B.判断哪一侧满足法定数并保留← 正确答案
  • C.删除所有索引避免数据冲突
  • D.立即提高副本数重新分配数据

答案:B。恢复第一步是确认哪一侧满足法定人数并保留其 master,再把少数派降级。A 乱重启可能让少数派旧数据翻身;C 删索引是灾难性操作;D 不解决双主问题。比喻:先分清谁合法,再谈撤谁的职。

Q8. quorum 公式 q = ⌊n/2⌋ + 1 中的 n 指的是什么?

单选题 · mid

  • A.集群内所有数据节点的数量
  • B.可参与 master 选举的节点数← 正确答案
  • C.所有分片与副本的总数量
  • D.客户端建立连接的最大数

答案:B。quorum 公式里的 n 只统计“有资格参与 master 选举的节点”,与数据节点、分片数量、客户端连接数无关。比喻:只有董事才有投票权,股东再多也不算数。

Q9. 关于脑裂导致的数据损坏,下列说法正确的是?

多选题 · hard

  • A.双 master 会同时修改同一分片← 正确答案
  • B.少数派分区的写入可能会被丢弃← 正确答案
  • C.网络恢复后所有数据自动完整
  • D.副本与主分片版本互相覆盖← 正确答案

答案:ABD。双 master 会对同一分片双写(A),少数派写入在收敛时以多数派为准被丢弃(B),副本与主分片版本互相覆盖(D)。C 想当然了——网络恢复只是恢复通信,已覆盖的数据不会自动复原。

Q10. 为什么 2 节点的 ES 集群被强烈不建议用于生产?

单选题 · extreme

  • A.任意分区都会造成脑裂或整体停摆← 正确答案
  • B.写入并发能力低无法支撑大流量
  • C.安装部署需要额外的安全证书
  • D.不支持跨机房的多副本分配

答案:A。2 节点集群任意分区都极其危险:切成 1-1 时两边各 1 票都达不到法定数(q=2)→ 停摆;若把 min master 设为 1 → 每边都能当选 → 脑裂。B、C、D 都不是它被禁止的本质原因。