zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    flink 读取kafka 数据,partition分配
    Flink 报错 "Could not find a suitable table factory for 'org.apache.flink.table.factories.StreamTableSourceFactory' in the classpath"
    flume接收http请求,并将数据写到kafka
    【翻译】Flume 1.8.0 User Guide(用户指南) Processors
    【翻译】Flume 1.8.0 User Guide(用户指南) Channel
    【翻译】Flume 1.8.0 User Guide(用户指南) Sink
    【翻译】Flume 1.8.0 User Guide(用户指南) source
    【翻译】Flume 1.8.0 User Guide(用户指南)
    Apache Flink 简单安装
    Java之使用IDE
  • 原文地址:https://www.cnblogs.com/charlieroro/p/11320474.html
Copyright © 2011-2022 走看看