
1) 【一句话结论】设计高可用服务需通过主从复制(故障转移+数据同步)+多活部署(负载均衡)实现服务可用性,结合全量+增量+异地存储的数据备份(RTO≤5分钟,RPO≤1小时),用Prometheus+Grafana监控关键指标(CPU>80%或QPS<50%时告警),确保故障时快速切换与数据一致性。
2) 【原理/概念讲解】老师:高可用服务设计核心是“故障不中断”,需从故障转移、数据备份、监控告警三方面设计。
3) 【对比与适用场景】
| 模式 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 主从复制 | 主节点处理写,从节点同步数据并处理读 | 读写分离,主故障时从切换为主,数据一致性依赖同步机制 | 读写比例高(读多写少),如数据库、缓存服务 | 主故障时读性能下降,切换有延迟;同步机制影响一致性 |
| 多活部署 | 多个节点同时处理请求,负载均衡分配流量 | 所有节点独立处理请求,故障时其他节点接管 | 写多读少或高并发服务(如API网关、计算服务) | 需要数据一致性时需额外同步(如分布式事务) |
| 数据备份策略 | 全量+增量+异地存储 | 确保数据持久性,降低灾难恢复时间 | 业务数据保护 | 需明确备份频率、RTO/RPO目标 |
4) 【示例】
伪代码展示数据备份流程(假设MySQL数据库):
// 全量备份脚本(每日凌晨2点执行)
func fullBackup() {
// 停止MySQL binlog
exec.Command("mysql", "-uroot", "-p", "-e", "STOP LOGGING;").CombinedOutput()
// 备份数据
exec.Command("mysqldump", "-uroot", "-p", "--all-databases").CombinedOutput()
// 上传至S3
s3Client.PutObject("backup-bucket", "full_" + time.Now().Format("20060102") + ".sql", backupFile)
// 启用binlog
exec.Command("mysql", "-uroot", "-p", "-e", "START LOGGING;").CombinedOutput()
}
// 增量备份(每小时通过binlog同步)
func incrementalBackup() {
// 获取最新binlog位置
pos, _ := getBinlogPosition()
// 同步增量数据
exec.Command("mysqlbinlog", "-uroot", "-p", "--start-position", pos).CombinedOutput()
// 上传至S3
s3Client.PutObject("backup-bucket", "incremental_" + time.Now().Format("20060102_1504") + ".sql", incrementalFile)
}
5) 【面试口播版答案】
“设计高可用服务,核心是通过主从复制实现故障转移,多活部署提升负载。架构上,主节点处理写,从节点同步数据(同步复制保证强一致性),多节点负载均衡(Nginx least_conn)。数据备份采用全量(每日凌晨2点)+增量(每小时日志同步),异地存储到S3,RTO≤5分钟。监控用Prometheus收集CPU、QPS等,Grafana可视化,告警设置SLA阈值(如CPU>80%或QPS<50%时告警)。故障转移时,主节点健康检查失败后,从节点预同步(Raft共识≤1秒),切换为主,负载均衡自动切换流量,确保服务不中断。”
6) 【追问清单】
7) 【常见坑/雷区】