集群部署
部署拓扑、加入与发现、Gossip、优雅退出流程与图示
本文用图示说明集群的部署形态、节点加入与发现、Gossip 同步、故障检测与优雅退出,便于理解部署拓扑与运行时行为。
部署拓扑
集群有两种典型部署形态:单数据中心(单 DC)与多数据中心(多 DC)。种子(Seeds)用于首次发现,之后通过 Gossip 持续收敛视图。
加载图表…
加载图表…
要点:
- Seeds:节点启动时仅知 Seeds(或 SeedsByDC);无种子或本节点在种子列表中时,该节点以种子身份自举(Bootstrap),不向他人发起 Join。
- advertiseAddr:必须与 Seeds 中使用的地址一致,其他节点通过该地址连接本节点。
- 多 DC:使用 WithClusterSeedsByDC 按 DC 配置种子,加入时优先连本 DC 种子;跨 DC 故障检测与 Gossip 可单独配置超时与间隔(见 多数据中心)。
节点加入与发现流程
节点启动后,NodeActor 在 OnLaunch 中决定是“自举为种子”还是“向种子发起 Join”。成功后合并视图并启动 Gossip 与故障检测。
加载图表…
加载图表…
- Join 请求发往种子的
/@cluster路径(即 NodeActor 的远程路径)。 - 种子侧可配置 JoinAllowAddresses / JoinAllowDCs、JoinSecret(AuthToken)、协议版本范围;不满足则返回错误,新节点继续尝试其他种子或退避重试。
Gossip 与视图同步
成员视图通过周期性 Gossip 在节点间扩散;状态变更(如新成员加入、故障剔除)会立即广播一轮,不等到下一周期。
加载图表…
加载图表…
- 同 DC:由 DiscoveryInterval 驱动 GossipTick;跨 DC 若配置了 CrossDCDiscoveryInterval > 0,另有一轮 GossipCrossDCTick,目标仅限跨 DC 节点。
- 合并时使用 VersionVector 比较因果顺序,VersionConcurrent 时按 VersionConcurrentStrategy 决定是否采纳对方的 Epoch/Timestamp;MaxClockSkew > 0 时可拒绝过大时钟偏差,避免错误时钟主导。
故障检测与剔除
故障检测在 FailureDetectionTick 中周期执行:根据 LastSeen 与超时判断 Suspect / Down,从视图中剔除并发布事件。
加载图表…
- FailureDetectionTimeout:同 DC 成员超时未刷新 LastSeen 则先 Suspect(若配置了 SuspectConfirmDuration),再剔除。
- CrossDCFailureDetectionTimeout:对跨 DC 成员单独超时;未配置时默认采用同 DC 超时的 2 倍,减少跨 DC 延迟导致的误判。
优雅退出(Leave)
业务调用 Leave() 后,NodeActor 收到 LeaveRequest,经 LeaveCoordinator 多轮广播“本节点离开”,进入 Exiting 并回复 LeaveAck,发布 ClusterLeaveCompletedEvent 使 Leave() 返回。
加载图表…
加载图表…
- LeaveBroadcastRounds > 1 时多轮广播,提高多 DC 场景下各 DC 收敛概率;LeaveBroadcastDelay 为每轮间隔,多 DC 建议 1–2s。
节点生命周期(状态流转)
从启动到退出的状态流转见 节点生命周期;此处用状态图概括。
加载图表…
架构要点摘要
| 项目 | 说明 |
|---|---|
| NodeActor 名称与路径 | 框架创建时使用名称 @cluster,节点间通信路径为 /@cluster。 |
| 种子与自举 | 无 Seeds 或本节点在 Seeds 中时,节点以种子身份自举;否则向 seed_host:port/@cluster 发起 Join。 |
| Gossip 与视图拉取 | 成员视图通过 Gossip 消息在节点间同步;GetViewRequest 用于按需拉取当前视图(如多数派恢复)。 |
| 多 DC 配置 | SeedsByDC、CrossDCFailureDetectionTimeout、CrossDCDiscoveryInterval、MaxDiscoveryTargetsPerTickCrossDC 等见 多数据中心 与 配置选项。 |
更多配置与行为说明见 配置选项、与 Remoting 的关系 及 多数据中心。