• prometheus使用postgresql-adapter连接postgresql


    概述

    Prometheus使用postgresql需要使用postgresql-adapter进行数据转换。在安装postgresql-adapter之前需要安装2个扩展:pg_prometheustimescaledb

    官方推荐使用PostgreSQL, pg_prometheus,和TimescaleDB打包在一起的容器,但对于使用已有的postgresql来说并不合适,故需要手动编译安装。


    环境准备

    使用os为:redhat 7.4

    假设已经安装好postgresql,本次使用的postgresql版本为11.1,安装路径为:/usr/pgsql-11/bin/。安装过程中如果遇到psql: command not foundNo package pg_config available时执行如下命令即可:

    # export PATH=$PATH:/usr/pgsql-11/bin/
    

    安装cmake

    编译pg_prometheustimescaledb都会使用到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.xzclang-tools-extra-7.1.0.src.tar.xzcompiler-rt-7.1.0.src.tar.xzllvm-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.sotimescaledb.so

  • 相关阅读:
    jackson 解析json含有不规则的属性的json字符串的方法
    swift入门-实现简单的登录界面
    github git.exe位置
    linux之SQL语句简明教程---IN
    怎么样才算是精通 C++?
    BZOJ2028: [SHOI2009]会场预约(set)
    BZOJ1058: [ZJOI2007]报表统计(set)
    洛谷P2391 白雪皑皑(并查集)
    BZOJ4514: [Sdoi2016]数字配对(费用流)
    BZOJ3143: [Hnoi2013]游走(期望DP 高斯消元)
  • 原文地址:https://www.cnblogs.com/charlieroro/p/11320474.html
Copyright © 2020-2023  润新知