暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

半小时快速搭建PostgreSQL简易监控

digoal 2020-11-27
651

作者

xiongcc

日期

2020-11-27

标签

PostgreSQL , 监控


背景

写得很不错, 转载一下

https://mp.weixin.qq.com/s/GukhK-y81Z64nOGVtBxG3w

1.前言
PostgreSQL的监控方案很多,功能强悍的包括zabbix、prometheus等,再搭配上grafana和echarts等可视化工具,逼格杠杠。还有针对PostgreSQL特定的监控如pg_top、pgwatch、pg_cluu、pgbadger、pigsty(这个很牛掰),当然有些不能算是严格意义上的监控,如pgbadger,更多的是帮我们分析日志。因为PostreSQL自带的统计视图很多(pg_stat*开头,所以可以很方便的集成到各种各样的监控方案里),再加上各种各样的Extension,也可以监控到底层诸如缓冲区使用率等。

今天分享的是一个使用go编写的轻量化监控工具Sampler,它自己的介绍就是:No servers, no databases, no deploy - you specify shell commands, and it just works.,不需要单独的服务器,不需要数据库,也不需要像zabbix一样在需要监控的服务器上安装agent采集端,十分轻量,另外基于go本身的优点,Sampler极容易部署。

2.开整
如上,部署极其简单,环境是centos7,两个命令就OK了

``` sudo wget https://github.com/sqshq/sampler/releases/download/v1.1.0/sampler-1.1.0-linux-amd64 -O /usr/local/bin/sampler

sudo chmod +x /usr/local/bin/sampler
```

先看一下官方的展示图:

pic

展示一下自己做的监控:

pic

在这个监控模板上,主要监控了这么几点:

1\.数据库年龄,PostgreSQL里面比较头疼的一点就是21亿事务的限制,稍微活跃一点的数据库,就会面临事务ID回卷,到达2^31 - 1000W就会打印:

WARNING: database "mydb" must be vacuumed within 177009986 transactions

HINT: To avoid a database shutdown, execute a database-wide VACUUM in "mydb".

到达还剩100W的时候,就会变成只读拒绝写了。

2\.数据库的流量,使用的基准视图是pg_stat_bgwriter,bgwriter的存在可以有效预防IO尖刺,此处摘取了其中三列buffers_backend、buffers_checkpoint和buffers_clean,buffers_backend代表直接由backend process自己主动写出的buffer。buffers_checkpoint由checkpoint写出的,buffers_clean则是bgwriter写出的,所以假如buffers_backend值过大。或者相比于buffers_checkpoint和buffers_clean,并没有小很多,那么就代表shared buffer没有维护好,后端进程不得不自己去进行刷盘的动作。

3\.缓冲区命中率,这个也和shared buffers有关,直接在缓冲区命中了那就不需要额外的IO,查询速度也就会快(这里没有考虑page cache的影响)

4\.事务提交回滚率,这个主要和应用相关,一般都会引入异常、超时等机制,那么对应到数据库往往事务就会回滚,可以起到预警作用

5\.服务器的状态,如服务器负载、cpu使用率和剩余内存等

6\.连接监控,因为PostgreSQL是进程模型,没有原生的进程池,需要时刻预防连接风暴

像其他的如表膨胀、锁和vacuum的监控等,这里就没有演示了。

Sampler支持如下几种图形:

1)Sparkline -- 趋势图

pic

2)Barchart -- 条状图

pic

3)Gauge -- 就暂时叫进度图

pic

4)Textbox -- 文本框

pic

5)Asciibox -- 不知道叫啥

pic

并且也支持类似的数据库触发器以告警发邮件等:Triggers allow to perform conditional actions, like visual/sound alerts or an arbitrary shell command. The following examples illustrate the concept.

除了支持PostgreSQL和MySQL数据库,也支持对Kafka、Docker的监控。

贴一下自己做的监控,直接复制即可使用:

