# 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(
http://dwz.date/bUR6
)
下载 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 即可
DatumFloat8GetDatum(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;
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://:9201/write"
remote_read:
- url: "http://: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
付费社群、K8S课程详情扫码咨询>>>出处:http://dwz.date/bUSp
●整理 kubernetes 各种问题汇总
●Docker 遇到的异常和注意点
●Kubernetes 中的 PV 和 PVC 是啥
●运维精华面试题