数据库监控,其实是一个收集指标,分析指标,终得出系统当前状态数据的结果.同时对于关键指标正常的情况和非正常的情况,进行分析终得出阈值,在触发阈值后开始进行报警. 另外监控还有两个用途:一是用于历史数据分析和展示,帮助我们确定系统的中长期趋势,从而帮助我们计划升级;二是在出现问题时立即采取行动.
一般一个系统监控需要监控的点:
CPU Usage
Network Usage
Disk Space / Disk Utilization
RAM Usage
Disk IOPS
Swap space usage
Network Errors
当然这里并不是一个DB 需要的完整的监控,仅仅是基于数据库系统中的LINUX系统的资源监控.
这里相关的监控就不在展开了. 对于POSTGRESQL 的基本监控有以下几个点
Buffer cache performance (cache hits vs disk reads)
Number of commits
Number of connections
Number of sessions
Checkpoints and bgwriter statistics
Vacuums
Locks
Replication
获得这些信息,有两种途径,
1 通过日志来进行分析
2 通过查询数据库来进行相关的数据获取
关于监控的两种方式,是需要区别的对待的, 我们可以通过以下的两种情况来对采用何种监控
着重于历史性的分析和优化方面的信息, 比较适合使用POSTGRESQL 的日志系统,由于POSTGRESQL 的日志比较完整,所以比较适合进行这方面的数据提取和验证.
另一种则是定时的对数据库中的信息进行收集,这样的数据提取的方式,主要是一方面对短时间的信息趋势进行跟踪,另一方面对触发阈值的指标进行报警.
所以两种监控对应, 目的是不同,操作方式是不同的,数据分析的方式不同,应用的场景也是不同的.
这里我们从PostgreSQL Statistics Collector 来开始PG的monitor 之旅, 类似很多其他的数据库,例如有些数据库有information_schema, perforamnce_schema, sys库, 或者 DMV 动态的监控视图,等等, PG 也有丰富的动态信息收集系统来进行数据库信息的收集工作.
这里也分两种, 一种为系统正在操作的信息, 另一种是从数据库系统开机后系统的累加信息.
Dynamic statistics views
pg_stat_activity、pg_stat_replication、pg_stat_wal_receiver或逻辑状态pg_stat_subscription、pg_stat_ssl和真空状态pg_stat_progress_vacuum的信息。
Collected statistics views
提供有关的INDEX ,序列, wal archive ,表,库,以及后端进程运行的一些信息.
下面我们就可以通过一个事例来看看获得PG当前数据库连接数的几种方式有什么不同.
ps -ef |grep postgres |wc -l
通过上面的命令可以获得访问机器的与POSTGRESQL有用的sessions ,部分监控session就是这样做的, 但实际上这样的监控有一个问题,就是答非所问.
更多的监控的方法是通过
SELECT count(*) FROM pg_stat_activity;
通过上面命令我们可以得到更的信息. 实际上我们还可以更加的准确.
psql -U admin -p 5432 -h 192.168.198.100 -d postgres -c 'SELECT count(*) FROM pg_stat_activity WHERE NOT pid=pg_backend_pid()'
刨除自己连接的.
从上面的获得监控信息的方式来看,第三个看起来是的,实际上
1 监控的参数是否有必要百分之百准确.
2 监控和性能之间有没有必然的联系
3 获得监控参数的难易程度
从上面3点来看, 上面三种监控的方式, 从监控session的数量来看,实际上是没有太多必要, 并且从上面几种监控session 数量的方式中, 种是不会对系统产生影响的,并且也不需要在数据库系统中建立账号信息,会引起一些不必要的安全问题. 所以到底怎么获得一个数据库的监控信息是需要考虑的.
POSTGRESQL监控中有些情况是需要安装extension pg_stat_statements
通过pg_stat_statements 来查看相关慢查询的语句.
create extension pg_stat_statements;
alter system set shared_preload_libraries TO 'pg_stat_statements';
由于篇幅原因,这里就不展开了,之前有pg_stat_statements 的介绍.