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

游戏卡顿白皮书 › L12 数据库

存盘间隔过长导致进度丢失 Periodic save window

原因 ID db-save-interval · 主责 研发团队·服务器开发 · 配合 运维团队·数据库运维

在含图示和实验的完整版中打开此卡片 →

为减轻负载,几分钟才存一次盘,期间服务器一旦崩溃,进度就会丢失。

起因 角色状态每几分钟保存一次 → 结果 其间服务器崩溃或发生故障 → 画面表现 重新登录后回到几分钟前的状态(回档)

症状
吞操作/回档
因素
丢包
谁会遇到
全服, 特定地点/分线
何时出现
偶尔随机
负责方
主责 研发团队·服务器开发 · 配合 运维团队·数据库运维
研发团队要做的事
重要事件(交易、获得稀有物品)立即存盘,记录变更日志。
运维团队要做的事
确认 DB 的 IOPS、CPU 余量能承受缩短存盘间隔后增加的写入。
监控图上
连接成批断开 · 连接数、回档反馈数
查看位置
把崩溃、故障时间与反馈回档的角色的最后存盘时间(游戏服务器的存盘日志或 DB 的修改时间列)放在一起对照
确认依据
回退到的时间点与崩溃前最后一次存盘时间一致,丢失的时长短于存盘间隔
排除依据
游戏服务器日志里记录存盘已完成却仍然回退,看“DB 故障切换”(db-failover)造成的数据丢失,或“复制延迟”(db-replica-lag)导致读到从库上的旧值
确认手段
需要游戏服务器/客户端的日志和指标

出处

  1. Asynchronous Commit (PostgreSQL Documentation) PostgreSQL
    把写入攒起来延后刷盘能提高吞吐量,代价是故障时最近的事务可能丢失(同样的取舍)
  2. Redis persistence Redis
    每隔几分钟生成一次 RDB 快照,就要做好异常退出时丢失最后几分钟数据的准备

相关原因

同一层:L12 数据库

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

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