概述

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

prometheus使用postgresql-adapter连接postgresql的更多相关文章

  1. kali linux 系列教程之metasploit 连接postgresql可能遇见的问题

    kali linux 系列教程之metasploit 连接postgresql可能遇见的问题 文/玄魂   目录 kali linux 下metasploit 连接postgresql可能遇见的问题. ...

  2. ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库

    前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET——“Jws.Mono”.由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间 ...

  3. 视频教程--ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库

    说好的给园子里的朋友们录制与<ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库> 这篇博客相对应的视频,由于一个月一来没有时 ...

  4. ArcGIS平台中PostgreSQL数据连接配置总结

    通常用户在使用要素服务时,要求数据必须是存放在空间数据库中的.同时,需要将数据库注册到ArcGIS for Server,这样在发布服务时就不需要进行数据拷贝,从而可以节省磁盘空间及服务发布时间.以下 ...

  5. Entity Freamwork 6连接PostgreSql数据库

    原文 Entity Freamwork 6连接PostgreSql数据库 开发环境 VS 2015  Update 1   Postgre Sql 9.4 使用过程 1.使用Nuget在项目中添加对E ...

  6. php连接postgresql

    在ubuntu下用php连接postgresql需要下个模块php5-pgsql 连接数据库并显示一张表的内容: <?php #连接数据库 $conn = pg_connect("ho ...

  7. python连接postgresql数据库

    python可以通过第三方模块连接postgresql. 比较有名的有psycopg2  和python3-postgresql (一)psycopg2 ubuntu下安装 sudo apt-get ...

  8. SSIS 连接 PostgreSQL

    因为工作需要,得把psql的表放到SQL Server, 找到一个PGNP(http://www.pgoledb.com/)  的适配器,不过一看要300$就没有去尝试了. 官方倒是有ODBC的驱动. ...

  9. ArcGIS SDE 10.1 for Postgresql 服务连接配置

    去年写了ArcGIS 10.1 如何连接Postgresql 数据库(http://blog.csdn.net/arcgis_all/article/details/8202709)当时采用的也是Ar ...

随机推荐

  1. 如何在相同的类名中单独为选中元素设置JS

    很多时候,我发现对一个类名添加事件,每次都是所有同类名元素一起触发,使用 this可以仅对当前选中的元素应用事件 如 $('.guowai button').click(function() { /* ...

  2. Fiddler模拟响应

    1 启用规则 2 不匹配的规则通过,不勾选会导致不匹配的请求失败 3 匹配url 4 响应信息,Fiddler内置了一些响应脚步,你也可以选择一个保护响应信息的文本文件

  3. SAP常见查询组合

    做SAP开发的,SELECT是必不可少的.新语法出了不少'新鲜'的语法,用法也是五花八门. 新语法有新语法的好处,老语法有老语法的优势. 新语法里把很多的逻辑处理,分组,排重,内表处理全都放到一些关键 ...

  4. 七月伊始 LeetCode算法总结

    七月伊始 早上买了LeetCode的课程,解锁了付费题目,付费倒逼学习: 意识到这么久学习的东西,都是写在自己的笔记, 如今希望自己能够用自己拙笔记录这个学习和总结的过程. 队列的学习 设计循环队列 ...

  5. word2vector(含code)

    Word2Vec其实就是通过学习文本来用词向量的方式表征词的语义信息,即通过一个嵌入空间使得语义上相似的单词在该空间内距离很近. Embedding其实就是一个映射,将单词从原先所属的空间映射到新的多 ...

  6. 十六、python面向对象基础篇

    面向对象基础: 在了解面向对象之前,先了解下变成范式: 编程范式是一类典型的编程风格,是一种方法学 编程范式决定了程序员对程序执行的看法 oop中,程序是一系列对象的相互作用 python支持多种编程 ...

  7. 孪生网络(Siamese Network)在句子语义相似度计算中的应用

    1,概述 在NLP中孪生网络基本是用来计算句子间的语义相似度的.其结构如下 在计算句子语义相似度的时候,都是以句子对的形式输入到网络中,孪生网络就是定义两个网络结构分别来表征句子对中的句子,然后通过曼 ...

  8. nginx上传大文件,413错误解决

    在nginx里增加了配置. client_max_body_size 500m; proxy_connect_timeout 600; proxy_read_timeout 600; proxy_se ...

  9. xcode运行demo报错:Failed to create provisioning profile.cannot be registered to your development team

    问题:网上下载运行demo,出现Failed to create provisioning profile.cannot be registered to your development team此 ...

  10. apache在linux下安装

    yum安装 主流Linux系统版本基本上都集成了apache服务器httpd,我们可以通过如下命令来查看我们的操作系统上是否已经安装了apache服务器httpd rpm -qa | grep htt ...