
1) 【一句话结论】:采用多节点主从/多活部署架构,通过心跳+状态检查实现故障检测与自动切换,结合事务日志/消息队列保证录制与回放数据最终一致性,确保高可用与故障恢复。
2) 【原理/概念讲解】:高可用系统需多节点协同避免单点故障。故障检测常用心跳机制(主节点定期向从节点发送心跳,从节点响应状态)或状态检查(从节点检查主节点日志/状态文件是否同步)。故障切换时,从节点检测到主节点超时/无响应,通过选举机制(如ZooKeeper的Leader选举)切换为主。数据一致性方面,录制数据写入主节点后,通过**消息队列(如Kafka)或分布式事务(如MySQL XA)**同步到从节点;回放数据则通过定时同步或事件驱动同步,确保最终一致。
类比:银行系统,主服务器是总行,从服务器是分行备份,总行宕机时,分行切换为总行,客户交易数据通过实时同步保证一致。
3) 【对比与适用场景】:
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 主从复制(同步) | 主节点处理请求,数据同步到从节点 | 读写分离,从节点可读,故障时切换为主 | 需低延迟(如数据库读写) | 同步延迟可能导致数据不一致 |
| 主从复制(异步) | 主节点写入后异步复制 | 读写分离,从节点延迟读 | 对延迟容忍(如日志存储) | 延迟可能导致数据丢失 |
| 多活部署 | 多节点同时处理请求,无主从 | 所有节点可读可写 | 高并发(如电商系统) | 需分布式事务或最终一致性 |
| 心跳检测 | 主节点定期向从节点发送心跳 | 低延迟检测 | 实时系统 | 心跳间隔过短增加网络开销 |
| 状态检查 | 从节点检查主节点日志或状态文件 | 高可靠性检测 | 关键系统 | 检查频率影响检测延迟 |
4) 【示例】:伪代码展示主从节点数据同步与故障切换。
// 主节点处理录制请求
void Master::recordLesson(const LessonInfo& info) {
logRecord(info); // 写入本地日志
sendToSlave(info); // 通过Kafka同步到从节点
return true;
}
// 从节点接收并同步数据
void Slave::receiveRecord(const LessonInfo& info) {
logRecord(info); // 同步日志
updateData(info); // 更新本地数据
}
// 从节点检测主节点故障并切换
void Slave::checkMaster() {
if (isMasterDown()) { // 检测主节点宕机
electAsMaster(); // 选举为主节点
startMasterService(); // 启动主节点服务
}
}
5) 【面试口播版答案】:
(约80秒)
“面试官您好,针对课程录制系统的高可用和故障恢复需求,我设计的容灾方案核心是采用多节点主从/多活部署架构,结合故障检测与自动切换机制,同时保证录制与回放数据的一致性。系统部署多个录制节点,主节点负责处理录制请求,从节点通过心跳和日志同步数据。故障检测方面,主节点定期向从节点发送心跳,从节点响应状态,若主节点超时,从节点通过状态检查(如日志文件是否同步)判断故障,并启动选举机制切换为主。数据一致性方面,录制数据写入主节点后,通过消息队列(如Kafka)异步同步到从节点,回放数据则通过定时任务或事件驱动同步,确保最终一致。这样,即使主节点宕机,从节点能快速切换,保证录制不中断,数据同步后回放正常。”
6) 【追问清单】:
7) 【常见坑/雷区】: