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/samplersudo 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: pwdpostgres_connection: psql -h localhost -U postgres --no-align --tuples-onlyruncharts:- title: Data write(Byte)position: [[0, 8], [20, 12]]rate-ms: 500legend:enabled: truedetails: falsescale: 2items:- label: background writercolor: 178sample: psql -At -U postgres -c "select 8 * (buffers_checkpoint + buffers_clean+ buffers_backend)/1024 as total_writen from pg_stat_bgwriter;"- label: checkpoint writecolor: 162sample: psql -At -U postgres -c "select buffers_checkpoint * 8 / (checkpoints_timed+ checkpoints_req) as checkpoint_write_avg from pg_stat_bgwriter"- title: PostgreSQL connectionsposition: [[40, 8], [40, 12]]rate-ms: 500legend:enabled: truedetails: falsescale: 2items:- label: active connectionscolor: 178sample: psql -At -U postgres -c "select count(*) from pg_stat_activity wherestate = 'active' and pid <> pg_backend_pid();"- label: idle connectionscolor: 162sample: psql -At -U postgres -c "select count(*) from pg_stat_activity wherestate = 'idle' and pid <> pg_backend_pid();"- label: idle in transaction connectionscolor: 32sample: psql -At -U postgres -c "select count(*) from pg_stat_activity wherestate = 'idle in transaction' and pid <> pg_backend_pid();"barcharts:- title: PostgreSQL Database Statusposition: [[0, 0], [40, 8]]rate-ms: 500scale: 0items:- label: tuple insertinit: $postgres_connectionsample: select tup_inserted from pg_stat_database where datname = current_database();- label: tuple deleteinit: $postgres_connectionsample: select tup_deleted from pg_stat_database where datname = current_database();- label: tuple updateinit: $postgres_connectionsample: select tup_updated from pg_stat_database where datname = current_database();- label: tuple fetchinit: $postgres_connectionsample: select tup_fetched from pg_stat_database where datname = current_database();gauges:- title: PostgreSQL Database Ageposition: [[0, 32], [40, 8]]rate-ms: 500scale: 2color: 122percent-only: falsecur:sample: psql -At -U postgres -c "select age(datfrozenxid) from pg_databasewhere datname = current_database();"max:sample: psql -At -U postgres -c "select 210000" --此处为了演示min:sample: psql -At -U postgres -c "select 100"sparklines:- title: CPU usageposition: [[0, 20], [40, 12]]rate-ms: 200scale: 0sample: ps -A -o %cpu | awk '{s+=$1} END {print s}'- title: PostgreSQL cache hit ratioposition: [[40, 20], [40, 12]]init: $postgres_connectionsample: select round(sum(blks_hit)*100/sum(blks_hit+blks_read),2)::numeric frompg_stat_database where datname = current_database();- title: PostgreSQL transaction commit ratioposition: [[40, 0], [40, 8]]init: $postgres_connectionsample: select round(100*(xact_commit::numeric/(case when xact_commit > 0 thenxact_commit else 1 end + xact_rollback)),2)::numeric as commit_ratio frompg_stat_database where datname = current_database();textboxes:- title: Server statusposition: [[20, 8], [20, 12]]rate-ms: 500sample: top -bn 1 | head -n 5asciiboxes:- title: PostgreSQL Versionposition: [[40, 32], [40, 8]]rate-ms: 500color: 43sample: psql -At -U postgres -c "select version()"border: falsefont: 2d

3.结尾

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

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

Sampler 半小时快速搭建PostgreSQL简易监控相关推荐

  1. 如何半小时免费搭建NGINX网站?

    原文作者:楚发 原文链接:如何半小时免费搭建NGINX网站? 转载来源:NGINX开源社区 近半年直播越来越火,老罗都登场带货了,疫情就像催化剂,逼着线下各行各业转战线上.毋庸置疑,今年是直播元年. ...

  2. 【云计算的1024种玩法】一.半小时轻松搭建属于自己的Discuz论坛

    半小时轻松搭建属于自己的Discuz论坛 简介: 操作步骤: 一.远程到创建的服务器内部 1.使用远程工具登陆到服务器中 二.安装WEB服务-Apache 2.1 安装Apache服务 2.2 启动h ...

  3. 敲代码时如何快速移动光标_数控加工中心编程入门知识,半小时快速入门!

    数控加工中心编程入门知识汇总,教你半小时快速入门!不管做哪一行,想要成为个中高手,必然要经得住时间的历练,自身要不断提高工作能力,要想成为一个数控高手,从大学毕业进工厂起,最起码需要6年以上的时间.既 ...

  4. 敲代码时如何快速移动光标_数控加工中心编程入门知识,半小时快速入门!超简洁明了!...

    数控加工中心编程入门知识汇总,教你半小时快速入门!不管做哪一行,想要成为个中高手,必然要经得住时间的历练,自身要不断提高工作能力,要想成为一个数控高手,从大学毕业进工厂起,最起码需要6年以上的时间.既 ...

  5. 快速搭建一个简易的HTTP服务器用于文件分享与下载

    需要快速搭建一个简易的HTTP服务器进行文件的分享与下载.主要有以下两种方法: 1. 使用python 来实现 import http.server import socketserverPORT = ...

  6. smarty半小时快速上手入门教程

    本文讲述了smarty快速上手入门的方法,可以让读者在半小时内快速掌握smarty的用法.分享给大家供大家参考.具体实现方法如下: 一.smarty的程序设计部分: 在smarty的模板设计部分我简单 ...

  7. Github Pages + Jekyll 独立博客一小时快速搭建上线指南

    只要一小时?! 人生道路上布满了坑,于是有了人生导师.  美丽的地球上布满了坑,于是有了Google Earth.  使用Github Pages搭建独立博客的过程中布满了坑,所以有了这篇指南. 我在 ...

  8. 2 小时快速搭建一个高可用的 IM 系统

    知道的越多,不知道的就越多,业余的像一棵小草! 编辑:业余草 来源:https://www.xttblog.com/?p=4994 本文快速搭建的 IM 系统也是使用 Go 语言来快速实现的,这里先和 ...

  9. 使用SpringBoot一小时快速搭建一个简单后台管理(增删改查)(超详细教程)

    最近也是临近期末了,各种的期末大作业,后台管理也是很多地方需要用到的,为了方便大家能快速上手,快速搭建一个简单的后台管理,我花了两天时间整理了一下 我会从0开始介绍,从数据库的设计到前端页面的引入最后 ...

  10. 一小时快速搭建基于阿里云容器服务-Kubernetes的Web应用

    本文面向的读者 如果您是一个Kubernetes的初学者,本文可以帮助你快速在云上搭建一个可实际使用的集群环境,并发布自己的第一个应用.你无须提前准备任何的硬件资源或者下载任何的软件包.  如果您已经 ...

最新文章

  1. 学霸女孩放弃保研再次高考,原因让人泪目…
  2. Android开发面试题Service之startService和bindService之间的区别
  3. Ubuntu安装pycharm并且激活
  4. 信息学奥赛一本通C++语言——1019: 浮点数向零舍入
  5. springboot发送邮件_SpringBoot发送邮件如何实现,SpringBoot发送邮件详解(附代码)...
  6. 全面整理(随时更新)
  7. linux元组和列表的区别,列表,元组,集合
  8. Python文件操作与matplotlib数据可视化案例一则
  9. 查看网络抖动_Linux下3种常用的网络测速工具
  10. Smobiler字节小程序开发指南
  11. (第六章)hive之查询
  12. 特征选择 | MATLAB实现NCA(近邻成分分析)特征选择
  13. 栈中的peek()、pop()和push()、Add()方法
  14. codeBlock软件下面的框不见了,怎么办?
  15. 家用计算机都是专用计算机吗,什么是因特网概念和互联网一样吗(因特网发展历程)...
  16. 什么是时序数据?如何治理?
  17. APP——功耗测试(耗电测试)——adb命令复杂获取分析
  18. Scala与Java语言的差异
  19. 数据结构课程设计论文--学生信息管理系统
  20. 数据分片排序oracle,基于ORACLE数据库的海量数据脱敏方法与流程

热门文章

  1. java突然无法加载主类_JAVA之中出现无法加载主类的情况解决方法
  2. Excel成神之道-005-用countif统计客人第几次进店
  3. android 软解8k视频,Android Q+5G现场播放8K视频:画面流畅
  4. java se 知识点(一)
  5. 空间直线与平面的交点
  6. 当游戏设计遇上建筑学
  7. 揭秘AI创业江湖里的“师徒帮”:同门师兄弟搭档 导师坐镇后方
  8. Mysql数据库repair table 修复表
  9. 手把手搭个vue的脚手架 - 2. 模板搭建
  10. VMware12版虚拟机怎么安装win7系统(win7镜像ios安装版)