``` variables:
PGPASSWORD: pwd
postgres_connection: psql -h localhost -U postgres --no-align --tuples-only

runcharts:
- title: Data write(Byte)
position: [[0, 8], [20, 12]]
rate-ms: 500
legend:
enabled: true
details: false
scale: 2
items:
- label: background writer
color: 178
sample: psql -At -U postgres -c "select 8 * (buffers_checkpoint + buffers_clean
+ buffers_backend)/1024 as total_writen from pg_stat_bgwriter;"
- label: checkpoint write
color: 162
sample: psql -At -U postgres -c "select buffers_checkpoint * 8 / (checkpoints_timed
+ checkpoints_req) as checkpoint_write_avg from pg_stat_bgwriter"
- title: PostgreSQL connections
position: [[40, 8], [40, 12]]
rate-ms: 500
legend:
enabled: true
details: false
scale: 2
items:
- label: active connections
color: 178
sample: psql -At -U postgres -c "select count() from pg_stat_activity where
state = 'active' and pid <> pg_backend_pid();"
- label: idle connections
color: 162
sample: psql -At -U postgres -c "select count(
) from pg_stat_activity where
state = 'idle' and pid <> pg_backend_pid();"
- label: idle in transaction connections
color: 32
sample: psql -At -U postgres -c "select count(*) from pg_stat_activity where
state = 'idle in transaction' and pid <> pg_backend_pid();"

barcharts:
- title: PostgreSQL Database Status
position: [[0, 0], [40, 8]]
rate-ms: 500
scale: 0
items:
- label: tuple insert
init: $postgres_connection
sample: select tup_inserted from pg_stat_database where datname = current_database();
- label: tuple delete
init: $postgres_connection
sample: select tup_deleted from pg_stat_database where datname = current_database();
- label: tuple update
init: $postgres_connection
sample: select tup_updated from pg_stat_database where datname = current_database();
- label: tuple fetch
init: $postgres_connection
sample: select tup_fetched from pg_stat_database where datname = current_database();

gauges:
- title: PostgreSQL Database Age
position: [[0, 32], [40, 8]]
rate-ms: 500
scale: 2
color: 122
percent-only: false
cur:
sample: psql -At -U postgres -c "select age(datfrozenxid) from pg_database
where datname = current_database();"
max:
sample: psql -At -U postgres -c "select 210000" --此处为了演示
min:
sample: psql -At -U postgres -c "select 100"

sparklines:
- title: CPU usage
position: [[0, 20], [40, 12]]
rate-ms: 200
scale: 0
sample: ps -A -o %cpu | awk '{s+=$1} END {print s}'
- title: PostgreSQL cache hit ratio
position: [[40, 20], [40, 12]]
init: $postgres_connection
sample: select round(sum(blks_hit)100/sum(blks_hit+blks_read),2)::numeric from
pg_stat_database where datname = current_database();
- title: PostgreSQL transaction commit ratio
position: [[40, 0], [40, 8]]
init: $postgres_connection
sample: select round(100
(xact_commit::numeric/(case when xact_commit > 0 then
xact_commit else 1 end + xact_rollback)),2)::numeric as commit_ratio from
pg_stat_database where datname = current_database();

textboxes:
- title: Server status
position: [[20, 8], [20, 12]]
rate-ms: 500
sample: top -bn 1 | head -n 5

asciiboxes:
- title: PostgreSQL Version
position: [[40, 32], [40, 8]]
rate-ms: 500
color: 43
sample: psql -At -U postgres -c "select version()"
border: false
font: 2d
```

3.结尾
Sampler是go编写的轻量化监控工具,支持多种图表,无需像诸如zabbix + grafana这样的组合拳即可酷炫地展示,另外部署方便,不需要过多的研究摸索,就可以很快上手,不失为一个好的临时监控解决方案。

参考:https://gitee.com/mirrors/Sampler#databases。

PostgreSQL 许愿链接

您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.

9.9元购买3个月阿里云RDS PostgreSQL实例

PostgreSQL 解决方案集合

德哥 / digoal's github - 公益是一辈子的事.

digoal's wechat

文章转载自digoal,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论