外观
KingBaseES 监控指标
监控指标是KingBaseES数据库运维的重要组成部分,通过监控关键指标,可以实时了解数据库的运行状态,及时发现和解决问题,优化数据库性能,保障业务连续性。本文将详细介绍KingBaseES的核心监控指标和监控最佳实践。
监控指标概述
监控指标的概念
监控指标是用于衡量数据库运行状态的量化数据,包括性能、资源、连接、复制、锁等多个方面。监控指标可以帮助DBA:
- 实时了解数据库运行状态
- 及时发现性能瓶颈和问题
- 优化数据库配置和查询
- 预测资源需求和规划扩容
- 保障数据库的稳定性和可靠性
监控指标的重要性
- 提前预警:在问题影响业务之前发现并解决
- 性能优化:识别性能瓶颈,优化数据库性能
- 容量规划:根据指标趋势规划资源扩容
- 故障定位:快速定位和解决故障
- 合规要求:满足监管和合规要求
监控指标的分类
| 指标类型 | 主要指标 | 监控目的 |
|---|---|---|
| 性能指标 | TPS、QPS、响应时间、执行计划 | 衡量数据库性能 |
| 资源指标 | CPU、内存、磁盘IO、网络IO | 监控系统资源使用情况 |
| 连接指标 | 连接数、活跃连接数、连接等待 | 监控数据库连接状态 |
| 复制指标 | 复制延迟、复制状态、WAL发送/接收速率 | 监控主备复制状态 |
| 锁指标 | 锁等待、死锁、锁类型分布 | 监控数据库锁状态 |
| WAL指标 | WAL生成速率、WAL归档状态、检查点频率 | 监控WAL日志状态 |
| 备份指标 | 备份状态、备份大小、备份时间 | 监控备份状态 |
| 空间指标 | 数据文件大小、表空间使用率、临时空间 | 监控磁盘空间使用情况 |
核心监控指标
1. 性能指标
TPS (Transactions Per Second)
- 描述:每秒处理的事务数
- 监控SQL:
SELECT xact_commit + xact_rollback FROM pg_stat_database WHERE datname = 'test'; - 正常范围:根据业务需求而定,一般OLTP系统在几百到几万之间
- 告警阈值:低于历史平均值的50%或高于历史峰值的200%
QPS (Queries Per Second)
- 描述:每秒处理的查询数
- 监控SQL:
SELECT tup_returned + tup_fetched + tup_inserted + tup_updated + tup_deleted FROM pg_stat_database WHERE datname = 'test'; - 正常范围:根据业务需求而定,一般OLTP系统在几千到几十万之间
- 告警阈值:低于历史平均值的50%或高于历史峰值的200%
响应时间
- 描述:SQL查询的平均响应时间
- 监控工具:慢查询日志、pg_stat_statements
- 正常范围:根据业务需求而定,一般OLTP系统在毫秒级别
- 告警阈值:平均响应时间超过1秒
慢查询数量
- 描述:每秒执行的慢查询数量
- 监控SQL:
SELECT count(*) FROM pg_stat_statements WHERE mean_exec_time > 1000; - 正常范围:0或个位数
- 告警阈值:每秒慢查询数量超过10个
2. 资源指标
CPU使用率
- 描述:数据库进程的CPU使用率
- 监控工具:top、vmstat、Prometheus node_exporter
- 正常范围:低于80%
- 告警阈值:连续5分钟超过90%
内存使用率
- 描述:数据库进程的内存使用率
- 监控工具:free、top、Prometheus node_exporter
- 监控SQL:
SELECT pg_total_relation_size(oid) FROM pg_class WHERE relname = 'table_name'; - 正常范围:根据系统配置而定,一般低于80%
- 告警阈值:连续5分钟超过90%
磁盘IO使用率
- 描述:数据库所在磁盘的IO使用率
- 监控工具:iostat、iotop、Prometheus node_exporter
- 正常范围:低于80%
- 告警阈值:连续5分钟超过90%
磁盘空间使用率
- 描述:数据库所在磁盘的空间使用率
- 监控工具:df、Prometheus node_exporter
- 监控SQL:
SELECT pg_database_size(datname) FROM pg_database WHERE datname = 'test'; - 正常范围:低于70%
- 告警阈值:超过85%
3. 连接指标
总连接数
- 描述:当前数据库的总连接数
- 监控SQL:
SELECT count(*) FROM pg_stat_activity; - 正常范围:低于max_connections的80%
- 告警阈值:超过max_connections的90%
活跃连接数
- 描述:当前数据库的活跃连接数
- 监控SQL:
SELECT count(*) FROM pg_stat_activity WHERE state = 'active'; - 正常范围:根据系统配置而定,一般低于总连接数的50%
- 告警阈值:连续5分钟超过总连接数的70%
连接等待数
- 描述:等待连接的请求数
- 监控SQL:
SELECT count(*) FROM pg_stat_activity WHERE wait_event IS NOT NULL; - 正常范围:0或个位数
- 告警阈值:连续5分钟超过10个
连接来源分布
- 描述:连接来源IP的分布情况
- 监控SQL:
SELECT client_addr, count(*) FROM pg_stat_activity GROUP BY client_addr; - 监控目的:识别异常连接来源
4. 复制指标
复制延迟
- 描述:备库与主库之间的复制延迟(字节数)
- 监控SQL:
SELECT pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) FROM pg_stat_replication; - 正常范围:根据业务需求而定,一般在几MB到几十MB之间
- 告警阈值:超过100MB
复制状态
- 描述:备库的复制状态
- 监控SQL:
SELECT state FROM pg_stat_replication; - 正常范围:streaming
- 告警阈值:状态异常或断开连接
WAL发送速率
- 描述:主库发送WAL的速率(字节/秒)
- 监控SQL:
SELECT pg_stat_get_wal_senders() AS wal_senders; - 监控工具:Prometheus postgres_exporter
WAL接收速率
- 描述:备库接收WAL的速率(字节/秒)
- 监控SQL:
SELECT pg_stat_get_wal_receiver() AS wal_receiver; - 监控工具:Prometheus postgres_exporter
5. 锁指标
锁等待数量
- 描述:当前等待锁的查询数量
- 监控SQL:
SELECT count(*) FROM pg_locks WHERE granted = false; - 正常范围:0或个位数
- 告警阈值:连续5分钟超过10个
锁等待时间
- 描述:锁等待的平均时间(毫秒)
- 监控SQL:
SELECT avg(EXTRACT(EPOCH FROM (now() - query_start)) * 1000) FROM pg_stat_activity WHERE wait_event_type = 'Lock'; - 正常范围:低于100毫秒
- 告警阈值:平均等待时间超过1秒
死锁数量
- 描述:每秒发生的死锁数量
- 监控SQL:
SELECT deadlocks FROM pg_stat_database WHERE datname = 'test'; - 正常范围:0
- 告警阈值:死锁数量大于0
锁类型分布
- 描述:不同类型锁的分布情况
- 监控SQL:
SELECT mode, count(*) FROM pg_locks WHERE granted = true GROUP BY mode; - 监控目的:识别频繁出现的锁类型
6. WAL指标
WAL生成速率
- 描述:每秒生成的WAL日志大小(字节/秒)
- 监控SQL:
SELECT pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), pg_wal_lsn_make(0,0))) AS total_wal_size; - 监控工具:Prometheus postgres_exporter
- 正常范围:根据业务需求而定,一般在几MB到几十MB之间
WAL归档状态
- 描述:WAL归档是否正常
- 监控SQL:
SELECT archive_mode, archive_command, last_archived_wal FROM pg_stat_archiver; - 正常范围:archive_mode = on,last_archived_wal不为空
- 告警阈值:archive_mode = off或last_archived_wal为空
检查点频率
- 描述:每秒执行的检查点次数
- 监控SQL:
SELECT checkpoint_count FROM pg_stat_bgwriter; - 正常范围:根据checkpoint_timeout设置而定,一般每分钟1-2次
- 告警阈值:每秒检查点次数超过5次
检查点耗时
- 描述:检查点执行的平均时间(毫秒)
- 监控SQL:
SELECT avg(EXTRACT(EPOCH FROM (checkpoint_end_time - checkpoint_start_time)) * 1000) FROM pg_stat_bgwriter; - 正常范围:低于checkpoint_timeout的10%
- 告警阈值:检查点耗时超过checkpoint_timeout的50%
7. 备份指标
备份状态
- 描述:最近一次备份的状态
- 监控工具:sys_rman日志、备份监控脚本
- 正常范围:备份成功
- 告警阈值:备份失败或超过计划时间未执行
备份大小
- 描述:备份文件的大小
- 监控工具:ls命令、备份监控脚本
- 监控目的:监控备份大小增长趋势
备份时间
- 描述:备份执行的时间
- 监控工具:备份监控脚本、sys_rman日志
- 正常范围:根据数据量而定,一般在几小时以内
- 告警阈值:备份时间超过预期时间的200%
备份成功率
- 描述:备份成功的比例
- 监控工具:备份监控脚本
- 正常范围:100%
- 告警阈值:备份成功率低于100%
8. 空间指标
数据文件大小
- 描述:数据库数据文件的总大小
- 监控SQL:
SELECT pg_size_pretty(pg_database_size('test')); - 监控目的:监控数据增长趋势
表空间使用率
- 描述:各个表空间的使用率
- 监控SQL:
SELECT spcname, pg_size_pretty(pg_tablespace_size(spcname)) FROM pg_tablespace; - 正常范围:低于80%
- 告警阈值:超过90%
临时空间使用率
- 描述:临时表空间的使用率
- 监控SQL:
SELECT pg_size_pretty(pg_temp_tablespaces_size()); - 正常范围:低于50%
- 告警阈值:超过80%
大表列表
- 描述:大小排名前10的表
- 监控SQL:
SELECT relname, pg_size_pretty(pg_total_relation_size(oid)) FROM pg_class ORDER BY pg_total_relation_size(oid) DESC LIMIT 10; - 监控目的:识别需要优化的大表
监控工具
1. 内置工具
psql命令行工具
bash
# 查看数据库状态
psql -U system -d test -c "SELECT * FROM pg_stat_database;"
# 查看连接状态
psql -U system -d test -c "SELECT * FROM pg_stat_activity;"
# 查看复制状态
psql -U system -d test -c "SELECT * FROM pg_stat_replication;"
# 查看锁状态
psql -U system -d test -c "SELECT * FROM pg_locks;"pg_stat_statements扩展
sql
-- 启用pg_stat_statements扩展
CREATE EXTENSION pg_stat_statements;
-- 查看慢查询
SELECT query, calls, total_time, mean_time, rows FROM pg_stat_statements ORDER BY mean_time DESC LIMIT 10;pg_stat_monitor扩展
sql
-- 启用pg_stat_monitor扩展
CREATE EXTENSION pg_stat_monitor;
-- 查看监控数据
SELECT * FROM pg_stat_monitor();2. 第三方工具
Prometheus + Grafana
- Prometheus:收集和存储监控指标
- Grafana:可视化展示监控指标
- postgres_exporter:KingBaseES指标导出器
yaml
# prometheus.yml配置
scrape_configs:
- job_name: 'kingbase'
static_configs:
- targets: ['kingbase_exporter:9187']Zabbix
- Zabbix Server:监控服务器
- Zabbix Agent:安装在KingBaseES服务器上
- KingBaseES模板:预定义的监控模板
Kingbase Enterprise Manager (KEM)
- 图形化的KingBaseES监控管理工具
- 支持实时监控和历史数据查询
- 支持告警和报表功能
- 支持集群监控
ELK Stack
- Elasticsearch:存储和索引日志数据
- Logstash:收集和处理日志数据
- Kibana:可视化展示日志数据
3. 云监控服务
- 阿里云云监控:支持KingBaseES监控
- 腾讯云云监控:支持KingBaseES监控
- 华为云云监控:支持KingBaseES监控
- AWS CloudWatch:支持KingBaseES监控
监控最佳实践
1. 监控策略设计
分层监控
- 基础监控:CPU、内存、磁盘IO、网络IO等系统资源
- 数据库监控:连接、性能、复制、锁等数据库指标
- 业务监控:TPS、QPS、响应时间等业务指标
监控频率
- 系统资源:每10-30秒
- 数据库指标:每5-15秒
- 业务指标:每1-5秒
- 历史数据:根据数据量和存储容量调整保留时间
监控范围
- 所有生产环境的KingBaseES实例
- 关键测试环境的KingBaseES实例
- 主库和备库都需要监控
2. 告警规则设置
告警级别
| 级别 | 描述 | 处理时间 |
|---|---|---|
| 紧急 | 直接影响业务,需要立即处理 | 5分钟内响应,30分钟内解决 |
| 严重 | 可能影响业务,需要尽快处理 | 15分钟内响应,1小时内解决 |
| 警告 | 潜在问题,需要关注 | 1小时内响应,4小时内解决 |
| 提示 | 信息性告警,用于监控 | 无需立即处理,定期回顾 |
告警规则示例
yaml
# Prometheus告警规则
groups:
- name: kingbase_alerts
rules:
- alert: KingbaseDown
expr: pg_up == 0
for: 5m
labels:
severity: critical
annotations:
summary: "KingBaseES 实例宕机"
description: "{{ $labels.instance }} 上的KingBaseES实例已宕机超过5分钟"
- alert: HighCPUUsage
expr: (100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "高CPU使用率"
description: "{{ $labels.instance }} 的CPU使用率超过80%"
- alert: ReplicationLag
expr: pg_stat_replication_replay_lag_seconds > 30
for: 5m
labels:
severity: warning
annotations:
summary: "主从复制延迟"
description: "{{ $labels.instance }} 的主从复制延迟超过30秒"告警通知
- 通知方式:邮件、短信、企业微信、钉钉、Slack等
- 通知频率:避免重复通知,设置合理的通知间隔
- 通知接收人:根据告警级别设置不同的接收人
3. 监控数据管理
数据保留策略
- 实时数据:保留7-30天
- 历史数据:保留3-12个月
- 归档数据:保留1-7年
数据压缩
- 对历史数据进行压缩存储
- 使用列式数据库存储监控数据
- 定期清理过期数据
数据备份
- 定期备份监控数据
- 确保监控数据的安全性和可用性
4. 监控系统集成
与CMDB集成
- 将监控系统与CMDB集成,关联服务器和数据库信息
- 便于快速定位和管理监控对象
与自动化系统集成
- 与自动化脚本集成,实现自动故障处理
- 与配置管理工具集成,实现配置自动调整
与日志系统集成
- 将监控指标与日志数据关联,便于故障定位
- 实现监控指标和日志的联合分析
版本差异(V8 R6 vs V8 R7)
V8 R6 监控指标
- 监控指标相对有限
- 缺乏部分高级监控指标
- 监控工具支持较少
- pg_stat_statements功能相对简单
- 缺乏对云监控的原生支持
V8 R7 监控指标
- 增强了监控指标的数量和种类
- 新增了pg_stat_monitor扩展
- 改进了pg_stat_statements功能
- 增强了对第三方监控工具的支持
- 支持云监控服务
- 新增了更多的性能和资源监控指标
- 改进了复制监控指标
常见问题(FAQ)
Q1:如何选择合适的监控指标?
A1:根据业务需求和数据库特点选择监控指标:
- OLTP系统:重点监控TPS、QPS、响应时间、连接数、锁等待
- OLAP系统:重点监控查询性能、磁盘IO、内存使用
- 主备集群:重点监控复制延迟、复制状态、WAL归档
Q2:如何设置合理的告警阈值?
A2:
- 根据历史数据确定基准值
- 考虑业务需求和RTO/RPO目标
- 分级别设置告警阈值
- 定期调整和优化告警阈值
Q3:如何处理大量的监控数据?
A3:
- 采用分层存储策略
- 对历史数据进行压缩
- 定期清理过期数据
- 使用专门的时序数据库存储监控数据
Q4:如何实现监控的自动化?
A4:
- 使用自动化监控工具
- 编写监控脚本和告警脚本
- 与自动化系统集成
- 实现自动故障处理
Q5:如何验证监控系统的有效性?
A5:
- 进行故障模拟测试
- 定期检查监控数据的准确性
- 验证告警规则的有效性
- 评估监控系统的响应时间
总结
监控指标是KingBaseES数据库运维的重要组成部分,通过监控关键指标,可以实时了解数据库的运行状态,及时发现和解决问题,优化数据库性能,保障业务连续性。在实际监控中,应根据业务需求和数据库特点选择合适的监控指标,设置合理的告警阈值,采用分层监控策略,并与其他系统集成,实现全面、高效的监控体系。V8 R7版本相比V8 R6版本提供了更丰富的监控指标和更好的监控工具支持,建议在新部署时优先选择V8 R7版本。
