数据库监控设计:多云/自建统一视图
状态
Proposed(调研与分层设计定稿,P1 范围见 §5)。覆盖游戏业务数据库(非 croupier 元库)。
1. 问题
游戏业务库(玩家/充值/订单/日志)出现死锁导致服务卡死的故障。但死锁只是数据库监控的一个切片——完整的数据库监控需要覆盖以下指标族,且不同部署形态(阿里云/华为云/自建)可观测能力差异巨大:
| 指标族 | 具体指标 | 故障表现 |
|---|---|---|
| 锁与死锁 | 死锁次数、当前锁等待、等待链、长事务持锁时长 | 服务卡死(连接池被等待者占满) |
| 查询性能 | 慢查询 TopN、全表扫描、索引缺失建议、QPS/慢查比 | 接口变慢、超时 |
| 连接与会话 | 连接数/上限、活跃/空闲、会话来源分布、连接泄漏 | too many connections |
| 资源 | CPU/内存/磁盘 IO/临时表落盘/缓冲命中率 | 整体劣化 |
| 复制与备份 | 主从延迟、备份成功率/新鲜度 | 读到旧数据、灾难恢复失效 |
| 容量趋势 | 表大小增长、碎片率、磁盘水位 | 容量规划 |
2. 部署形态 × 可观测能力矩阵(现实约束)
游戏公司现实是混合形态,监控能力必须按形态核对:
2.1 云诊断服务(需开通,人看免 SDK)
| 云 | 产品 | 开通 | 免费范围 | 付费深度 |
|---|---|---|---|---|
| 阿里云 | DAS 数据库自治服务 | RDS 控制台一键接入(免 agent) | 基础监控、死锁日志入口、实例会话 | 自动 SQL 限流、锁分析、SQL 画像(按实例收费) |
| 华为云 | DAS / DBSS | RDS 内直接看为主 | 基础监控+会话 | 高级诊断付费 |
| 自建 | 无 | — | — | — |
要点:人看不需要任何 SDK(浏览器进控制台);死锁原文默认在 RDS 错误日志里免费可见。
2.2 程序采集(跨云通用,P1 主通道)
只读账号直连,标准 SQL 查系统表。兼容性核对:
| 采集项 | 自建 MySQL | 阿里云 RDS MySQL | 华为云 RDS MySQL | PG 系 |
|---|---|---|---|---|
| 连接数/线程 | SHOW STATUS ✅ | ✅ | ✅ | pg_stat_activity ✅ |
| 当前锁等待条目 | data_lock_waits(8.0) / innodb_lock_waits(5.7) ✅ | ✅ | ✅ | pg_locks JOIN ✅ |
| 死锁计数器 | Innodb_deadlocks ✅ | ⚠️ 部分版本不暴露,用错误日志兜底 | ⚠️ 同左 | PG 自动解死锁并记日志,pg_stat_database.deadlocks ✅ |
| 最近死锁详情原文 | SHOW ENGINE INNODB STATUS ❌(RDS 禁 SUPER) | ❌ → 用 DAS 或错误日志 API | ❌ 同左 | 日志文件(需日志下载权限)⚠️ |
| 慢查询列表 | slow_log 表 ✅(需开 slow_query_log=ON) | ✅(控制台可开) | ✅ | pg_stat_statements 扩展(RDS 可装)✅ |
| 表大小/碎片 | information_schema.TABLES ✅ | ✅ | ✅ | pg_stat_user_tables ✅ |
结论:探针层跨云可用约 80% 的指标;死锁详情原文与内核级指标在云上是阉割的,由云诊断层补齐。
2.3 外部专业工具(深度/历史化)
| 工具 | 定位 | 与本方案关系 |
|---|---|---|
| Percona PMM | MySQL/PG 深度监控平台(Query Analytics、pt-deadlock-logger 死锁历史化) | 自建库推荐外挂;croupier 外链跳转 |
| mysqld_exporter + Prometheus + Grafana | 指标标准化 + 趋势看板 | 复用 croupier telemetry 已有栈;云 RDS 也适用 |
| pgCenter / pganalyze | PG 实时观察 / 商业 SaaS | PG 重度用户可选 |
| 云 DAS/DBbrain OpenAPI | 程序化取死锁详情、自动 kill | P2 按云适配器接入 |
3. 架构:每类库用最强采集层,croupier 做统一聚合与告警
┌─ 云 RDS ──────────► 云诊断(DAS/DBbrain):死锁详情/一键kill【权威,人看】
│ └► 只读账号探针(P1):连接/锁等待/慢查【跨云统一】
┌─ 自建 ────────────► PMM 或 exporter(可选外挂)
│ └► 同上探针
│
└─ croupier 运维中心「数据库监控」页(跨所有库统一层)
├─ 数据源注册表:实例{名称,驱动,类型(self|aliyun|huawei),DSN(只读),归属game/env}
├─ 健康探针:标准化 SQL 采集(§2.2 中 ✅ 项),拿不到的标注"由云控制台提供"+外链
├─ 告警联动:锁等待>阈值/死锁计数增长/连接水位 → alerts + ding/webhook
├─ 多库聚合:按 game/env 一页总览(分库分服场景 PMM 做不到的)
└─ 深度诊断外链 → 云控制台 / PMM(复用工具箱模式,零成本兜底)4. 关键决策
- 不自建死锁解析器:
SHOW ENGINE INNODB STATUS的死锁段解析(pt-deadlock-logger 的活)需要 SUPER 权限,云上不可用;云上用 DAS,自建用 pt-deadlock-logger 外挂。 - P1 不接云 OpenAPI:每朵云一个 Go SDK 依赖 + AK/SK 密钥管理,成本高;控制台外链兜底。P2 按需做 DAS/OpenAPI 适配器拉死锁历史。
- 告警走 croupier 告警中心而非 Grafana Alerting:GM 联动(跳节点页/关联缺陷/区服上下文)是独有价值;Grafana 继续负责趋势图。
5. 分阶段实施
| 阶段 | 内容 |
|---|---|
| P1(零 SDK,全形态兼容) | ① 数据源注册表(模型+CRUD,复用 ToolLink 模式);② 标准化健康探针(连接数/锁等待条目/死锁计数/表 Top 大小,MySQL+PG 双方言);③ 运维中心「数据库监控」页(多库聚合卡片+明细表+云控制台外链字段);④ 锁等待/死锁计数阈值告警入 alerts |
| P2 | 云 OpenAPI 适配器(阿里云 DAS 死锁历史、华为云对应接口),featureFlags 式可选启用;慢查询 TopN 采样历史化 |
| P3 | 趋势对接:把探针数据打进 telemetry 栈(Prometheus remote write),Grafana 出长期趋势;容量预测 |
6. Review Checklist
- 数据源 DSN 是敏感信息:存储加密或引用 secret,API 返回掩码(参考 certificates 处理);
- 探针必须用只读账号,且查询带超时(监控自身不得成为被监控库的压力源);
- 新增采集项必须先核对 §2.2 三形态兼容性,不兼容项标注数据来源降级;
- 云类型/驱动枚举变更前后端同步。
