第 10 章 —— 成员视图与稳定性判断
本章目标: 本章完成后,开发者能够区分成员事件、当前可见成员和稳定成员视图,并解释为什么高风险 Lease 不能对一次成员观察立即作决定。
学习目标
- 说清成员发现、故障怀疑、离开与恢复分别代表什么。
- 区分
activeMembers()、clusterSize()与稳定集群大小。 - 解释
serviceId如何阻止不同逻辑集群互相发现。 - 用成员稳定窗口保护 QUORUM Lease。
前置条件
- 已完成第 4 章的双节点复制实验。
- 已理解第 7 章 Lease 的 fencing 与 QUORUM 模式。
- 不再把「网络暂时没回应」直接等同于「节点永久离开」。
案例进度
履约集群加入 node-b 后,node-a
先看见成员事件,随后才连续看到相同的成员数量。就在这段抖动窗口里,worker
想领取
orders-17。团队需要决定:用哪一个成员视图计算多数派?
一次观察不是全局事实
ClusterMembership 同时承担两类责任:提供成员观察,也提供
DSM 控制面和数据面通信通道。它公开
self()、activeMembers()、clusterSize()、membershipRoundInterval(),以及成员和数据监听器。但这些方法给出的是当前节点的本地观察,不是线性一致的集群名册。
| 信号 | 能说明什么 | 不能说明什么 |
|---|---|---|
NodeJoined |
本节点收到加入信息 | 所有节点已形成相同视图 |
NodeSuspected |
故障检测开始怀疑某节点 | 该节点已经永久失败 |
NodeLeft |
本节点确认离开或收到离开信息 | 分区另一侧也已确认 |
activeMembers() |
当前可通信的成员集合 | 原始集群总规模已经改变 |
clusterSize() |
实现认为的集群规模 | 这个规模已连续稳定多轮 |
测试替身故意把 clusterSize() 与
activeMembers()
分开:发生分区时,原始集群规模保持不变,而当前可见成员减少。这样 QUORUM
判断不会把单个节点的局部视图误判为完整集群,并据此错误放行。
稳定窗口为何存在
MembershipStabilityTracker 连续观察成员规模。只有达到
quorumStabilityRounds,stableClusterSize()
才从 -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 的租户/应用隔离。
反例与故障注入
- 让三节点集群中的两个节点互相分区。
- 在孤立节点上读取
activeMembers(),它可能只看到自己。 - 若错误地用可见数
1当总规模,则多数派门槛变成1,孤立节点会误判可写。 - 正确实现保留集群规模或等待稳定视图,因此 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 行为测试 |
| 本实验未证明 | 跨主机网络质量、真实组播可达性、生产故障检测阈值合适 |
回顾
- 成员视图是本地观察,不是瞬时全局事实。
activeMembers()与原始集群规模承担不同角色。- 高风险多数派判断需要等待连续稳定轮次。
serviceId隔离逻辑集群,但不替代集合级租户边界。
下一步
成员终于稳定了。第 11 章沿着一次
route-hints.put,追踪从本地提交到远端可见的完整 delta
路径。