使用Postgres存储Grafana后端数据

使用 PostgreSQL 而不是 SQLite 作为 Grafana 后端使用的远程存储数据库,获取更好的性能与可用性。

您可以使用 postgres 作为Grafana后端使用的数据库。

这是了解Pigsty部署系统使用方式的好机会,完成此教程,您会了解:

太长不看

  1. vi pigsty.yml # 取消注释DB/User定义:dbuser_grafana grafana
  2. bin/createuser pg-meta dbuser_grafana
  3. bin/createdb pg-meta grafana
  4. psql postgres://dbuser_grafana:DBUser.Grafana@meta:5436/grafana -c \
  5. 'CREATE TABLE t(); DROP TABLE t;' # 检查连接串可用性
  6. vi /etc/grafana/grafana.ini # 修改 [database] type url
  7. systemctl restart grafana-server

创建数据库集群

我们可以在pg-meta上定义一个新的数据库grafana, 也可以在新的机器节点上创建一个专用于Grafana的数据库集群:pg-grafana

定义集群

如果需要创建新的专用数据库集群pg-grafana,部署在10.10.10.1110.10.10.12两台机器上,可以使用以下配置文件:

  1. pg-grafana:
  2. hosts:
  3. 10.10.10.11: {pg_seq: 1, pg_role: primary}
  4. 10.10.10.12: {pg_seq: 2, pg_role: replica}
  5. vars:
  6. pg_cluster: pg-grafana
  7. pg_databases:
  8. - name: grafana
  9. owner: dbuser_grafana
  10. revokeconn: true
  11. comment: grafana primary database
  12. pg_users:
  13. - name: dbuser_grafana
  14. password: DBUser.Grafana
  15. pgbouncer: true
  16. roles: [dbrole_admin]
  17. comment: admin user for grafana database

创建集群

使用以下命令完成数据库集群pg-grafana的创建:pgsql.yml

  1. bin/createpg pg-grafana # 初始化pg-grafana集群

该命令实际上调用了Ansible Playbook pgsql.yml 创建数据库集群。

  1. ./pgsql.yml -l pg-grafana # 实际执行的等效Ansible剧本命令

定义在 pg_userspg_databases 中的业务用户与业务数据库会在集群初始化时自动创建,因此使用该配置时,集群创建完毕后,(在没有DNS支持的情况下)您可以使用以下连接串访问数据库(任一即可):

  1. postgres://dbuser_grafana:DBUser.Grafana@10.10.10.11:5432/grafana # 主库直连
  2. postgres://dbuser_grafana:DBUser.Grafana@10.10.10.11:5436/grafana # 直连default服务
  3. postgres://dbuser_grafana:DBUser.Grafana@10.10.10.11:5433/grafana # 连接串读写服务
  4. postgres://dbuser_grafana:DBUser.Grafana@10.10.10.12:5432/grafana # 主库直连
  5. postgres://dbuser_grafana:DBUser.Grafana@10.10.10.12:5436/grafana # 直连default服务
  6. postgres://dbuser_grafana:DBUser.Grafana@10.10.10.12:5433/grafana # 连接串读写服务

因为默认情况下Pigsty安装在单个元节点上,接下来的步骤我们会在已有的pg-meta数据库集群上创建Grafana所需的用户与数据库,而并非使用这里创建的pg-grafana集群。

创建Grafana业务用户

通常业务对象管理的惯例是:先创建用户,再创建数据库。 因为如果为数据库配置了owner,数据库对相应的用户存在依赖。

定义用户

要在pg-meta集群上创建用户dbuser_grafana,首先将以下用户定义添加至pg-meta集群定义中:

添加位置:all.children.pg-meta.vars.pg_users

  1. - name: dbuser_grafana
  2. password: DBUser.Grafana
  3. comment: admin user for grafana database
  4. pgbouncer: true
  5. roles: [ dbrole_admin ]

如果您在这里定义了不同的密码,请在后续步骤中将相应参数替换为新密码

创建用户

使用以下命令完成dbuser_grafana用户的创建(任一均可)。

  1. bin/createuser pg-meta dbuser_grafana # 在pg-meta集群上创建`dbuser_grafana`用户

实际上调用了Ansible Playbook pgsql-createuser.yml 创建用户

  1. ./pgsql-createuser.yml -l pg-meta -e pg_user=dbuser_grafana # Ansible

dbrole_admin 角色具有在数据库中执行DDL变更的权限,这正是Grafana所需要的。

创建Grafana业务数据库

定义数据库

创建业务数据库的方式与业务用户一致,首先在pg-meta的集群定义中添加新数据库grafana定义

添加位置:all.children.pg-meta.vars.pg_databases

  1. - { name: grafana, owner: dbuser_grafana, revokeconn: true }

创建数据库

使用以下命令完成grafana数据库的创建(任一均可)。

  1. bin/createdb pg-meta grafana # 在`pg-meta`集群上创建`grafana`数据库

实际上调用了Ansible Playbook pgsql-createdb.yml 创建数据库

  1. ./pgsql-createdb.yml -l pg-meta -e pg_database=grafana # 实际执行的Ansible剧本

使用Grafana业务数据库

检查连接串可达性

您可以使用不同的服务接入方式访问数据库,例如:

  1. postgres://dbuser_grafana:DBUser.Grafana@meta:5432/grafana # 直连
  2. postgres://dbuser_grafana:DBUser.Grafana@meta:5436/grafana # default服务
  3. postgres://dbuser_grafana:DBUser.Grafana@meta:5433/grafana # primary服务

