文档目录
数据库监控

简介

本指南面向 DouPHP 的数据库监控与可观测性建设,围绕以下目标提供落地方案:

  • 连接池监控:连接数统计、连接状态检测、连接超时处理。
  • 慢查询监控:查询性能分析、执行时间阈值设置、慢查询日志记录。
  • 连接池使用率监控:活跃连接数、空闲连接数、等待队列长度。
  • 健康检查机制:连接测试、表空间监控、索引使用情况分析。
  • 性能指标收集与分析方法,以及异常告警配置建议。

说明:DouPHP 核心框架通过 Connection 类直接管理 mysqli 连接;部分插件(如支付 SDK)内置了连接池实现。本指南将分别给出“基于现有实现的增强”和“推荐扩展”两种路径,确保在不破坏既有行为的前提下完成监控能力补齐。

项目结构

与数据库监控密切相关的代码主要分布在:

  • 核心门面与连接层:core/facade/DB.php、core/infra/database/Connection.php
  • 配置入口:config/config.php
  • 插件级连接池(可选):plugin//sdk/lotusphp_runtime/DB/
  • 升级/诊断脚本:_'/tool/upgrade_v1.9.php
graph TB
A["应用/业务模块"] --> B["DB 门面<br/>core/facade/DB.php"]
B --> C["连接容器单例<br/>core/infra/database/Connection.php"]
C --> D["MySQL 服务器"]
E["插件连接池<br/>DbConnectionManager.php"] --> F["DbHandle / DbConfigBuilder"]
E --> D
G["配置<br/>config/config.php"] --> C
H["诊断脚本<br/>upgrade_v1.9.php"] --> D

核心组件

  • DB 门面:对外暴露静态 API,内部委托给 Connection 容器单例,便于统一接入监控与调试。
  • Connection:封装 mysqli 连接、事务、查询构建、错误处理、调试开关等,是监控落点的关键位置。
  • 插件连接池:在支付等插件中提供进程内连接复用与过期控制,可作为连接池监控的参考实现。
  • 配置:集中定义数据库主机、库名、用户、密码、前缀与字符集等。

架构总览

下图展示请求从应用到数据库的调用链,并标注监控埋点位置(连接建立、查询执行、错误处理)。

sequenceDiagram
participant App as "应用"
participant Facade as "DB 门面"
participant Conn as "Connection"
participant MySQL as "MySQL"
participant Pool as "插件连接池(可选)"
App->>Facade : 发起查询/写入
Facade->>Conn : 获取连接/构建查询
alt 使用插件连接池
Conn->>Pool : 获取连接
Pool-->>Conn : 返回连接资源
else 直连模式
Conn->>MySQL : 建立/复用连接
end
Conn->>MySQL : 执行 SQL
MySQL-->>Conn : 结果/错误
Conn-->>Facade : 返回结果
Facade-->>App : 响应数据

详细组件分析

连接池监控(含连接数统计、状态检测、超时处理)

  • 现状
    • 核心框架未内置连接池,Connection 以 mysqli 直连为主。
    • 插件中存在 LtDbConnectionManager,具备连接池与 TTL 过期字段,可用于统计与治理。
  • 建议方案
    • 在 Connection 层增加轻量“进程内连接池”或“连接复用计数器”,用于统计活跃/空闲连接、等待队列长度。
    • 对连接建立与释放进行计数,结合 PHP-FPM 进程模型,按进程维度统计。
    • 超时处理:在连接建立时设置超时参数,并在连接失败时记录告警。
  • 关键埋点
    • 连接创建:记录当前活跃连接数、创建耗时。
    • 连接归还:更新空闲连接数。
    • 连接失败:记录错误码、重试次数、是否触发熔断/降级。
    • 等待队列:当无可用连接且达到上限时,入队并记录等待时长。
flowchart TD
Start(["开始"]) --> CheckPool["检查连接池"]
CheckPool --> HasFree{"有空闲连接?"}
HasFree -- 是 --> UseConn["复用连接"]
HasFree -- 否 --> CreateOrWait{"允许创建新连接?"}
CreateOrWait -- 是 --> NewConn["新建连接"]
CreateOrWait -- 否 --> Enqueue["加入等待队列"]
NewConn --> SetTimeout["设置连接超时"]
SetTimeout --> Exec["执行操作"]
UseConn --> Exec
Exec --> Return["归还连接"]
Return --> End(["结束"])
Enqueue --> TimeoutCheck{"等待超时?"}
TimeoutCheck -- 是 --> Reject["拒绝请求/返回排队中"]
TimeoutCheck -- 否 --> WaitNext["继续等待"]
WaitNext --> CheckPool
Reject --> End

慢查询监控(性能分析、阈值、日志)

  • 现状
    • Connection 支持 debug_mode 开关与 last_sql/rawSql 等调试能力,但未内置慢查询统计。
  • 建议方案
    • 在 query() 执行前后计时,超过阈值的 SQL 记录到慢查询日志,并附带绑定参数、表名、调用栈片段。
    • 提供阈值配置项(毫秒),支持按模块/路由/控制器维度打标签。
    • 聚合统计:QPS、P95/P99 延迟、Top N 慢查询、慢查询占比。
  • 关键埋点
    • 进入 query():记录开始时间戳。
    • 执行后:计算耗时,若超阈值则写日志并上报指标。
    • 错误分支:记录错误信息与堆栈。
sequenceDiagram
participant App as "应用"
participant Conn as "Connection"
participant DB as "MySQL"
App->>Conn : query(sql, params)
Conn->>Conn : 记录开始时间
Conn->>DB : 执行SQL
DB-->>Conn : 结果/错误
Conn->>Conn : 计算耗时
alt 耗时 > 阈值
Conn->>Conn : 记录慢查询日志
end
Conn-->>App : 返回结果

连接池使用率监控(活跃、空闲、等待队列)

  • 指标定义
    • 活跃连接数:当前被占用的连接数量。
    • 空闲连接数:可立即复用的连接数量。
    • 等待队列长度:因无可用连接而排队中的请求数。
    • 使用率:活跃/(活跃+空闲)。
  • 采集方式
    • 在连接获取/归还处更新计数器。
    • 在等待队列入队/出队处更新队列长度与等待时长。
  • 可视化与告警
    • 仪表盘:实时显示上述指标趋势。
    • 告警:使用率持续高于阈值、等待队列持续增长、连接创建失败率上升。

健康检查机制(连接测试、表空间、索引)

  • 连接测试
    • 定时执行轻量查询(如 SELECT 1)验证连通性与延迟。
    • 失败时触发告警并尝试重连。
  • 表空间监控
    • 定期统计各表大小、增长速率,识别膨胀热点。
  • 索引使用情况分析
    • 利用 INFORMATION_SCHEMA 统计索引命中情况,识别缺失或冗余索引。
  • 实现要点
    • 在 Connection 中新增 healthCheck()、tableStats()、indexUsage() 等方法。
    • 通过后台任务或外部调度器周期性执行,并将结果持久化到监控存储。

性能指标收集与分析方法

  • 指标清单
    • 连接:创建耗时、失败率、复用率、超时率。
    • 查询:QPS、平均/分位延迟、慢查询比例、错误率。
    • 资源:CPU、内存、IO、锁等待(由数据库侧提供)。
  • 分析方法
    • 趋势分析:观察峰值时段与突增原因。
    • 根因定位:结合慢查询日志与执行计划定位瓶颈。
    • 容量规划:根据增长趋势评估扩容需求。

异常告警配置

  • 告警规则建议
    • 连接失败率 > 阈值(如 1%)持续 5 分钟。
    • 慢查询占比 > 阈值(如 5%)持续 10 分钟。
    • 连接使用率 > 阈值(如 85%)持续 15 分钟。
    • 等待队列长度 > 阈值(如 50)持续 5 分钟。
  • 通知渠道
    • 邮件、企业微信、短信、监控平台告警。
  • 降噪策略
    • 分级告警(警告/严重)、合并重复告警、静默窗口。

依赖关系分析

  • DB 门面依赖 Connection,作为统一入口。
  • Connection 依赖 mysqli 扩展与数据库配置。
  • 插件连接池依赖配置构建器与连接适配器,提供进程内连接复用。
  • 诊断脚本用于环境校验与基础连通性测试。
graph LR
DBF["DB 门面"] --> CONN["Connection"]
CONN --> CFG["配置 config.php"]
CONN --> MYSQL["MySQL"]
PLM["插件连接池"] --> CFG
PLM --> ADP["适配器/句柄"]
ADP --> MYSQL
DIAG["诊断脚本"] --> MYSQL

性能考量

  • 避免在热路径上执行重型监控逻辑,采用异步上报与采样策略。
  • 慢查询日志需限制写入频率与保留周期,防止磁盘压力。
  • 连接池大小与超时参数需结合业务 QPS 与数据库承载能力调优。
  • 使用 EXPLAIN/执行计划优化慢查询,减少全表扫描与大结果集。

故障排查指南

  • 连接失败
    • 检查主机、端口、用户名、密码、权限。
    • 查看 Connection 的错误输出与调试日志。
  • 慢查询增多
    • 启用慢查询日志,定位 Top SQL。
    • 检查索引、统计信息、执行计划。
  • 连接耗尽
    • 检查连接池大小、超时配置、是否存在长事务或未归还连接。
    • 观察等待队列与使用率趋势。
  • 诊断工具
    • 使用升级/诊断脚本进行基础连通性检查与环境确认。

结论

通过在 Connection 层补齐慢查询统计、连接复用与等待队列监控,并结合插件连接池的已有能力,DouPHP 可在不侵入业务代码的前提下获得完善的数据库可观测性。配合合理的阈值与告警策略,能够及时发现并缓解数据库层面的风险,保障系统稳定运行。

附录

  • 配置项建议
    • 慢查询阈值:默认 500ms,可按环境调整。
    • 连接池最大连接数:根据并发与数据库承载设定。
    • 连接超时:建议 5-10s,避免雪崩。
  • 监控面板建议
    • 连接池:活跃/空闲/等待/使用率。
    • 查询:QPS、延迟分布、慢查询占比。
    • 健康:连通性、错误率、表空间增长。
添加日期:2026-10-05