pgwatch2在CentOS7上的安装和使用
1. 前言
1.1 pgwatch2 介绍
pgwatch2,是由CYBERTEC开发的PostgreSQL数据库的指标收集器和可视化解决方案。 这个灵活的,自包含的监控工具将PostgreSQL监控提高到一个新的水平。
尽管有许多PostgreSQL监控解决方案,但其中大多数解决方案因太复杂而难以启动,并且因不灵活而无法自行扩展功能。 PGWatch试图通过提供以前无法提供的灵活性并仅专注于指标收集来改变这种状况,为演示方提供了可用的最好的仪表板工具。PGWatch充当远程度量收集后台程序,以正常用户的身份定期连接到数据库,并读取PostgrSQL统计子系统提供的度量信息。 这样做的好处是,您不需要任何特殊的用户权限,也不必在数据库服务器本身上安装任何扩展,从而可以在受限环境(例如AWS RDS)中使用。
1.2 运行环境
硬件环境:
CPU:1个1核8进程,型号Intel(R) Xeon(R) CPU E7-4820 v4 @ 2.00GHz
内存:32G
操作系统:CentOS 7.7 虚拟机(推荐使用CentOS 7 以上版本)
软件环境: 配置Yum源,并安装
python 2.7.5
docker-ce-9.03.5-3.el7.x86_64
containerd.io-1.2.10-3.2.el7.x86_64
docker-ce-cli-19.03.5-3.el7.x86_64
另外,本实验的pgwatch2 的版本是1.7.0
2. 操作流程
2.1 安装 docker
Docker 的安装方法如下:
1. 执行下面的命令,查看内核版本:
uname -r
CentOS 7 的内核版本大于3.10才能安装docker
2. 关闭和开启一些服务,这样可以提高安装的成功率。
关闭防火墙:
systemctl disable --now firewalld
关闭selinux:
setenforce 0
sed -ri '/^ {0,}SELINUX=/c\SELINUX=disabled' /etc/selinux/config
关闭NetworkManager :
systemctl disable --now NetworkManager
关闭dnsmasq:
systemctl disable --now dnsmasq
开启namespace,需要重启系统来生效:
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
reboot
3. 如果安装了旧版本的docker组件,删除它们:
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
4. 安装需要的包:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
5. 设置稳定的仓库。这里我们设置国内的阿里云仓库。Docker官方的仓库在国内不可用。
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
6. 安装docker引擎:
sudo yum install docker-ce docker-ce-cli containerd.io
7. 创建docker 的配置文件daemon.json。
执行下面的命令:
mkdir /etc/docker
cd /etc/docker
vi daemon.json
在文件中输入如下内容:
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],
"insecure-registries": ["hub-mirror.c.163.com"]
}
这里,我们将docker服务器的地址替换成了网易的镜像。因为默认的官方地址在国内不可用。
8. 启动docker:
systemctl start docker
2.2 安装 pgwatch2
目前pgwatch2 已经集成到了docker中,这使得它的安装非常方便。
pgwatch2官方也推荐使用docker安装。
执行下面的命令就可以安装pgwatch2,这里我们安装的是1.7.0版本。
docker pull cybertec/pgwatch2:1.7.0
这条命令执行后,客户端会从docker注册服务器(registry)中拉取pgwatch2的镜像(有将近1G),整个过程消耗时间较长。这对网络的流畅和稳定有较高要求,如果因网络问题而中断,之前所有的努力都会付之东流。
创建成功后,程序会返回这个容器的id。
我们可以通过如下命令查看已存在的容器:
docker ps –a
这样pgwatch2的基本安装就完成了。
3. 使用pgwatch2监控数据库
Pgwatch2 获得各项指标度量的方法是在被监控的数据库中运行专门的sql语句,以及在这些数据库中创建一些度量帮助函数并调用它们。数据库所在服务器上需要安装python。
目前,pgwatch2-1.7.0 及以上版本需要被监控的服务器上安装python 3。而pgwatch2-1.7.0以下版本需要python 2
本文中,我们使用pgwatch2-1.7.0。
3.1 配置被监控的数据库及服务器
Windows和Linux服务器上的配置会有不同。
3.1节会讲到这个问题。
3.1.1 数据库在Linux上
1. 进入数据库的数据目录data,修改文件 pg_hba.conf,添加如下内容:
host all all 10.40.239.234/32 md5
其中10.40.239.234是 pgwatch2 所在服务器的IP地址。这表示允许10.40.239.234访问。
或者添加:
host all all 0.0.0.0/0 md5
表示允许来自所有地址的访问。
2. 编辑postgresql.conf,确保下列参数正确配置:
listen_addresses = '*'
shared_preload_libraries = 'pg_stat_statements'
3. 被监控的数据库所在服务器上应该安装python 3和模块psutil,因为pgwatch2需要在被监控的服务器上使用他们。
Linux服务器上一般默认安装了python 3,这时我们只需要安装一个python模块psutil(注意不是yum源中的psutils)。安装psutil的一种方法如下:
3.1 首先进入官网,根据你的python 版本psutil。
例如,python的版本是3.6,则支持的psutil的版本是5.3.0到5.7.0(截止2019-02-19 最新)。
3.2 下载psutil的源码。这里我们下载psutil 5.6.0。
3.3 在数据库所在服务器上解压源码。
tar zxvf ./psutil-5.6.0.tar.gz
3.4 进入解压后的目录,编译并安装程序。需要执行以下三条命令(注意第二条命令是指定编译的python的版本,否则无法安装成功):
cd ./psutil-5.6.0
make && make install PYTHON=python3.6
python setup.py install
4. 被监控的PostgreSQL上应该安装plpython3u模块,因为 pgwatch2程序需要在被监控的数据库中创建用于度量的plpython函数(基于python 3),来获取一些监控数据。
小知识:
PostgreSQL 支持用python语言编写函数,这项功能称为plpython。启用这项功能要求在PostgreSQL安装 plpythonu 或 plpython3u 两个模块。其中plpythonu是基于Python 2的,而plpython3u则是基于python 3的。
3.1.2 数据库在Windows上
1. 进入数据库的数据目录data,修改文件 pg_hba.conf,添加如下内容:
host all all 10.40.239.234/32 md5
其中10.40.239.234是 pgwatch2 所在服务器的IP地址。这表示允许10.40.239.234访问。
或者添加:
host all all 0.0.0.0/0 md5
表示允许来自所有地址的访问。
2. 编辑postgresql.conf,确保下列参数正确配置:
listen_addresses = '*'
shared_preload_libraries = 'pg_stat_statements'
3. 在Windows服务器上安装、配置python 3。
Windows版的PostgreSQL 9.0以上版本只支持plpython3u而不支持plpythonu。因此需要安装python 3。
要注意Windows 版本PostgreSQL和Python的版本对应关系。经验证,PostgreSQL 11 支持Python 3.6-3.8;PostgreSQL 9.6只支持Python 3.3;Postgresql 9.2-9.5只支持Python 3.2。
在Python官方网站上下载需要的版本,并安装。这里不详细介绍。
本文以postgresql 11 为例。下载 Python 3.6。
4. 安装 setuptools。
4.1 进入官网,下载setuptools源码(zip)。如图,我们下载setuptools 45.2.0。
4.2 解压zip 文件,进入文件目录,打开控制台,执行下面的命令完成安装:
python setup.py install
5. 安装pip。
5.1 进入官网,下载pip源码(tar.gz)
5.2 解压下载后的源码,进入文件目录,打开控制台,执行下面的命令完成安装:
python setup.py install
6. 下载并安装psutil,具体方法如下。
6.1 首先进入官网,根据你的python 版本psutil。
6.2 现在进入 psutil-5.6.7-cp36-cp36m-win_amd64.whl 所在的文件夹,打开控制台,执行命令,完成psutil的安装:
pip install psutil-5.6.7-cp36-cp36m-win_amd64.whl
而pgwatch2-1.7.0开始是基于python3的。
7. 在PostgreSQL 中安装python驱动。具体方法参考下面的文档
在postgresql (Windows版)中使用plpython
3.2 启动pgwatch2
执行如下命令启动pgwatch2:
docker run -d -p 3000:3000 -p 5432:5432 -p 8086:8086 -p 8080:8080 -p 8081:8081 -p 8088:8088 --name pw2 cybertec/pgwatch2
注意,在下面的命令中:
docker run –p port1:port2
port1表示映射到主机上的端口,port2表示容器中暴露的端口。这里port1不能和主机上已经被占用的端口相同,如果你主机上运行的程序的端口与上述端口冲突,则只需修改docker 映射到主机上的端口。
这里docker容器暴露的端口代表的程序如下:
- 5432 - Postgres配置(或度量存储)数据库
- 8080 - 管理Web UI(受监控的主机,指标,指标配置)
- 8081 - 收集健康检查/收集指标数量(JSON)的统计数据。
- 3000 - Grafana仪表板
- 8086 - InfluxDB API
- 8088 - InfluxDB备份端口
3.3 配置pgwatch2
打开监控配置页面,配置要监控的数据库。
本实验中,计算机的ip地址是10.40.239.234,因此打开网址
http://10.40.239.234:8080/dbs ,进行配置:
下面是打开后的页面:
下面我们会讲到如何配置这些参数。
3.3.1 重要的配置参数
我们需要重点关注下面几个参数:
Unique name
监控条目的名字。选一个好的名字,确定之后不要更改(InfluxDB数据更改起来并不容易)。
DB type
数据库的类型。是指 postgresql 搭建的形式,而不是指哪一种品牌的数据库。
一般选择 postgres。下面是不同选项及其含义。
- postgres - 需要指定将数据连接到单个要监控的数据库。 使用Web UI时,将“DB name”字段保留为空,然后作为一次操作,将提取所有非模板数据库名称,并以“唯一名称”字段值作为前缀并将其添加到监控中(如果尚未监控)。 内部监控始终是“每个数据库”而不是“每个集群”。
- postgres-continuous-discovery - 需要指定将数据连接到Postgres集群(带有DB名称),然后Metrics守护程序将定期扫描集群(连接到“template1”数据库,该数据库应该存在)并添加任何已发现但尚未监控的数据库来进行监控。 在这种模式下,还可以指定正则表达式来包含/排除某些数据库名称。
- pgbouncer - 用于跟踪来自PgBouncer的“ SHOW STATS”命令的指标。 必须插入要监控的PgBouncer“池”的名称来代替Postgres“数据库名称”。
- patroni - Patroni是一个Postgres的HA /集群管理器,它依赖于DCS(分布式共识存储)来存储其状态。 通常,在这种设置中,节点来来往往,当前谁是主节点也无关紧要。 为了使监控这样的动态星座更加容易,pgwatch2支持从所有受支持的DCS-s(例如,Zookeeper,Consul)中读取集群节点信息,但目前仅适用于没有应用安全性的较简单情况(这实际上是受信任的常见情况)环境)。
- patroni-continuous-discovery - 像正常的Patroni一样,但是监控所有DB(或仅匹配那些正则表达式模式的DB)。
DB host
要监控DB 主机地址
DB port
要监控DB 的端口
DB dbname
要监控的数据库的名称。如果留为空,将从集群中找到的所有非模板(template)DB添加到监控中(如果尚未监控),并以“Unique name”的值作为前缀。 对于 “pgbouncer” 数据库类型,请插入“池”名称。与“postgres-continuous-discovery”无关。
DB name inclusion pattern
要包含的数据库。POSIX正则表达式输入。 仅与dbtype = postgres-continuous-discovery | patroni-continuous-discovery相关
DB name exclusion pattern
要排除的数据库。POSIX正则表达式输入。 仅与dbtype = postgres-continuous-discovery | patroni-continuous-discovery相关
DB user
数据库用户
DB password
数据库密码
Password encryption
密码(在存储配置信息的数据库)中的加密方式,有plain-taxt(文本)和aes-gcm-256 两种。默认是文本格式。
Auto-create helpers?
如果选中,收集器将自动尝试在被监控的数据库中创建度量获取帮助器(数据库函数)(CPU负载监控,stat_statements等)-需要DB user 是SUPERUSER才能成功。
Preset metrics config
预置的度量配置。它包括下面这些配置。有一些度量要求被监控数据库中安装了plpythonu模块。
- basic
只有最重要的度量 - WAL, 数据库级别的统计 (大小, 事务和后台进程的数量)
- exhaustive
所有重要指标,可让您更深入地了解性能
- full
几乎所有可用的指标,以更深入地了解性能。
- full_influx
几乎所有可用的指标,以更深入地了解性能
- minimal
单个“关键绩效指标”查询,用于快速集群/数据库概述
- pgbouncer
基于每个 pgbouncer 统计
- prometheus
类似于“exhaustive”,但没有一些可能运行时间更长的指标,并且这些指标保持状态
- standard
"basic" 级别 + 表, 索引, stat_statements 统计
- superuser_no_python
类似 exhaustive, 但没有 PL/Python 帮助程序
- unprivileged
没有包装的函数 + 只有 pg_stat_statements 扩展是需要的 (开发者模式)
这些配置的具体内容可以从页面中看到。
下图是配置的具体含义和内容,可以修改:
Custom metrics config
用户自定义的度量配置,格式与 Preset metrics config 中具体模式的配置格式相同。
Statement timeout
统计语句运行的超时时间。以秒为单位。为防万一,对于关键数据库应保持较低的值。注意! 对于可能长时间运行的内置膨胀估算指标,超时将为max(30min,$userInput)
Master mode only?
仅在主服务器(master server)上获取指标。
Enabled?
一个提示 - 默认不选择。若'db name'为空,而这一项勾选了,则会监控所有发现的数据库。
更多参数信息,可以参考pgwatch2 官方文档
3.3.2 以超级用户监控的配置
如图是我们所配置的一个监控案例。这里使用的是DB user 是postgres。
我们可以选择不同的Preset metrics config,代表不同的监控粒度。
注意这个参数 “Auto-create helplers?”。它的含义是这样的: 如果选中,收集器将自动尝试在被监控的数据库中创建度量获取帮助器(CPU负载监控,stat_statements等)。
3.2.3 以非超级用户监控的配置
有些对安全性要求很高的场景不允许用户使用postgres这样的管理员访问数据库。这种情况下,我们需要在被监控的数据库上,创建一个用于监控的用户。而使用非管理员,一些监控程序则需要手动创建才能使用。
1. 在被监控的数据库中,执行下面的命令创建用户pgwatch2,并授予监控权限:
CREATE ROLE pgwatch2 WITH LOGIN PASSWORD 'pgwatch2';
GRANT pg_monitor TO pgwatch2;
2. 在配置页面http://10.40.239.234:8080/dbs 中配置监控条目。其中DB User是pgwatch2。而 Auto-create helpers?(参见3.2.1 重要的配置参数)这一选项则会失效,即不会创建相关度量函数,如果想使用这些度量功能,需要进行第3步操作。
3. 若监控的数据库运行在linux上,则按照如下方法手动创建这些度量函数;如果数据库运行在windows上,则跳过这一步。
3.1 下载pgwatch2的源码,并解压。
3.2 打开解压后的目录,并进入 pgwatch2\metrics\00_helpers 路径,如图。
3.3 这里每个文件夹中都有一个度量帮助程序。对每一个文件夹,执行下列操作:
3.3.1 进入文件夹,以get_stat_activity 为例,可看到里面有一个或多个子文件夹。这里,9.0,9.2 分表代表他们各自支持的postgresql最低版本。打开版本小于或等于你所要监控的postgresql的版本的文件夹中,版本最大的那个文件夹。例如,若监控的是postgresql 11,则选择9.2。
3.2.2 在你要监控的数据库中,用超级用户执行其中的sql。直到所有的度量SQL都执行完成。
3.4 查看监控工具
在监控的web页面,即可查看监控的信息。
如图所示,可以看到各类监控指标。
常见的监控指标有:
Instance state,实例状态。是主机还是备机;
TPS,每秒事务数;
QPS,每秒查询语句数;
Query runtime,查询运行时间;
DB siz,数据库大小;
Approx Table Bloat,表的大约膨胀率;
CPU Load CP,负载率;
Tuple ins. / upd. / del. Statistics,元组插入/更新/删除统计;
Shared Buffers hit ratio,缓冲区命中率;
Rollback ratio,回滚率;
Total sessions,总会话数;
Deadlocks,死锁;
Temp bytes,临时内存大小;
WAL rate,WAL的写入速率;
我们可以在右上角的下拉框里查看更多功能页面。
下图是更多的页面:
更多参数信息,可以参考pgwatch2 官方文档
参考文献
[1] Docker Inc. Get Docker Engine - Community for CentOS.
[2] hyzhou. Docker CE 镜像源站. 2017-06-26