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

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

先看一下官方的展示图:

展示一下自己做的监控:


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

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 -- 趋势图

2)Barchart -- 条状图      

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

4)Textbox -- 文本框

5)Asciibox -- 不知道叫啥

并且也支持类似的数据库触发器以告警发邮件等: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。


请使用浏览器的分享功能分享到微信等