多机房与异地多活面试题:单元化、RPO/RTO、切换与脑裂
本页只放标准回答和原理跳转,完整架构、Demo与Runbook见多机房与异地多活主线。
高频问题
| 问题 | 标准回答 | 原理页 |
|---|---|---|
| 高可用和灾备区别 | HA处理局部组件故障并快速恢复;灾备面向地域级、误操作和重大故障,强调数据恢复、备用环境、RPO/RTO和演练。 | 概念 |
| 主备、双活、多活区别 | 主备只有主站承接业务;双活两站同时服务;多活多个地域服务。双活不意味着两边可无约束写同一数据。 | 概念 |
| RPO和RTO是什么 | RPO是最多允许丢多少数据,RTO是最多允许停多久;必须由业务风险倒推并通过演练测量。 | RPO/RTO |
| 单元化是什么 | 按tenantId/userId等稳定路由键把用户固定到包含应用、缓存、DB分片和MQ的业务单元,让主要业务本地闭环。 | 单元化 |
| 为什么不让所有数据全球多主 | WAN延迟和网络分区会引入提交延迟、冲突和可用性代价;应区分单元事实、全局强约束、配置和派生数据。 | 数据分类 |
| 同步复制一定RPO为0吗 | 要问同步到接收、持久化还是Apply,需要几个ACK,超时是否降级;配置和切换错误仍可能造成风险。 | 复制确认点 |
| 读己之写怎么保证 | 短时间粘到写单元、携带写位点等副本追平、核心状态读归属主站,或按业务流水返回处理中。 | 读取一致性 |
| 什么是脑裂 | 网络分区后旧主仍可写,同时备站又被提升,两边产生冲突事实。 | 脑裂 |
| 为什么切换前必须Fencing | 仅promote新主不能阻止旧主继续写;必须在存储或数据库等副作用端拒绝旧Epoch,保证单写所有权。 | Fencing |
| DNS切换为什么不即时 | 权威、递归、OS/JVM和应用都有缓存,已有HTTP/2/gRPC/WebSocket连接也不会因DNS变化自动迁移。 | 全局入口 |
| 跨机房MQ要注意什么 | 复制会延迟、重复和乱序;消费者用eventId、业务版本和状态机幂等,切换前后记录位点并核对缺口。 | MQ |
| 两个机房的Redis锁能全球互斥吗 | 不能。各地域状态独立或异步复制,核心正确性应依赖数据归属、唯一约束、状态机和Fencing。 | 锁边界 |
| 灾备集群为什么任务会双跑 | 两个K8s CronJob或调度器都可能触发;任务需要单元归属、业务幂等和Epoch,而不是只靠平时关闭备站开关。 | 任务 |
| 故障切换完整流程 | 多证据确认、冻结高风险变更、Fencing旧主、记录位点、评估缺口、提升依赖、小流量验证、分批放量和业务核对。 | 切换 |
| 为什么回切比切换复杂 | 新站已产生新事实,旧站可能有分叉数据;要以新主追平旧站、对账、恢复复制方向、小流量验证再分批回切。 | 回切 |
| 怎样证明灾备有效 | 从真实入口完成可核对业务,测量检测、Fencing、切流、数据缺口和回切,得到实际RPO/RTO。 | 演练 |
场景题:主站网络中断是否立即提升备站
不能只因心跳断开立即提升。先确认是主站故障还是控制链路分区,并证明旧主不能继续写;完成网络、存储、账号或Epoch Fencing后,记录复制位点和数据缺口,再提升备站。否则两个站都可能接受写入形成脑裂。
项目回答模板
我们按tenantId把业务归属到单元,应用、缓存、数据库分片和MQ尽量本单元闭环;全局配置有版本复制,ES和报表可重建。故障切换先记录数据库/MQ位点并Fencing旧主,再提升灾备Epoch,小流量验证支付、订单和采集续传后分批放量。恢复后以新主为事实源追平旧站,按金额、状态、eventId和sequence对账后回切。RPO/RTO以演练结果为准。
本章小结
多活面试的重点不是“用了两个机房”,而是数据所有权、复制窗口、Fencing、切换和回切能否闭环。
