游戏卡顿白皮书 › L12 数据库
存盘间隔过长导致进度丢失 Periodic save window
原因 ID db-save-interval · 主责 研发团队·服务器开发 · 配合 运维团队·数据库运维
在含图示和实验的完整版中打开此卡片 →
为减轻负载,几分钟才存一次盘,期间服务器一旦崩溃,进度就会丢失。
起因 角色状态每几分钟保存一次 → 结果 其间服务器崩溃或发生故障 → 画面表现 重新登录后回到几分钟前的状态(回档)
- 症状
- 吞操作/回档
- 因素
- 丢包
- 谁会遇到
- 全服, 特定地点/分线
- 何时出现
- 偶尔随机
- 负责方
- 主责 研发团队·服务器开发 · 配合 运维团队·数据库运维
- 研发团队要做的事
- 重要事件(交易、获得稀有物品)立即存盘,记录变更日志。
- 运维团队要做的事
- 确认 DB 的 IOPS、CPU 余量能承受缩短存盘间隔后增加的写入。
- 监控图上
- 连接成批断开 · 连接数、回档反馈数
- 查看位置
- 把崩溃、故障时间与反馈回档的角色的最后存盘时间(游戏服务器的存盘日志或 DB 的修改时间列)放在一起对照
- 确认依据
- 回退到的时间点与崩溃前最后一次存盘时间一致,丢失的时长短于存盘间隔
- 排除依据
- 游戏服务器日志里记录存盘已完成却仍然回退,看“DB 故障切换”(db-failover)造成的数据丢失,或“复制延迟”(db-replica-lag)导致读到从库上的旧值
- 确认手段
- 需要游戏服务器/客户端的日志和指标
出处
- Asynchronous Commit (PostgreSQL Documentation) PostgreSQL
把写入攒起来延后刷盘能提高吞吐量,代价是故障时最近的事务可能丢失(同样的取舍) - Redis persistence Redis
每隔几分钟生成一次 RDB 快照,就要做好异常退出时丢失最后几分钟数据的准备
相关原因
同一层:L12 数据库
其他层中同样导致“吞操作/回档”的原因
查看含图示和实验的原卡片