游戏卡顿白皮书 › L12 数据库
DB 故障切换 Database failover
原因 ID db-failover · 主责 运维团队·数据库运维 · 配合 研发团队·服务器开发
在含图示和实验的完整版中打开此卡片 →
主库宕机、切换到备库期间无法写入,最后一部分没来得及复制的数据可能会丢失。
起因 主库故障,备库被提升为主库 → 结果 切换期间几秒到几分钟无法写入;如果是异步复制,未复制的数据可能丢失 → 画面表现 短时间内所有存盘失败,物品、经验回档
症状 吞操作/回档 , 卡住 , 掉线 , 连不上/无限加载
因素 停顿, 丢包
谁会遇到 全服
何时出现 偶尔随机
负责方 主责 运维团队·数据库运维 · 配合 研发团队·服务器开发
研发团队要做的事 存盘支持重试;配置为尽快丢弃断开的连接、按新地址重新建立连接(连接池、DNS 缓存);在切换演练时确认重连正常。
运维团队要做的事 采用同步或半同步复制(代价是写入延迟增加),做切换演练,监控切换时间和复制延迟。
数值参考 托管数据库的自动切换通常需要几十秒到 2 分钟。如果是异步复制,可能会丢失最近一段时间的存盘,时长相当于复制延迟(不到 1 秒到几秒)。
监控图上 连接成批断开 · DB 连接数、写入错误数
查看位置 把 DB 侧的故障切换记录(RDS 为事件 RDS-EVENT-0013 切换开始、RDS-EVENT-0049 切换完成,自建 DB 看提升日志)和游戏服务器的 DB 连接数、连接错误数放在同一张图上。如果是异步复制,还要看故障前一刻的复制延迟(RDS ReplicaLag,PostgreSQL pg_stat_replication 的 replay_lag) 确认依据 存盘失败集中在一段时间内,且与故障切换从开始到完成的区间重合。回退的量与故障前一刻的复制延迟相近。切换结束后仍持续报错的游戏服务器,说明还在使用连向旧地址的连接 排除依据 没有切换记录的时刻出现连接中断,属于网络或 DB 过载问题 确认手段 运维工具即可确认(无需游戏代码)
真实案例 Riot Games 2021: League of Legends EUW 5 小时故障:一个辅助 DB 导致全服停摆
出处 Failing over a Multi-AZ DB instance for Amazon RDS AWS Multi-AZ 切换通常需要 60~120 秒,切换后必须重新建立连接,建议 JVM 的 DNS 缓存 TTL 不超过 60 秒 High availability for Amazon Aurora AWS 故障期间读写失败,通常在 60 秒内(多数在 30 秒内)恢复 Semisynchronous Replication MySQL 异步复制下主库宕机时,已提交的事务可能不在从库上;半同步复制会等待一个从库确认收到,以减少这种情况,代价是延迟增加 Log-Shipping Standby Servers (PostgreSQL Documentation) PostgreSQL 日志传送是异步的,主库宕机时会丢失尚未发送的事务;流复制的延迟通常不到 1 秒 Amazon RDS event categories and event messages AWS RDS-EVENT-0013:Multi-AZ 故障切换开始,RDS-EVENT-0049:Multi-AZ 故障切换完成 Amazon CloudWatch metrics for Amazon RDS AWS ReplicaLag:只读副本落后于源实例的时间(秒) The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL pg_stat_replication 的 replay_lag:主库写入 WAL 后,到从库报告已应用为止所用的时间
相关原因
同一层:L12 数据库
其他层中同样导致“吞操作/回档”的原因
查看含图示和实验的原卡片