ARC 3理解复制、分区与修复第 10–14 章

第 10 章 —— 成员视图与稳定性判断

本章目标: 本章完成后,开发者能够区分成员事件、当前可见成员和稳定成员视图,并解释为什么高风险 Lease 不能对一次成员观察立即作决定。

学习目标

  1. 说清成员发现、故障怀疑、离开与恢复分别代表什么。
  2. 区分 activeMembers()clusterSize() 与稳定集群大小。
  3. 解释 serviceId 如何阻止不同逻辑集群互相发现。
  4. 用成员稳定窗口保护 QUORUM Lease。

前置条件

案例进度

履约集群加入 node-b 后,node-a 先看见成员事件,随后才连续看到相同的成员数量。就在这段抖动窗口里,worker 想领取 orders-17。团队需要决定:用哪一个成员视图计算多数派?

一次观察不是全局事实

从发现成员到稳定成员视图

ClusterMembership 同时承担两类责任:提供成员观察,也提供 DSM 控制面和数据面通信通道。它公开 self()activeMembers()clusterSize()membershipRoundInterval(),以及成员和数据监听器。但这些方法给出的是当前节点的本地观察,不是线性一致的集群名册。

信号 能说明什么 不能说明什么
NodeJoined 本节点收到加入信息 所有节点已形成相同视图
NodeSuspected 故障检测开始怀疑某节点 该节点已经永久失败
NodeLeft 本节点确认离开或收到离开信息 分区另一侧也已确认
activeMembers() 当前可通信的成员集合 原始集群总规模已经改变
clusterSize() 实现认为的集群规模 这个规模已连续稳定多轮

测试替身故意把 clusterSize()activeMembers() 分开:发生分区时,原始集群规模保持不变,而当前可见成员减少。这样 QUORUM 判断不会把单个节点的局部视图误判为完整集群,并据此错误放行。

稳定窗口为何存在

MembershipStabilityTracker 连续观察成员规模。只有达到 quorumStabilityRoundsstableClusterSize() 才从 -1 变成可用值;成员规模一旦变化,计数立即重置。

假设配置需要连续 3 轮稳定:

轮次 观察规模 稳定计数 stableClusterSize()
1 2 1 -1
2 2 2 -1
3 2 3 2
4 3 0 -1
5—7 3 1—3 最终为 3

QUORUM Lease 在稳定大小未知时返回 membership-unstable;视图稳定但可见成员不足多数时返回 quorum-unavailable。这是 fail closed:宁可暂时不发新租约,也不用漂移的分母计算多数派。

serviceId 是第一道隔离线

同一网络中可能同时运行开发、测试和生产集群。传输地址相同不代表它们属于同一逻辑服务。成员实现通过 serviceId 隔离发现与消息;不同 serviceId 的节点不应出现在彼此的成员列表中。

serviceId 当业务租户号也不合适。它定义的是集群级广播域;第 17 章会再加入集合 locator 的租户/应用隔离。

反例与故障注入

  1. 让三节点集群中的两个节点互相分区。
  2. 在孤立节点上读取 activeMembers(),它可能只看到自己。
  3. 若错误地用可见数 1 当总规模,则多数派门槛变成 1,孤立节点会误判可写。
  4. 正确实现保留集群规模或等待稳定视图,因此 QUORUM Lease 拒绝领取。

实验

先验证成员故障模型,再验证 Lease 门禁:

cd submodule/dsm
mvn -q -pl dsm-test-support,dsm-runtime -am \
  -Dtest=FakeClusterMembershipChaosTest,MembershipStabilityTrackerTest,InMemoryDsmLeaseRegisterTest \
  -Dsurefire.failIfNoSpecifiedTests=false test

阅读 membership-observations.json,逐项判断它属于事件、可见成员、总规模还是稳定视图。任何单个事件都不足以支持“全局已经一致”的结论。

实验验收卡

字段 内容
运行命令 上述 Maven 聚焦测试;node --test tests/chapter-assets.test.mjs
输入或故障 丢包、延迟、网络分区、怀疑、崩溃与恢复;成员规模变化
可观察结果 当前可见成员可减少;稳定规模经过连续轮次才生效;QUORUM Lease 在不稳定时拒绝
证据等级 E2:单进程成员与 Lease 行为测试
本实验未证明 跨主机网络质量、真实组播可达性、生产故障检测阈值合适

回顾

下一步

成员终于稳定了。第 11 章沿着一次 route-hints.put,追踪从本地提交到远端可见的完整 delta 路径。

证据链接