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