概述
Prometheus使用postgresql需要使用postgresql-adapter進行數據轉換。在安裝postgresql-adapter之前需要安裝2個擴展:pg_prometheus
和timescaledb
官方推薦使用PostgreSQL
, pg_prometheus
,和TimescaleDB
打包在一起的容器,但對於使用已有的postgresql來說並不合適,故需要手動編譯安裝。
環境准備
使用os為:redhat 7.4
假設已經安裝好postgresql,本次使用的postgresql版本為11.1,安裝路徑為:/usr/pgsql-11/bin/
。安裝過程中如果遇到psql: command not found
或No package pg_config available
時執行如下命令即可:
# export PATH=$PATH:/usr/pgsql-11/bin/
安裝cmake
編譯pg_prometheus
和timescaledb
都會使用到cmake。
從官網下載cmake二進制版本,使用版本為3.15.1
# tar -zxvf cmake-3.15.1-Linux-x86_64.tar.gz
# mv cmake-3.15.1-Linux-x86_64 cmake-3.15.1
# mv cmake-3.15.1 /user/local/bin
# export PATH=$PATH:/usr/local/bin/cmake-3.15.1/bin/
安裝clang
編譯pg_prometheus
會使用到clang,且對clang版本有要求。clang的安裝可參照CentOS 7 編譯安裝clang+llvm
下載clang源碼,本次使用的clang版本為7.1.0,下載cfe-7.1.0.src.tar.xz,clang-tools-extra-7.1.0.src.tar.xz,compiler-rt-7.1.0.src.tar.xz,llvm-7.1.0.src.tar.xz並解壓。安裝路徑為:/usr/local/clang
。執行如下步驟編譯clang,時長大約1小時。
# export PATH=$PATH:/usr/local/bin/cmake-3.15.1/bin/ #已經安裝好的cmake
# mv cfe-7.1.0.src clang
# mv clang/ llvm-7.1.0.src/tools/
# mv clang-tools-extra-7.1.0.src extra
# mv extra/ llvm-7.1.0.src/tools/clang/
# mv compiler-rt-7.1.0.src compiler-rt
# mv compiler-rt-7.1.0.src/projects/
# mkdir build-7.1.0
# cd build-7.1.0
# cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/usr/local/clang -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=On ../llvm-7.1.0.src
# make -j 4
# make install
安裝postgresql devel
從官網下載並安裝postgresql11-devel-11.2-2PGDG.rhel7.x86_64.rpm即可,該rpm包含postgresql的libraries和頭文件,編譯pg_prometheus時會用到。
安裝pg_prometheus
安裝好clang和postgresql devel之后就可以編譯pg_prometheus了。
官方下載pg_prometheus源碼,執行如下命令即可編譯:
# make
# make install # Might require super user permissions
在make時可能會遇到如下問題:
問題1:
fatal error: 'stddef.h' file not found
原因:缺少頭文件,該頭文件是clang定義的,可能是因為clang安裝路徑的原因,將頭文件拷貝過去即可
解決:cp /usr/local/clang/lib/clang/7.1.0/include/* /usr/include/
---注意不要覆蓋原有的頭文件
問題2:
/usr/lib64/llvm5.0/bin/llvm-lto: No such file or directory
原因:找不到llvm-lto的可執行文件,同樣拷貝即可
解決:執行如下命令拷貝
mkdir -p /usr/lib64/llvm5.0
cp /usr/local/clang/bin/* /usr/lib64/llvm5.0/bin/
創建pg_prometheus擴展
- 在postgresql的postgresql.conf中添加:
shared_preload_libraries = 'pg_prometheus'
,重啟psql - 使用psql創建擴展:
CREATE EXTENSION pg_prometheus;
- 創建role:
CREATE ROLE admin WITH LOGIN PASSWORD 'admin';
- 授權role admin:
GRANT ALL ON SCHEMA prometheus TO admin;
- 創建table:
SELECT create_prometheus_table('metrics');
重啟psql加載pg_prometheus.so
動態庫時可能會遇到如下問題
問題1:
could not load library "/usr/pgsql-11/lib/pg_prometheus.so": /usr/pgsql-11/lib/pg_prometheus.so: undefined symbol: Float8GetDatum
原因:動態庫缺少外部符號
解決:Float8GetDatum定義在postgresql源碼的src/backend/utils/fmgr/fmgr.c
中,內容如下,將其拷貝到pg_prometheus的src/prom.c中,重新編譯pg_prometheus.so即可
Datum
Float8GetDatum(float8 X)
{
float8 *retval = (float8 *) palloc(sizeof(float8));
*retval = X;
return PointerGetDatum(retval);
}
#endif
問題2:
lock file "postmaster.pid" already exists
原因:存在pid文件
解決:在postgres的數據庫目錄中刪除postmaster.pid即可
安裝timescaledb
下載timescaledb源碼,解壓后執行如下命令即可
# cd build && make
# make install
創建timescaledb擴展
- pgsql的postgresql.conf添加:
shared_preload_libraries = 'pg_prometheus,timescaledb'
- 創建擴展:
CREATE EXTENSION timescaledb;
啟動postgresql-adapter
使用容器啟動
從dockerhub下載鏡像
由於使用容器連接postgresql,故pgsql的pg_hba.conf中添加如下內容,172.17.0.2/16為容器的IP段,重啟psql
host all admin 172.17.0.2/16 md5
啟動命令如下,需要注意的是,由於在容器內部運行,-pg.host必須指定postgresql主機的地址,而非loopback接口
# docker run --name prometheus_postgresql_adapter -d -p 9201:9201 prometheus-postgresql-adapter:0.4 -pg.user=admin -pg.host=${psqlIP} -pg.port=5432 -pg.password=admin -pg.database=postgres -pg.prometheus-log-samples
使用可執行文件啟動
下載官方源碼,解壓后執行如下命令編譯即可。由於安裝依賴很多庫,建議在如阿里雲海外主機上編譯后拷貝下來
# go mod download
# make
此時使用本地地址連接postgresql,故pgsql的pg_hba.conf中添加如下內容,重啟psql:
host all admin 127.0.0.1/32 md5
啟動命令如下:
# ./prometheus-postgresql-adapter -pg.user=admin -pg.password=admin -pg.database=postgres -pg.prometheus-log-samples
配置Prometheus
Prometheus配置文件加入如下命令即可:
remote_write:
- url: "http://<adapter-address>:9201/write"
remote_read:
- url: "http://<adapter-address>:9201/read"
timescaledb的使用
timescaledb具體使用可以參見官網API,下面給出常用的方式:
SELECT * FROM timescaledb_information.hypertable; //查看hypertable的信息
SELECT * FROM timescaledb_information.hypertable WHERE table_schema='public' AND table_name='metrics_values'; //查看schema中特定表的信息
SELECT * FROM hypertable_relation_size_pretty('metrics_values'); //查看表大小
SELECT * FROM indexes_relation_size_pretty('metrics_values'); //查看表中的index大小
SELECT * FROM chunk_relation_size_pretty('metrics_values'); //查看chunk大小
SELECT drop_chunks(interval '3 months'); //手動丟棄超過3個月以上的chunk
SELECT add_drop_chunks_policy('metrics_values', INTERVAL '6 months'); //定制drop_chunks策略,自動清除超過6個月的chunk
SELECT remove_drop_chunks_policy('metrics_values'); //刪除drop_chunks策略
SELECT * FROM timescaledb_information.drop_chunks_policies; //查看drop_chunks丟棄策略
SELECT * FROM timescaledb_information.policy_stats; //查看策略的詳細信息
PS:直接源碼編譯的timescaledb的license為社區版,無法使用add_drop_chunks_policy
等功能
TIPS:
問題:
環境拓撲為2個Prometheus做高可用同時向一個postgresql進行write/read。
在對Prometheus+postgresql-adapter進行重啟等操作后,發現postgresql-adapter會與Prometheus端創建大量tcp連接(含大量close_wait和establish狀態的連接),由於會持續創建tcp連接,導致系統內存不足觸發OOM
解決:
停止Prometheus並重新創建Prometheus容器即可。
在對postgresql-adapter重啟后,最好重啟Prometheus端
總結
使用postgresql-adapter難點就是要編譯出2個動態庫文件pg_prometheus.so
和timescaledb.so