使用 PostgreSQL 當作 Grafana 的資料庫

文章目錄

Grafana, 支援三種資料庫, SQLite, PostgreSQL, MySQL. 如果你甚麼都沒設定, Grafana 預設會使用 SQLite. 量小還好, 但量變大時, 維護起來就麻煩, 而且資料也沒法直接 migration. (是有個非官方的工具在這 https://github.com/wbh1/grafana-sqlite-to-postgres). 如果一開始就要用 PostgreSQL, 有些前置動作要準備好.

目錄設定

一開始的目錄設定如下, 請自行修改成你的環境

  • /opt/grafana/postgresql => 放 PostgreSQL data
  • /opt/grafana/grafana => 放 Grafana data

設定方法

  1. 先把 PostgreSQL 用 docker-compose 跑起來, 並確認資料和連線正常

    1. PostgreSQL 的 docker-compose.yml 如下:

       1postgres:
       2image: postgres:14
       3container_name: postgres
       4networks:
       5  - grafananet
       6expose:
       7  - 5432
       8ports:
       9  - 5432:5432                 # Postgres port
      10volumes:
      11  - /opt/grafana/postgresql/:/var/lib/postgresql
      12  - /opt/grafana/postgresql/data/:/var/lib/postgresql/data
      13environment:
      14  POSTGRES_USER: ********     # define credentials
      15  POSTGRES_PASSWORD: ******** # define credentials
      16  POSTGRES_DB: ********       # define database
      17  TZ: Asia/Singapore       # This is for PostgreSQL's time zone
      18  PGTZ: Asia/Singapore     # This is for PostgreSQL's time zone
      
    2. 執行下列指令啟動 PostgreSQL

      1docker-compose up postgres
      
    3. 檢查 /opt/grafana/postgresql/data 目錄下有檔案, 確定資料不是放在 container 裡面, 免得最後還要想辦法把資料從 docker image 裡面搬出來.

    4. 確認 database 連線正常, 執行以下指令, 應該會看到 3 個資料庫.

      1$ docker exec postgres psql -d postgres -U postgres -h localhost  -c 'select * from pg_database'
      2  oid |  datname  | datdba | encoding | datcollate |  datctype  | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | datminmxid | dattablespace |                          datacl
      3------+-----------+--------+----------+------------+------------+---------------+--------------+--------------+---------------+--------------+------------+---------------+-----------------------------------------------------------
      413757 | postgres  |     10 |        6 | en_US.utf8 | en_US.utf8 | f             | t            |           -1 |         13756 |          727 |          1 |          1663 |
      5    1 | template1 |     10 |        6 | en_US.utf8 | en_US.utf8 | t             | t            |           -1 |         13756 |          727 |          1 |          1663 | {=c/postgres,postgres=CTc/postgres}
      613756 | template0 |     10 |        6 | en_US.utf8 | en_US.utf8 | t             | f            |           -1 |         13756 |          727 |          1 |          1663 | {=c/postgres,postgres=CTc/postgres}
      7(3 rows)
      
  2. 再來建立 Grafana 使用的資料庫和帳號

    1. 執行以下三個指令, 會依序建立 Grafana 資料庫, 建立 grafana 使用著, 然後把 grafana 資料庫權限開給 grafana 使用著.

      1$ docker exec postgres psql -d postgres -U postgres -c "create database grafana"
      2$ docker exec postgres psql -d postgres -U postgres -c "create user grafana with encrypted password '****' "
      3$ docker exec postgres psql -d postgres -U postgres -c "grant all privileges on database grafana to grafana "
      
    2. 若不小心輸錯密碼, 可用下列指令修改

      1docker exec postgres psql -d postgres -U postgres -c "ALTER USER grafana WITH PASSWORD 'new_password'"
      
    3. 再執行一次類似步驟一的指令, 確認 grafana 這個資料庫還有帳號建立出來了

      1$ docker exec postgres psql -d grafana -U grafana -h localhost -W -c 'select * from pg_database'
      2oid |  datname  | datdba | encoding | datcollate |  datctype  | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | datminmxid | dattablespace |                          datacl
      3------+-----------+--------+----------+------------+------------+---------------+--------------+--------------+---------------+--------------+------------+---------------+-----------------------------------------------------------
      413757 | postgres  |     10 |        6 | en_US.utf8 | en_US.utf8 | f             | t            |           -1 |         13756 |          727 |          1 |          1663 |
      5    1 | template1 |     10 |        6 | en_US.utf8 | en_US.utf8 | t             | t            |           -1 |         13756 |          727 |          1 |          1663 | {=c/postgres,postgres=CTc/postgres}
      613756 | template0 |     10 |        6 | en_US.utf8 | en_US.utf8 | t             | f            |           -1 |         13756 |          727 |          1 |          1663 | {=c/postgres,postgres=CTc/postgres}
      716384 | grafana   |     10 |        6 | en_US.utf8 | en_US.utf8 | f             | t            |           -1 |         13756 |          727 |          1 |          1663 | {=Tc/postgres,postgres=CTc/postgres,grafana=CTc/postgres}
      8(4 rows)
      
  3. 啟動 Grafana

    1. 修改 grafana.ini, 加上這段設定, 讓 Grafana 去使用 PostgreSQL (不設定的話, 預設會使用 SQLite)

      1type = postgres
      2host = postgres:5432
      3name = grafana
      4user = grafana
      5password = ******
      6database = grafana
      7ssl_mode = disable
      
    2. 啟動 Grafana, 會看到他在做 data initial, 建了一堆 table

      1$ docker-compose up -d grafana
      
    3. 確認這個檔案不存在, 或者沒有再繼續更新 (如果你之前有先用 SQLite, 他會產生這個檔案)

      1$ ls -l /opt/grafana/grafana/grafana.db
      
    4. 執行以下指令確認 grafana 的 table 都建出來了

       1$ docker exec postgres psql -d grafana -U grafana -h localhost -W -c 'select * from information_schema.tables'
       2Password:
       3 table_catalog |    table_schema    |              table_name               | table_type | self_referencing_column_name | reference_generation | user_defined_type_catalog | user_defined_type_schema | user_defined_type_name | is_insertable_into | is_typed | commit_action
       4---------------+--------------------+---------------------------------------+------------+------------------------------+----------------------+---------------------------+--------------------------+------------------------+--------------------+----------+---------------
       5grafana       | public             | migration_log                         | BASE TABLE |                              |                      |                           |                          |                        | YES                | NO       |
       6grafana       | public             | user                                  | BASE TABLE |                              |                      |                           |                          |                        | YES                | NO       |
       7grafana       | pg_catalog         | pg_type                               | BASE TABLE |                              |                      |                           |                          |                        | YES                | NO       |
       8grafana       | public             | temp_user                             | BASE TABLE |                              |                      |                           |                          |                        | YES                | NO       |
       9...
      10grafana       | public             | file_meta                             | BASE TABLE |                              |                      |                           |                          |                        | YES                | NO       |
      11grafana       | public             | playlist                              | BASE TABLE |                              |                      |                           |                          |                        | YES                | NO       |
      12(244 rows)
      
  4. 到此就可以進去 Grafana 了.

  5. 另外, 既然跑起來 PostgreSQL 了, 也記得補上 PostgreSQL Server Exporter, docker-compose.yml 如下

     1postgres_exporter:
     2  image: prometheuscommunity/postgres-exporter
     3  container_name: postgres_exporter
     4  networks:
     5    - grafananet
     6  ports:
     7    - 9187:9187
     8  expose:
     9    - 9187
    10  environment:
    11    DATA_SOURCE_NAME: "postgresql://postgres:postgres@********:5432/postgres?sslmode=disable"