使用 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
設定方法
-
先把 PostgreSQL 用 docker-compose 跑起來, 並確認資料和連線正常
-
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
-
執行下列指令啟動 PostgreSQL
1docker-compose up postgres
-
檢查 /opt/grafana/postgresql/data 目錄下有檔案, 確定資料不是放在 container 裡面, 免得最後還要想辦法把資料從 docker image 裡面搬出來.
-
確認 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)
-
-
再來建立 Grafana 使用的資料庫和帳號
-
執行以下三個指令, 會依序建立 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 "
-
若不小心輸錯密碼, 可用下列指令修改
1docker exec postgres psql -d postgres -U postgres -c "ALTER USER grafana WITH PASSWORD 'new_password'"
-
再執行一次類似步驟一的指令, 確認 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)
-
-
啟動 Grafana
-
修改 grafana.ini, 加上這段設定, 讓 Grafana 去使用 PostgreSQL (不設定的話, 預設會使用 SQLite)
1type = postgres 2host = postgres:5432 3name = grafana 4user = grafana 5password = ****** 6database = grafana 7ssl_mode = disable
-
啟動 Grafana, 會看到他在做 data initial, 建了一堆 table
1$ docker-compose up -d grafana
-
確認這個檔案不存在, 或者沒有再繼續更新 (如果你之前有先用 SQLite, 他會產生這個檔案)
1$ ls -l /opt/grafana/grafana/grafana.db
-
執行以下指令確認 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)
-
-
到此就可以進去 Grafana 了.
-
另外, 既然跑起來 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"