备份与灾难恢复
灾难恢复是一个谱系,而非单一的方案。影响范围决定了应对手段:丢失一个 follower,集群会自动消化、毫不受影响;丢失全部节点,则需要从外部备份冷启动。本页将每种故障模式映射到对应的补救措施,再对比两种备份策略——OSS Cluster Backup 与 Premium Cluster Standby——以便你根据自己的 RTO 和 RPO 选择合适的方案。
关于 recording、snapshot 和 recording log 在底层的实际工作原理,请参阅 The Aeron Files。本页聚焦于运维恢复。
灾难恢复场景,按严重程度排序
Section titled “灾难恢复场景,按严重程度排序”四种场景覆盖了现实中的故障空间,按严重程度排列:
| 场景 | 严重程度 |
|---|---|
| Follower 节点丢失 | 低——集群继续运行,自动恢复 |
| Leader 节点丢失 | 中——短暂选举,自动恢复 |
| 最新快照丢失 | 中——回退到更早的快照 + 更长的回放 |
| 全部节点丢失(仅数据库存活) | 严重——需要完整重建 |
各场景的恢复方法
Section titled “各场景的恢复方法”根据严重程度匹配补救手段。越往下,你越需要依赖工具和外部备份,而不是 Aeron 的内建机制。
- Follower 丢失 → 重启该节点。它会通过 snapshot + log 回放自动从 leader 追平。
- Leader 丢失 → 自动选举产生新的 leader。旧 leader 以 follower 身份重启并追平。
- 快照丢失 → 使用
ClusterTool检查 recording log,使损坏的快照失效,并回退到更早的快照,配合更长的 log 回放。 - 全部节点丢失 → 从外部备份冷启动(来自 Archive 或 Cluster Backup/Standby 的 snapshot + log recording)。
Cluster Backup (OSS) 对比 Cluster Standby (Premium)
Section titled “Cluster Backup (OSS) 对比 Cluster Standby (Premium)”针对关键的「全部节点丢失」场景,你需要用外部备份来保护自己。有两个选择。最终的取舍可归结为一个词:热(warm)还是冷(cold)。
| 特性 | Cluster Backup (OSS) | Cluster Standby (Premium) |
|---|---|---|
| 可用性 | 开源(Apache 2.0) | Premium(商业) |
| 用途 | 将 log 复制到远端位置以用于 DR | 用实时 standby 节点扩展部署 |
| 节点状态 | 被动——不处理消息 | 主动——实时处理每一条消息 |
| 恢复速度 | 较慢——取决于快照新旧程度 + log 回放时长 | 较快——近乎即时切换,无需回放 |
| 故障切换时的数据丢失 | 较高——取决于最后一次备份同步点 | 极小——仅丢失传输中的未提交消息 |
| 恢复机制 | 通过 log 回放重建集群状态 | 翻转一个标志,将 standby 切换为 active |
| 带宽灵活性 | 不可配置 | 可配置——单节点或全节点路由 |
| 对 Leader 的背压 | 若将远端节点加入集群,可能造成背压 | 对 leader 无背压 |
| 使用场景 | 在恢复时间可接受的前提下,防范整个 DC 丢失 | 以最小停机和数据丢失实现快速故障切换 |
根据你的恢复目标和预算来选择:
需要快速故障切换(<60s)+ 最小数据丢失? → Cluster Standby (Premium)需要基础 DR 且恢复时间可接受? → Cluster Backup (OSS)预算受限但仍需要一定的 DR? → Cluster Backup (OSS)跨区域运行且 RPO/RTO 要求严格? → Cluster Standby (Premium)进一步深入,热与冷的区别体现在 license、复制、恢复和运维四个方面。ClusterStandby 随 premium jar 一同发布;ClusterBackup / ClusterBackupMediaDriver 则是 OSS。
License 与 API
Section titled “License 与 API”| Cluster Standby (Premium) | ClusterBackup (OSS) | |
|---|---|---|
| License | Aeron Premium(商业) | OSS(Apache 2.0) |
| API | ClusterStandby(premium jar) | ClusterBackup / ClusterBackupMediaDriver |
| Standby 类型 | 热——主动处理每一条消息 | 冷——复制 recording,在恢复时回放 |
| Cluster Standby | ClusterBackup | |
|---|---|---|
| 复制 snapshot recording | 是(作为消息处理的一部分) | 是(自动) |
| 复制 log recording | 是(作为消息处理的一部分) | 是(自动) |
| 在 standby 上运行 ClusteredService | 是——处理每一条消息 | 否——仅 archive 级别的复制 |
| Standby 状态与主集群一致 | 是——近乎实时 | 否——状态仅在 archive 中,不在内存中 |
| 持续同步(实时 log tailing) | 是 | 是——保持在 BACKING_UP 状态 |
| 感知 Leader | 是——跟随 leader 变更 | 是——查询集群共识 |
延迟的故事就在这里。Cluster Standby 的 RTO 近乎为零,因为状态已经在内存中——无需加载 snapshot,也无需回放 log。ClusterBackup 则要付出数分钟的代价,因为它必须复制数据并启动一个全新的集群。
| Cluster Standby | ClusterBackup | |
|---|---|---|
| RTO | 近乎为零——「设置一个标志」即可激活 | 数分钟——复制数据 + 启动集群 |
| 故障切换机制 | 运维人员设置标志 → standby 变为 active | 复制 recording.log + archive → 启动新集群 |
| 状态重建 | 已在内存中——无需回放 | 集群加载 snapshot + 回放 log |
| 数据丢失窗口 | 仅传输中的未提交消息 | 直到最后一次备份同步点 |
| 对 Leader 的背压 | 无 | 极小 |
| Cluster Standby | ClusterBackup | |
|---|---|---|
| 是否需要自定义代码 | 否(仅需配置) | 极少——ClusterBackupMediaDriver.launch() |
| Snapshot + log 回放 | 不需要——状态已实时存活 | 恢复时自动进行 |