
1) 【一句话结论】:采用“主备+实时数据同步”的多机房容灾架构,通过主备机房数据实时同步(如CDC),结合自动化故障检测与切换,确保7x24高可用,同时兼顾数据一致性与切换效率。
2) 【原理/概念讲解】:
老师口吻解释关键概念:
类比:数据备份像“存保险箱”,全量备份是存整份家当,增量备份是存每天新增的物品,恢复时不用搬全家的东西,只补新增的;多机房像两个仓库,主仓库卖货,备仓库同步库存,主仓库断电时,备仓库能继续卖,保证不缺货。
3) 【对比与适用场景】:
| 模式/策略 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 全量备份 | 定期(如每日)完整备份数据 | 恢复时间长,数据完整 | 灾难恢复(机房全毁) | 需足够存储空间,恢复时数据滞后 |
| 增量备份 | 实时记录数据变更(如日志) | 恢复快,数据同步及时 | 日常数据同步,故障切换 | 需处理日志丢失或损坏 |
| 主备架构 | 主机房处理请求,备机房同步数据 | RPO较高(分钟级),切换后数据可能丢失 | 对数据一致性要求不高的场景(非核心业务) | 切换时需回滚未完成事务 |
| 主主架构 | 双机房均处理请求,数据实时同步 | RPO接近0,切换后无数据丢失 | 对数据一致性要求高的场景(核心业务) | 需解决数据冲突(分布式事务/最终一致性) |
4) 【示例】:
# 主机房数据库(MySQL)的binlog订阅
def start_cdc():
with MySQLConnection(host='master', user='cdc_user', pwd='pwd') as conn:
conn.start_binlog_subscription()
for event in conn.get_binlog_events():
if event.type in ('UPDATE', 'INSERT'):
sql = generate_sql(event)
with MySQLConnection(host='standby', user='cdc_user', pwd='pwd') as standby_conn:
standby_conn.execute(sql)
# 故障切换流程(伪代码)
def check_master_health():
try:
response = requests.get('http://master:8080/health', timeout=2)
return response.status_code == 200
except:
return False
def switch_to_standby():
if check_standby_health():
update_load_balancer('master', 'standby')
update_service_status('standby')
5) 【面试口播版答案】:
“面试官您好,针对7x24可用性的容灾方案,我考虑采用‘主备+实时数据同步’的多机房架构。首先,数据备份方面,采用全量+增量策略:每日做一次全量备份(存储在异地备份中心),同时通过CDC(如MySQL的Binlog)实时同步增量数据,确保备机房数据与主机房一致。多机房部署上,选择主备模式,主机房(北京机房)处理日常请求,备机房(上海机房)同步数据,故障时自动切换。故障切换通过健康检查(如心跳包、服务状态)实现,当主机房不可用时,自动将流量切换到备机房,RTO控制在分钟级以内。另外,监控方面,部署实时监控(如Prometheus+Grafana),监控数据同步延迟、服务可用性,及时告警。这样既能保证数据一致性,又能快速恢复服务,满足7x24可用性要求。”
6) 【追问清单】:
7) 【常见坑/雷区】: