한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

游戏卡顿白皮书 › 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 导致全服停摆

出处

  1. Failing over a Multi-AZ DB instance for Amazon RDS AWS
    Multi-AZ 切换通常需要 60~120 秒,切换后必须重新建立连接,建议 JVM 的 DNS 缓存 TTL 不超过 60 秒
  2. High availability for Amazon Aurora AWS
    故障期间读写失败,通常在 60 秒内(多数在 30 秒内)恢复
  3. Semisynchronous Replication MySQL
    异步复制下主库宕机时,已提交的事务可能不在从库上;半同步复制会等待一个从库确认收到,以减少这种情况,代价是延迟增加
  4. Log-Shipping Standby Servers (PostgreSQL Documentation) PostgreSQL
    日志传送是异步的,主库宕机时会丢失尚未发送的事务;流复制的延迟通常不到 1 秒
  5. Amazon RDS event categories and event messages AWS
    RDS-EVENT-0013:Multi-AZ 故障切换开始,RDS-EVENT-0049:Multi-AZ 故障切换完成
  6. Amazon CloudWatch metrics for Amazon RDS AWS
    ReplicaLag:只读副本落后于源实例的时间(秒)
  7. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    pg_stat_replication 的 replay_lag:主库写入 WAL 后,到从库报告已应用为止所用的时间

相关原因

同一层:L12 数据库

其他层中同样导致“吞操作/回档”的原因

查看含图示和实验的原卡片