这里,我们将使用通过负载均衡器直接访问主库的default服务访问数据库。

首先检查连接串是否可达,以及是否有权限执行DDL命令。

  1. psql postgres://dbuser_grafana:DBUser.Grafana@meta:5436/grafana -c \
  2. 'CREATE TABLE t(); DROP TABLE t;'

直接修改Grafana配置

为了让Grafana使用 Postgres 数据源,您需要编辑 /etc/grafana/grafana.ini,并修改配置项:

  1. [database]
  2. ;type = sqlite3
  3. ;host = 127.0.0.1:3306
  4. ;name = grafana
  5. ;user = root
  6. # If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
  7. ;password =
  8. ;url =

将默认的配置项修改为:

  1. [database]
  2. type = postgres
  3. url = postgres://dbuser_grafana:DBUser.Grafana@meta/grafana

随后重启Grafana即可:

  1. systemctl restart grafana-server

从监控系统中看到新增的 grafana 数据库已经开始有活动,则说明Grafana已经开始使用Postgres作为首要后端数据库了。但一个新的问题是,Grafana中原有的Dashboards与Datasources都消失了!这里需要重新导入监控面板Postgres数据源

管理Grafana监控面板

您可以使用管理用户前往 Pigsty 目录下的files/ui目录,执行grafana.py init重新加载Pigsty监控面板。

  1. cd ~/pigsty/files/ui
  2. ./grafana.py init # 使用当前目录下的Dashboards初始化Grafana监控面板

执行结果:

  1. vagrant@meta:~/pigsty/files/ui
  2. $ ./grafana.py init
  3. Grafana API: admin:pigsty @ http://10.10.10.10:3000
  4. init dashboard : home.json
  5. init folder pgcat
  6. init dashboard: pgcat / pgcat-table.json
  7. init dashboard: pgcat / pgcat-bloat.json
  8. init dashboard: pgcat / pgcat-query.json
  9. init folder pgsql
  10. init dashboard: pgsql / pgsql-replication.json
  11. init dashboard: pgsql / pgsql-table.json
  12. init dashboard: pgsql / pgsql-activity.json
  13. init dashboard: pgsql / pgsql-cluster.json
  14. init dashboard: pgsql / pgsql-node.json
  15. init dashboard: pgsql / pgsql-database.json
  16. init dashboard: pgsql / pgsql-xacts.json
  17. init dashboard: pgsql / pgsql-overview.json
  18. init dashboard: pgsql / pgsql-session.json
  19. init dashboard: pgsql / pgsql-tables.json
  20. init dashboard: pgsql / pgsql-instance.json
  21. init dashboard: pgsql / pgsql-queries.json
  22. init dashboard: pgsql / pgsql-alert.json
  23. init dashboard: pgsql / pgsql-service.json
  24. init dashboard: pgsql / pgsql-persist.json
  25. init dashboard: pgsql / pgsql-proxy.json
  26. init dashboard: pgsql / pgsql-query.json
  27. init folder pglog
  28. init dashboard: pglog / pglog-instance.json
  29. init dashboard: pglog / pglog-analysis.json
  30. init dashboard: pglog / pglog-session.json

该脚本会侦测当前的环境(安装时定义于~/pigsty),获取Grafana的访问信息,并将监控面板中的URL连接占位符域名(*.pigsty)替换为真实使用的域名。

  1. export GRAFANA_ENDPOINT=http://10.10.10.10:3000
  2. export GRAFANA_USERNAME=admin
  3. export GRAFANA_PASSWORD=pigsty
  4. export NGINX_UPSTREAM_YUMREPO=yum.pigsty
  5. export NGINX_UPSTREAM_CONSUL=c.pigsty
  6. export NGINX_UPSTREAM_PROMETHEUS=p.pigsty
  7. export NGINX_UPSTREAM_ALERTMANAGER=a.pigsty
  8. export NGINX_UPSTREAM_GRAFANA=g.pigsty
  9. export NGINX_UPSTREAM_HAPROXY=h.pigsty

题外话,使用grafana.py clean会清空目标监控面板,使用grafana.py load会加载当前目录下所有监控面板,当Pigsty的监控面板发生变更,可以使用这两个命令升级所有的监控面板。

管理Postgres数据源

当使用 pgsql.yml 创建新PostgreSQL集群,或使用pgsql-createdb.yml创建新业务数据库时,Pigsty会在Grafana中注册新的PostgreSQL数据源,您可以使用默认的监控用户通过Grafana直接访问目标数据库实例。应用pgcat的绝大部分功能有赖于此。

要注册Postgres数据库,可以使用pgsql.yml中的register_grafana任务:

  1. ./pgsql.yml -t register_grafana # 重新注册当前环境中所有Postgres数据源
  2. ./pgsql.yml -t register_grafana -l pg-test # 重新注册 pg-test 集群中所有的数据库

一步到位更新Grafana

您可以直接通过修改Pigsty配置文件,更改Grafana使用的后端数据源,一步到位的完成切换Grafana后端数据库的工作。编辑pigsty.ymlgrafana_databasegrafana_pgurl参数,将其修改为:

  1. grafana_database: postgres
  2. grafana_pgurl: postgres://dbuser_grafana:DBUser.Grafana@meta:5436/grafana

然后重新执行 infral.yml中的grafana任务,即可完成Grafana升级

  1. ./infra.yml -t grafana

最后修改 2022-06-03: add scaffold for en docs (6a6eded)