使用Postgres存储Grafana后端数据

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

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

    创建数据库集群

    我们可以在上定义一个新的数据库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. comment: admin user for grafana database

    创建集群

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

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

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

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

    定义在 与 pg_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集群。

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

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

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

    1. - name: dbuser_grafana
    2. password: DBUser.Grafana
    3. pgbouncer: true
    4. roles: [ dbrole_admin ]

    创建用户

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

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

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

    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 创建数据库

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

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

    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 =

    随后重启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 folder pgcat
    5. init dashboard: pgcat / pgcat-table.json
    6. init dashboard: pgcat / pgcat-bloat.json
    7. init dashboard: pgcat / pgcat-query.json
    8. init folder pgsql
    9. init dashboard: pgsql / pgsql-replication.json
    10. init dashboard: pgsql / pgsql-activity.json
    11. init dashboard: pgsql / pgsql-cluster.json
    12. init dashboard: pgsql / pgsql-node.json
    13. init dashboard: pgsql / pgsql-database.json
    14. init dashboard: pgsql / pgsql-xacts.json
    15. init dashboard: pgsql / pgsql-overview.json
    16. init dashboard: pgsql / pgsql-session.json
    17. init dashboard: pgsql / pgsql-tables.json
    18. init dashboard: pgsql / pgsql-instance.json
    19. init dashboard: pgsql / pgsql-queries.json
    20. init dashboard: pgsql / pgsql-alert.json
    21. init dashboard: pgsql / pgsql-service.json
    22. init dashboard: pgsql / pgsql-persist.json
    23. init dashboard: pgsql / pgsql-proxy.json
    24. init dashboard: pgsql / pgsql-query.json
    25. init folder pglog
    26. init dashboard: pglog / pglog-instance.json
    27. init dashboard: pglog / pglog-analysis.json
    28. 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的监控面板发生变更,可以使用这两个命令升级所有的监控面板。

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

    要注册Postgres数据库,可以使用中的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.yml中与grafana_pgurl参数,将其修改为:

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

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

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