Grafanaのバックアップ・リストアを行う【Grafana運用管理】

今回はGrafanaのバックアップとリストア方法についてご紹介します。

なお、【Grafana運用管理】シリーズと題して他にも記事を投稿していきますので、併せてご確認ください。

目的

Grafanaではバックアップ・リストアの専用コマンドが用意されていないため、自前でバックアップ・リストアの計画を行い、実装していく必要があります。
今回は、(なるべく)OSの機能だけでバックアップ・リストアをする手順を紹介します。
実際の運用ではシンプルにcronで動かすことも良いですが、既にジョブ管理システムが導入されている場合はそれで定期実行することや、バックアップ・リストア製品を導入されている場合はその製品で行うことも可能です。

環境

今回の検証環境サーバーは以下の通りです。

用途 ホスト名 IPアドレス
Grafanaサーバー vm-grafana1 172.24.1.5/24
DBサーバー vm-grafanadb 172.24.1.7/24

上記サーバーのOS/SWは以下の通りです。

OS/SW バージョン
OS Ubuntu 22.04 LTS
Grafana grafana-enterprise 9.5.13
PostgreSQL 14.9

また、Grafanaが利用するDBの接続情報は下記の通りです。
既にvm-grafanadbにPostgreSQLが導入されており、vm-grafana1のGrafanaではvm-grafanadbへの接続設定がされている前提とします。

DB ポート番号 接続ユーザー Grafanaが利用するDB
PostgreSQL 5432 grafana_psuser grafana_psdb

バックアップ・リストア概要

バックアップ対象

Grafanaでバックアップすべき対象は大きく「設定ファイル」「Grafana生成ファイル」「Grafanaデータベース」の3つあります。
それぞれGrafanaの導入の仕方で格納ディレクトリが異なるので、ここではバイナリ展開で導入した場合とAPTで導入した場合の2つをご紹介します。

・バイナリ展開で導入した場合

バックアップ対象 具体的なパス 最低限必須なファイル・ディレクトリ
設定ファイル $WORKING_DIR/conf/ defaults.ini、custom.ini
Grafana生成ファイル $WORKING_DIR/data/ $WORKING_DIR/data/plugins/
Grafanaデータベース 対象のDBダンプ or SQLiteのファイル 左記同様

・APTで導入した場合

バックアップ対象 具体的なパス 最低限必須なファイル・ディレクトリ
設定ファイル /etc/grafana/ grafana.ini
Grafana生成ファイル /var/lib/grafana/ /var/lib/grafana/plugins/
Grafana生成ファイル(ログ) /var/log/grafana/
Grafanaデータベース 対象のDBダンプ or SQLiteのファイル 左記同様

それぞれ「最低限必須なファイル・ディレクトリ」と記載していますが、これは少なくともこれらをバックアップしておけば、正常にリストアできることを示しています。
後述する通り、それぞれのディレクトリにはリストアに不要なファイル・ディレクトリが含まれています。
しかし、これらは将来のバージョンで変わる可能性がある上、運用次第では他のファイル/ディレクトリのバックアップが必要になる場合がありますので、バックアップ領域の問題が無い限りは上記の「具体的なパスのディレクトリごと」バックアップすることを推奨します。

全体の流れ

下記の流れでバックアップ・リストアを実施していきます。

  1. 変更点1(リストアした際の検証のため)
  2. バックアップ
  3. 変更点2
  4. リストア
  5. 変更点1に戻っていることの検証

今回のユースケースとして、ユーザーから「ある一時点の過去に戻したい」との要望があったとして、バックアップから「変更点1」の状態にリストアしていくことにします。
変更点としては、大きく下記の3つを変更して検証していきます。

  • grafana.iniのポート番号変更
  • ダッシュボード作成/ユーザー作成
  • プラグイン導入

Grafanaのバックアップ頻度について

ここで簡単にバックアップ頻度についてお話します。(今回の検証手順とは直接関係しないので、手順だけ知りたい方は読み飛ばして頂いて良いです。)

Grafanaのバックアップについて、一般的なバックアップ・リストアと同様に「どの程度の頻度で変更がされるか」や「ユーザーがある時点に戻したいという要望があるか」を考慮して設計していく必要があります。
障害発生時になるべく最新の状態に戻せること(目標復旧時点:RPO)を考慮することはそうですが、Grafana自体は通常のシステムより変更データが溜まらない性質のため、
「ユーザーがダッシュボードに変更を加えたが、それが誤りなため、ある時点の過去に戻したい」という要望があるかもしれません。
それらを加味して設計・構築する必要があります。

例えばですが、

  • grafana.iniは毎日変わるようなことはないでしょうが、システム要件の変更時には変わる可能性があります。
  • ダッシュボードは毎日/毎時変わる可能性があります。
  • ユーザーについても運用によっては毎日変わる可能性はありますが、ダッシュボードより頻度は低いでしょう。
  • プラグインについてはgrafana.iniより多く、ダッシュボードより低いような頻度で変わりそうです。

などと考えることができます。

ただ、いずれも「要件次第」であることにご留意ください。
例えば、ダッシュボードは日々変わりそうに思えるかもしれませんが、
極端な話、システム構築時に作成したら、あとは「システム変更要望」を上げないと作成/変更できないような運用であれば、
「適切な変更管理」がされていれば日々簡単には変わらず、その「変更要望」をリリースする際にバックアップするだけで良い、とも考えられます。

またユーザーがいつでも自由に作成/変更して良い場合であっても、月次・週次・日次・毎時など要件によってバックアップ頻度は変わります。
これは前述のユーザーによる「ある時点の過去に戻したい」という要望がどの程度の頻度・どこまで遡りたいかによって、バックアップ頻度を決めていきます。
例えば、「数時間前に戻したい」という要望がある場合は毎時バックアップを検討する必要がありますが、これがダッシュボードだけであれば、そもそもGrafanaに変更履歴を保存する機能があるので、バックアップの頻度は日次や週次でも良いかもしれません。

そうではなく、頻繁にプラグインを導入・削除をしたり、数時間の間に複数のダッシュボードの変更を行い、もはやユーザーでは管理できないといった場合には、毎時のバックアップも検討する必要があります。

ただ、バックアップ領域がそこまで確保できない場合や、そのようなユーザー要望によるリストア作業にコストを掛けられない/運用が複雑になる場合は、ユーザーには最大でも1日や1週間前までしか戻せないことや、そもそもシステム障害時以外のリストア対応は行えないことを許容してもらう必要があります。

まとめると、月並みな表現になりますが、Grafanaのバックアップについても、一般的なシステム構築と同じく、ユーザー要件と掛けられるコストや最適な運用とは何か、を考えながら決めていく必要があります。

バックアップ・リストアの検証

前置きが長くなりましたが、実際にバックアップ・リストアを検証していきましょう。

バックアップディレクトリの作成

事前にバックアップ用ディレクトリとして、/backupディレクトリを作成します。
これはvm-grafana1vm-grafanadbの両方で実行します。

# バックアップディレクトリの作成、権限変更
sudo mkdir /backup;sudo chmod 777 /backup;sudo chown azureuser:azureuser /backup
# 作成したディレクトリの確認
ls -la /backup

実行結果

azureuser@vm-grafanadb:~$ sudo mkdir /backup;sudo chmod 777 /backup;sudo chown azureuser:azureuser /backup
azureuser@vm-grafanadb:~$ 
azureuser@vm-grafanadb:~$ ls -la /backup
total 8
drwxrwxrwx  2 azureuser azureuser 4096 Nov  8 18:36 .
drwxr-xr-x 20 root      root      4096 Nov  8 18:36 ..
azureuser@vm-grafanadb:~$ 

変更点1の作成

下記の変更点を作成していきます。

  • grafana.iniのポート番号を3000番に変更(作業なし)
  • ダッシュボード作成/ユーザー作成
  • Infinityプラグイン、Apache EChartプラグインの導入

この作業は全てvm-grafana1およびGrafana画面で作業していきます。

grafana.iniのポート番号を3000番に変更

こちらはデフォルトで3000番ポートのため、ここでの作業はありません。

ダッシュボード作成/ユーザー作成

Grafanaの画面でダッシュボードの作成、ユーザー作成を行っていきます。

・ダッシュボードの作成

・ユーザーの作成

Infinityプラグイン、Apache EChartプラグインの導入

Grafanaの画面で2つのプラグイン導入を行っていきます。

・プラグイン導入

・導入されたことの確認

バックアップ

それでは各種バックアップを取得していきます。

設定ファイルのバックアップ

grafana.iniを含んだディレクトリをバックアップするため、下記コマンドをvm-grafana1で実行していきます。

# バックアップ対象の確認
ls -la /etc/grafana
# バックアップ実施
sudo tar zcvf /backup/01_grafana_conf.tar.gz -C / ./etc/grafana
# バックアップ結果の確認
ls -la /backup

実行結果

azureuser@vm-grafana1:~$ ls -la /etc/grafana
total 160
drwxr-xr-x   3 root root     4096 Nov  1 18:23 .
drwxr-xr-x 104 root root     4096 Nov  1 17:37 ..
-rw-r-----   1 root grafana 70549 Nov  1 18:23 grafana.ini
-rw-r-----   1 root grafana 70526 Nov  1 16:52 grafana.ini.bak
-rw-r-----   1 root grafana  2986 Nov  1 16:52 ldap.toml
drwxr-xr-x   8 root grafana  4096 Nov  1 16:52 provisioning
azureuser@vm-grafana1:~$ 
azureuser@vm-grafana1:~$ sudo tar zcvf /backup/01_grafana_conf.tar.gz -C / ./etc/grafana
./etc/grafana/
./etc/grafana/grafana.ini
./etc/grafana/grafana.ini.bak
./etc/grafana/provisioning/
./etc/grafana/provisioning/alerting/
./etc/grafana/provisioning/alerting/sample.yaml
./etc/grafana/provisioning/notifiers/
./etc/grafana/provisioning/notifiers/sample.yaml
./etc/grafana/provisioning/dashboards/
./etc/grafana/provisioning/dashboards/sample.yaml
./etc/grafana/provisioning/plugins/
./etc/grafana/provisioning/plugins/sample.yaml
./etc/grafana/provisioning/datasources/
./etc/grafana/provisioning/datasources/sample.yaml
./etc/grafana/provisioning/access-control/
./etc/grafana/provisioning/access-control/sample.yaml
./etc/grafana/ldap.toml
azureuser@vm-grafana1:~$ 
azureuser@vm-grafana1:~$ ls -la /backup
total 56
drwxrwxrwx  2 azureuser azureuser  4096 Nov  9 17:57 .
drwxr-xr-x 20 root      root       4096 Nov  9 12:41 ..
-rw-r--r--  1 root      root      47260 Nov  9 17:57 01_grafana_conf.tar.gz
azureuser@vm-grafana1:~$ 

Grafana生成ファイルのバックアップ

/var/lib/grafana/plugins/を含んだディレクトリをバックアップするため、下記コマンドをvm-grafana1で実行していきます。

# バックアップ対象の確認
ls -la /var/lib/grafana
# バックアップ実施
sudo tar zcvf /backup/01_grafana_data.tar.gz -C / ./var/lib/grafana
# バックアップ結果の確認
ls -la /backup

実行結果

azureuser@vm-grafana1:~$ ls -la /var/lib/grafana
total 1140
drwxr-xr-x  6 grafana grafana    4096 Nov  8 19:25 .
drwxr-xr-x 42 root    root       4096 Nov  1 17:36 ..
drwxr-x---  3 grafana grafana    4096 Nov  1 16:59 alerting
drwx------  2 grafana grafana    4096 Nov  1 16:59 csv
-rw-r-----  1 grafana grafana 1138688 Nov  1 18:23 grafana.db
drwxr-x---  4 grafana grafana    4096 Nov  8 19:26 plugins
drwx------  2 grafana grafana    4096 Nov  1 16:59 png
azureuser@vm-grafana1:~$ 
azureuser@vm-grafana1:~$ sudo tar zcvf /backup/01_grafana_data.tar.gz -C / ./var/lib/grafana
./var/lib/grafana/
./var/lib/grafana/alerting/
./var/lib/grafana/alerting/1/
./var/lib/grafana/alerting/1/__default__.tmpl
./var/lib/grafana/csv/
./var/lib/grafana/grafana.db
./var/lib/grafana/png/
./var/lib/grafana/plugins/
./var/lib/grafana/plugins/volkovlabs-echarts-panel/
./var/lib/grafana/plugins/volkovlabs-echarts-panel/CHANGELOG.md
./var/lib/grafana/plugins/volkovlabs-echarts-panel/LICENSE
./var/lib/grafana/plugins/volkovlabs-echarts-panel/img/
./var/lib/grafana/plugins/volkovlabs-echarts-panel/img/dashboard.png
./var/lib/grafana/plugins/volkovlabs-echarts-panel/img/examples.png
./var/lib/grafana/plugins/volkovlabs-echarts-panel/img/logo.svg
./var/lib/grafana/plugins/volkovlabs-echarts-panel/plugin.json
./var/lib/grafana/plugins/volkovlabs-echarts-panel/module.js.LICENSE.txt
./var/lib/grafana/plugins/volkovlabs-echarts-panel/module.js
./var/lib/grafana/plugins/volkovlabs-echarts-panel/module.js.map
./var/lib/grafana/plugins/volkovlabs-echarts-panel/maps/
./var/lib/grafana/plugins/volkovlabs-echarts-panel/maps/world.json
./var/lib/grafana/plugins/volkovlabs-echarts-panel/maps/USA.json
./var/lib/grafana/plugins/volkovlabs-echarts-panel/MANIFEST.txt
./var/lib/grafana/plugins/volkovlabs-echarts-panel/README.md
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/go_plugin_build_manifest
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/gpx_infinity_linux_amd64
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/CHANGELOG.md
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/LICENSE
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/gpx_infinity_linux_arm
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/img/
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/img/aws.jpg
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/img/slide-features.png
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/img/slide-rest-api.png
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/img/slide-variables.png
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/img/oauth-2-sm.png
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/img/homepage-bg.svg
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/img/slide-series.png
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/img/icon.svg
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/gpx_infinity_darwin_amd64
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/plugin.json
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/module.js.LICENSE.txt
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/gpx_infinity_windows_amd64.exe
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/gpx_infinity_darwin_arm64
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/module.js
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/gpx_infinity_linux_arm64
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/module.js.map
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/MANIFEST.txt
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/README.md
azureuser@vm-grafana1:~$ 
azureuser@vm-grafana1:~$ ls -la /backup
total 71092
drwxrwxrwx  2 azureuser azureuser     4096 Nov  9 17:58 .
drwxr-xr-x 20 root      root          4096 Nov  9 12:41 ..
-rw-r--r--  1 root      root         47260 Nov  9 17:57 01_grafana_conf.tar.gz
-rw-r--r--  1 root      root      72738266 Nov  9 17:58 01_grafana_data.tar.gz
azureuser@vm-grafana1:~$ 

Grafana生成ファイル(ログ)のバックアップ

grafana.logを含んだディレクトリをバックアップするため、下記コマンドをvm-grafana1で実行していきます。
なお、こちらはバックアップの取得は行いますが今回のリストア対象にはしないこととします。
なぜなら、ユーザーから「ある一時点の過去に戻したい」との要望があったためリストアするというケースを想定したリストア作業のため、ログまでリストアする必要がないからです。

# バックアップ対象の確認
ls -la /var/log/grafana
# バックアップ実施
sudo tar zcvf /backup/01_grafana_log.tar.gz -C / ./var/log/grafana
# バックアップ結果の確認
ls -la /backup

実行結果

azureuser@vm-grafana1:~$ ls -la /var/log/grafana
total 228
drwxr-xr-x  2 grafana grafana   4096 Nov  1 16:58 .
drwxrwxr-x 13 root    syslog    4096 Nov  9 12:41 ..
-rw-r-----  1 grafana grafana 221979 Nov  9 17:52 grafana.log
azureuser@vm-grafana1:~$ 
azureuser@vm-grafana1:~$ sudo tar zcvf /backup/01_grafana_log.tar.gz -C / ./var/log/grafana
./var/log/grafana/
./var/log/grafana/grafana.log
azureuser@vm-grafana1:~$ 
azureuser@vm-grafana1:~$ ls -la /backup
total 71124
drwxrwxrwx  2 azureuser azureuser     4096 Nov  9 17:59 .
drwxr-xr-x 20 root      root          4096 Nov  9 12:41 ..
-rw-r--r--  1 root      root         47260 Nov  9 17:57 01_grafana_conf.tar.gz
-rw-r--r--  1 root      root      72738266 Nov  9 17:58 01_grafana_data.tar.gz
-rw-r--r--  1 root      root         31857 Nov  9 17:59 01_grafana_log.tar.gz
azureuser@vm-grafana1:~$ 

Grafanaデータベースのバックアップ

PostgreSQLのGrafanaデータベースをバックアップするため、下記コマンドをvm-grafanadbで実行していきます。

# バックアップ実施
pg_dump -h localhost -p 5432 -U grafana_psuser grafana_psdb -Fc -f /backup/01_grafana_psdb.dump
# バックアップ結果の確認
ls -la /backup

実行結果

azureuser@vm-grafanadb:/backup$ pg_dump -h localhost -p 5432 -U grafana_psuser grafana_psdb -Fc -f /backup/01_grafana_psdb.dump
Password: 
azureuser@vm-grafanadb:/backup$ 
azureuser@vm-grafanadb:/backup$ ls -la /backup
total 244
drwxrwxrwx  2 azureuser azureuser   4096 Nov  9 18:18 .
drwxr-xr-x 20 root      root        4096 Nov  9 12:41 ..
-rw-rw-r--  1 azureuser azureuser 240172 Nov  9 18:18 01_grafana_psdb.dump
azureuser@vm-grafanadb:/backup$ 

変更点2の作成

下記の変更点を作成していきます。

  • grafana.iniのポート番号を4000番に変更
  • ダッシュボード作成/ユーザー作成
  • Infinityプラグイン、Apache EChartプラグインの導入

この作業は全てvm-grafana1およびGrafana画面で作業していきます。

grafana.iniのポート番号変更

・grafana.iniのポート番号を4000番に変更
/etc/grafana/grafana.iniのポート番号を4000番に変更します。

変更内容

http_port = 4000

・Grafanaの再起動
/etc/grafana/grafana.iniの変更を反映するため、Grafanaを再起動します。

# Grafanaのサービス再起動
sudo systemctl restart grafana-server
# Grafanaのサービス状態確認
sudo systemctl status grafana-server

実行結果

azureuser@vm-grafana1:~$ sudo systemctl restart grafana-server
azureuser@vm-grafana1:~$ 
azureuser@vm-grafana1:~$ sudo systemctl status grafana-server
● grafana-server.service - Grafana instance
     Loaded: loaded (/lib/systemd/system/grafana-server.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2023-11-09 18:47:06 JST; 5s ago
       Docs: http://docs.grafana.org
   Main PID: 1065 (grafana)
      Tasks: 10 (limit: 2263)
     Memory: 79.1M
        CPU: 3.074s
     CGroup: /system.slice/grafana-server.service
             ├─1065 /usr/share/grafana/bin/grafana server --config=/etc/grafana/grafana.ini --pidfile=/run/grafana/grafana-server.pid --packaging=deb cfg:default.paths.logs=/var/log/grafana cfg:default.paths.d>
             └─1070 /var/lib/grafana/plugins/yesoreyeram-infinity-datasource/gpx_infinity_linux_amd64

Nov 09 18:47:09 vm-grafana1 grafana[1065]: logger=modules t=2023-11-09T18:47:09.54391574+09:00 level=warn msg="No modules registered..."
Nov 09 18:47:09 vm-grafana1 grafana[1065]: logger=http.server t=2023-11-09T18:47:09.546095588+09:00 level=info msg="HTTP Server Listen" address=[::]:4000 protocol=http subUrl= socket=
Nov 09 18:47:09 vm-grafana1 grafana[1065]: logger=ngalert.state.manager t=2023-11-09T18:47:09.546311192+09:00 level=info msg="Warming state cache for startup"
Nov 09 18:47:09 vm-grafana1 grafana[1065]: logger=grafanaStorageLogger t=2023-11-09T18:47:09.548068031+09:00 level=info msg="storage starting"
Nov 09 18:47:09 vm-grafana1 grafana[1065]: logger=report t=2023-11-09T18:47:09.54848154+09:00 level=warn msg="Scheduling and sending of reports disabled, SMTP is not configured and enabled. Configure SMTP to e>
Nov 09 18:47:09 vm-grafana1 grafana[1065]: logger=ngalert.state.manager t=2023-11-09T18:47:09.549567563+09:00 level=info msg="State cache has been initialized" states=0 duration=3.255971ms
Nov 09 18:47:09 vm-grafana1 grafana[1065]: logger=ticker t=2023-11-09T18:47:09.54989647+09:00 level=info msg=starting first_tick=2023-11-09T18:47:10+09:00
Nov 09 18:47:09 vm-grafana1 grafana[1065]: logger=ngalert.multiorg.alertmanager t=2023-11-09T18:47:09.550069574+09:00 level=info msg="starting MultiOrg Alertmanager"
Nov 09 18:47:09 vm-grafana1 grafana[1065]: logger=grafana.update.checker t=2023-11-09T18:47:09.567165447+09:00 level=info msg="Update check succeeded" duration=19.984436ms
Nov 09 18:47:09 vm-grafana1 grafana[1065]: logger=plugins.update.checker t=2023-11-09T18:47:09.596266182+09:00 level=info msg="Update check succeeded" duration=48.752864ms
azureuser@vm-grafana1:~$ 

・Grafanaの画面からの確認
Grafanaの画面が4000番ポートで正常に表示されログインできることを確認します。

ダッシュボード変更/ユーザー変更

Grafanaの画面でダッシュボード/ユーザーの変更を行っていきます。

・既存のダッシュボード削除、新規ダッシュボードの作成
下記の通り既存のダッシュボードを削除します。

下記の通り新たにダッシュボードを作成します。

・既存のユーザー削除、新規ユーザーの作成
下記の通り既存のユーザーを削除します。

下記の通り新たにユーザーを作成します。

プラグインの変更

Grafanaの画面で下記の変更を行っていきます。

  • Infinityプラグインの削除
  • Dynamic image panelプラグインの追加

下記の通りInfinityプラグインを削除します。

下記の通りDynamic image panelプラグインを追加します。

一覧からInfinityプラグインが削除され、Dynamic image panelプラグインが追加されたことを確認します。

リストア

それでは先ほど取得したバックアップからリストアを行い、変更点1の状態に戻します。

Grafanaサーバーの停止

リストア中はユーザーから操作されないよう、Grafanaサーバーを停止しておきます。

# Grafanaのサービス停止
sudo systemctl stop grafana-server
# Grafanaのサービス状態確認
sudo systemctl status grafana-server

実行結果

azureuser@vm-grafana1:~$ sudo systemctl stop grafana-server
azureuser@vm-grafana1:~$ 
azureuser@vm-grafana1:~$ sudo systemctl status grafana-server
○ grafana-server.service - Grafana instance
     Loaded: loaded (/lib/systemd/system/grafana-server.service; enabled; vendor preset: enabled)
     Active: inactive (dead) since Thu 2023-11-09 19:03:40 JST; 4s ago
       Docs: http://docs.grafana.org
    Process: 1065 ExecStart=/usr/share/grafana/bin/grafana server --config=${CONF_FILE} --pidfile=${PID_FILE_DIR}/grafana-server.pid --packaging=deb cfg:default.paths.logs=${LOG_DIR} cfg:default.paths.data=${D>
   Main PID: 1065 (code=exited, status=0/SUCCESS)
        CPU: 4.077s

Nov 09 18:57:09 vm-grafana1 grafana[1065]: logger=grafana.update.checker t=2023-11-09T18:57:09.576262365+09:00 level=info msg="Update check succeeded" duration=8.45288ms
Nov 09 18:57:09 vm-grafana1 grafana[1065]: logger=cleanup t=2023-11-09T18:57:09.595612078+09:00 level=info msg="Completed cleanup jobs" duration=48.72344ms
Nov 09 18:57:09 vm-grafana1 grafana[1065]: logger=plugins.update.checker t=2023-11-09T18:57:09.635187622+09:00 level=info msg="Update check succeeded" duration=38.217815ms
Nov 09 19:03:40 vm-grafana1 systemd[1]: Stopping Grafana instance...
Nov 09 19:03:41 vm-grafana1 grafana[1065]: logger=server t=2023-11-09T19:03:40.985789748+09:00 level=info msg="Shutdown started" reason="System signal: terminated"
Nov 09 19:03:41 vm-grafana1 grafana[1065]: logger=tracing t=2023-11-09T19:03:40.985985152+09:00 level=info msg="Closing tracing"
Nov 09 19:03:41 vm-grafana1 grafana[1065]: logger=ticker t=2023-11-09T19:03:40.986164456+09:00 level=info msg=stopped last_tick=2023-11-09T19:03:40+09:00
Nov 09 19:03:40 vm-grafana1 systemd[1]: grafana-server.service: Deactivated successfully.
Nov 09 19:03:40 vm-grafana1 systemd[1]: Stopped Grafana instance.
Nov 09 19:03:40 vm-grafana1 systemd[1]: grafana-server.service: Consumed 4.077s CPU time.
azureuser@vm-grafana1:~$ 

設定ファイルのリストア

下記コマンドをvm-grafana1で実行していきます。

# リストア先の確認
ls -la /etc/grafana/
# バックアップファイルの解凍・展開(権限を保持したまま展開するためsudoで実行)
sudo tar zxvfp /backup/01_grafana_conf.tar.gz -C /backup
# 展開したファイルの確認
ls -la /backup /backup/etc/grafana
# リストア
sudo rsync -a --delete /backup/etc/grafana/ /etc/grafana/
# リストア結果の確認
ls -la /etc/grafana/

実行結果

azureuser@vm-grafana1:~$ ls -la /etc/grafana/
total 160
drwxr-xr-x   3 root root     4096 Nov  9 19:10 .
drwxr-xr-x 104 root root     4096 Nov  1 17:37 ..
-rw-r-----   1 root grafana 70548 Nov  9 18:44 grafana.ini
-rw-r-----   1 root grafana 70526 Nov  1 16:52 grafana.ini.bak
-rw-r-----   1 root grafana  2986 Nov  1 16:52 ldap.toml
drwxr-xr-x   8 root grafana  4096 Nov  1 16:52 provisioning
azureuser@vm-grafana1:~$ 
azureuser@vm-grafana1:~$ sudo tar zxvfp /backup/01_grafana_conf.tar.gz -C /backup
./etc/grafana/
./etc/grafana/grafana.ini
./etc/grafana/grafana.ini.bak
./etc/grafana/provisioning/
./etc/grafana/provisioning/alerting/
./etc/grafana/provisioning/alerting/sample.yaml
./etc/grafana/provisioning/notifiers/
./etc/grafana/provisioning/notifiers/sample.yaml
./etc/grafana/provisioning/dashboards/
./etc/grafana/provisioning/dashboards/sample.yaml
./etc/grafana/provisioning/plugins/
./etc/grafana/provisioning/plugins/sample.yaml
./etc/grafana/provisioning/datasources/
./etc/grafana/provisioning/datasources/sample.yaml
./etc/grafana/provisioning/access-control/
./etc/grafana/provisioning/access-control/sample.yaml
./etc/grafana/ldap.toml
azureuser@vm-grafana1:~$ 
azureuser@vm-grafana1:~$ ls -la /backup /backup/etc/grafana
/backup:
total 71128
drwxrwxrwx  3 azureuser azureuser     4096 Nov  9 19:56 .
drwxr-xr-x 20 root      root          4096 Nov  9 18:46 ..
-rw-r--r--  1 root      root         47260 Nov  9 17:57 01_grafana_conf.tar.gz
-rw-r--r--  1 root      root      72738266 Nov  9 17:58 01_grafana_data.tar.gz
-rw-r--r--  1 root      root         31857 Nov  9 17:59 01_grafana_log.tar.gz
drwxr-xr-x  3 root      root          4096 Nov  9 19:56 etc

/backup/etc/grafana:
total 160
drwxr-xr-x 3 root root     4096 Nov  1 18:23 .
drwxr-xr-x 3 root root     4096 Nov  9 19:56 ..
-rw-r----- 1 root grafana 70549 Nov  1 18:23 grafana.ini
-rw-r----- 1 root grafana 70526 Nov  1 16:52 grafana.ini.bak
-rw-r----- 1 root grafana  2986 Nov  1 16:52 ldap.toml
drwxr-xr-x 8 root grafana  4096 Nov  1 16:52 provisioning
azureuser@vm-grafana1:~$ 
azureuser@vm-grafana1:~$ sudo rsync -a --delete /backup/etc/grafana/ /etc/grafana/
azureuser@vm-grafana1:~$ 
azureuser@vm-grafana1:~$ ls -la /etc/grafana/
total 160
drwxr-xr-x   3 root root     4096 Nov  1 18:23 .
drwxr-xr-x 104 root root     4096 Nov  1 17:37 ..
-rw-r-----   1 root grafana 70549 Nov  1 18:23 grafana.ini
-rw-r-----   1 root grafana 70526 Nov  1 16:52 grafana.ini.bak
-rw-r-----   1 root grafana  2986 Nov  1 16:52 ldap.toml
drwxr-xr-x   8 root grafana  4096 Nov  1 16:52 provisioning
azureuser@vm-grafana1:~$ 

Grafana生成ファイルのリストア

下記コマンドをvm-grafana1で実行していきます。

# リストア先の確認
sudo ls -la /var/lib/grafana/ /var/lib/grafana/plugins/
# バックアップファイルの解凍・展開(権限を保持したまま展開するためsudoで実行)
sudo tar zxvfp /backup/01_grafana_data.tar.gz -C /backup
# 展開したファイルの確認
sudo ls -la /backup /backup/var/lib/grafana/ /backup/var/lib/grafana/plugins/
# リストア
sudo rsync -a --delete /backup/var/lib/grafana/ /var/lib/grafana/
# リストア結果の確認
sudo ls -la /var/lib/grafana/ /var/lib/grafana/plugins/

実行結果

azureuser@vm-grafana1:~$ sudo ls -la /var/lib/grafana/ /var/lib/grafana/plugins/
/var/lib/grafana/:
total 1140
drwxr-xr-x  6 grafana grafana    4096 Nov  8 19:25 .
drwxr-xr-x 42 root    root       4096 Nov  1 17:36 ..
drwxr-x---  3 grafana grafana    4096 Nov  1 16:59 alerting
drwx------  2 grafana grafana    4096 Nov  1 16:59 csv
-rw-r-----  1 grafana grafana 1138688 Nov  1 18:23 grafana.db
drwxr-x---  4 grafana grafana    4096 Nov  9 18:54 plugins
drwx------  2 grafana grafana    4096 Nov  1 16:59 png

/var/lib/grafana/plugins/:
total 16
drwxr-x--- 4 grafana grafana 4096 Nov  9 18:54 .
drwxr-xr-x 6 grafana grafana 4096 Nov  8 19:25 ..
drwxr-x--- 3 grafana grafana 4096 Nov  9 18:54 dalvany-image-panel
drwxr-x--- 4 grafana grafana 4096 Nov  8 19:26 volkovlabs-echarts-panel
azureuser@vm-grafana1:~$ 
azureuser@vm-grafana1:~$ sudo tar zxvfp /backup/01_grafana_data.tar.gz -C /backup
./var/lib/grafana/
./var/lib/grafana/alerting/
./var/lib/grafana/alerting/1/
./var/lib/grafana/alerting/1/__default__.tmpl
./var/lib/grafana/csv/
./var/lib/grafana/grafana.db
./var/lib/grafana/png/
./var/lib/grafana/plugins/
./var/lib/grafana/plugins/volkovlabs-echarts-panel/
./var/lib/grafana/plugins/volkovlabs-echarts-panel/CHANGELOG.md
./var/lib/grafana/plugins/volkovlabs-echarts-panel/LICENSE
./var/lib/grafana/plugins/volkovlabs-echarts-panel/img/
./var/lib/grafana/plugins/volkovlabs-echarts-panel/img/dashboard.png
./var/lib/grafana/plugins/volkovlabs-echarts-panel/img/examples.png
./var/lib/grafana/plugins/volkovlabs-echarts-panel/img/logo.svg
./var/lib/grafana/plugins/volkovlabs-echarts-panel/plugin.json
./var/lib/grafana/plugins/volkovlabs-echarts-panel/module.js.LICENSE.txt
./var/lib/grafana/plugins/volkovlabs-echarts-panel/module.js
./var/lib/grafana/plugins/volkovlabs-echarts-panel/module.js.map
./var/lib/grafana/plugins/volkovlabs-echarts-panel/maps/
./var/lib/grafana/plugins/volkovlabs-echarts-panel/maps/world.json
./var/lib/grafana/plugins/volkovlabs-echarts-panel/maps/USA.json
./var/lib/grafana/plugins/volkovlabs-echarts-panel/MANIFEST.txt
./var/lib/grafana/plugins/volkovlabs-echarts-panel/README.md
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/go_plugin_build_manifest
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/gpx_infinity_linux_amd64
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/CHANGELOG.md
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/LICENSE
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/gpx_infinity_linux_arm
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/img/
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/img/aws.jpg
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/img/slide-features.png
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/img/slide-rest-api.png
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/img/slide-variables.png
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/img/oauth-2-sm.png
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/img/homepage-bg.svg
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/img/slide-series.png
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/img/icon.svg
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/gpx_infinity_darwin_amd64
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/plugin.json
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/module.js.LICENSE.txt
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/gpx_infinity_windows_amd64.exe
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/gpx_infinity_darwin_arm64
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/module.js
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/gpx_infinity_linux_arm64
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/module.js.map
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/MANIFEST.txt
./var/lib/grafana/plugins/yesoreyeram-infinity-datasource/README.md
azureuser@vm-grafana1:~$ 
azureuser@vm-grafana1:~$ sudo ls -la /backup /backup/var/lib/grafana/ /backup/var/lib/grafana/plugins/
/backup:
total 71132
drwxrwxrwx  4 azureuser azureuser     4096 Nov  9 19:57 .
drwxr-xr-x 20 root      root          4096 Nov  9 18:46 ..
-rw-r--r--  1 root      root         47260 Nov  9 17:57 01_grafana_conf.tar.gz
-rw-r--r--  1 root      root      72738266 Nov  9 17:58 01_grafana_data.tar.gz
-rw-r--r--  1 root      root         31857 Nov  9 17:59 01_grafana_log.tar.gz
drwxr-xr-x  3 root      root          4096 Nov  9 19:56 etc
drwxr-xr-x  3 root      root          4096 Nov  9 19:57 var

/backup/var/lib/grafana/:
total 1136
drwxr-xr-x 6 grafana grafana    4096 Nov  8 19:25 .
drwxr-xr-x 3 root    root       4096 Nov  9 19:57 ..
drwxr-x--- 3 grafana grafana    4096 Nov  1 16:59 alerting
drwx------ 2 grafana grafana    4096 Nov  1 16:59 csv
-rw-r----- 1 grafana grafana 1138688 Nov  1 18:23 grafana.db
drwxr-x--- 4 grafana grafana    4096 Nov  8 19:26 plugins
drwx------ 2 grafana grafana    4096 Nov  1 16:59 png

/backup/var/lib/grafana/plugins/:
total 16
drwxr-x--- 4 grafana grafana 4096 Nov  8 19:26 .
drwxr-xr-x 6 grafana grafana 4096 Nov  8 19:25 ..
drwxr-x--- 4 grafana grafana 4096 Nov  8 19:26 volkovlabs-echarts-panel
drwxr-x--- 3 grafana grafana 4096 Nov  8 19:25 yesoreyeram-infinity-datasource
azureuser@vm-grafana1:~$ 
azureuser@vm-grafana1:~$ sudo rsync -a --delete /backup/var/lib/grafana/ /var/lib/grafana/
azureuser@vm-grafana1:~$ 
azureuser@vm-grafana1:~$ sudo ls -la /var/lib/grafana/ /var/lib/grafana/plugins/
/var/lib/grafana/:
total 1140
drwxr-xr-x  6 grafana grafana    4096 Nov  8 19:25 .
drwxr-xr-x 42 root    root       4096 Nov  1 17:36 ..
drwxr-x---  3 grafana grafana    4096 Nov  1 16:59 alerting
drwx------  2 grafana grafana    4096 Nov  1 16:59 csv
-rw-r-----  1 grafana grafana 1138688 Nov  1 18:23 grafana.db
drwxr-x---  4 grafana grafana    4096 Nov  8 19:26 plugins
drwx------  2 grafana grafana    4096 Nov  1 16:59 png

/var/lib/grafana/plugins/:
total 16
drwxr-x--- 4 grafana grafana 4096 Nov  8 19:26 .
drwxr-xr-x 6 grafana grafana 4096 Nov  8 19:25 ..
drwxr-x--- 4 grafana grafana 4096 Nov  8 19:26 volkovlabs-echarts-panel
drwxr-x--- 3 grafana grafana 4096 Nov  8 19:25 yesoreyeram-infinity-datasource
azureuser@vm-grafana1:~$ 

Grafanaデータベースのリストア

下記コマンドをvm-grafanadbで実行していきます。

# リストア実施
pg_restore -h localhost -p 5432 -U grafana_psuser --clean -d grafana_psdb /backup/01_grafana_psdb.dump

実行結果

azureuser@vm-grafanadb:~$ pg_restore -h localhost -p 5432 -U grafana_psuser --clean -d grafana_psdb /backup/01_grafana_psdb.dump
Password: 
azureuser@vm-grafanadb:~$ 

Grafanaサーバーの起動

これで一通りリストアが終わったので、Grafanaサーバーを起動します。

# Grafanaのサービス起動
sudo systemctl start grafana-server
# Grafanaのサービス状態確認
sudo systemctl status grafana-server

実行結果

azureuser@vm-grafana1:~$ sudo systemctl start grafana-server
azureuser@vm-grafana1:~$ 
azureuser@vm-grafana1:~$ sudo systemctl status grafana-server
● grafana-server.service - Grafana instance
     Loaded: loaded (/lib/systemd/system/grafana-server.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2023-11-09 19:43:55 JST; 4s ago
       Docs: http://docs.grafana.org
   Main PID: 1606 (grafana)
      Tasks: 5 (limit: 2263)
     Memory: 62.5M
        CPU: 2.359s
     CGroup: /system.slice/grafana-server.service
             └─1606 /usr/share/grafana/bin/grafana server --config=/etc/grafana/grafana.ini --pidfile=/run/grafana/grafana-server.pid --packaging=deb cfg:default.paths.logs=/var/log/grafana cfg:default.paths.d>

Nov 09 19:43:58 vm-grafana1 grafana[1606]: logger=modules t=2023-11-09T19:43:58.141032049+09:00 level=warn msg="No modules registered..."
Nov 09 19:43:58 vm-grafana1 grafana[1606]: logger=http.server t=2023-11-09T19:43:58.143209598+09:00 level=info msg="HTTP Server Listen" address=[::]:3000 protocol=http subUrl= socket=
Nov 09 19:43:58 vm-grafana1 grafana[1606]: logger=ngalert.state.manager t=2023-11-09T19:43:58.143437004+09:00 level=info msg="Warming state cache for startup"
Nov 09 19:43:58 vm-grafana1 grafana[1606]: logger=grafanaStorageLogger t=2023-11-09T19:43:58.145165843+09:00 level=info msg="storage starting"
Nov 09 19:43:58 vm-grafana1 grafana[1606]: logger=report t=2023-11-09T19:43:58.145543851+09:00 level=warn msg="Scheduling and sending of reports disabled, SMTP is not configured and enabled. Configure SMTP to >
Nov 09 19:43:58 vm-grafana1 grafana[1606]: logger=ngalert.state.manager t=2023-11-09T19:43:58.14638637+09:00 level=info msg="State cache has been initialized" states=0 duration=2.948566ms
Nov 09 19:43:58 vm-grafana1 grafana[1606]: logger=ticker t=2023-11-09T19:43:58.146575675+09:00 level=info msg=starting first_tick=2023-11-09T19:44:00+09:00
Nov 09 19:43:58 vm-grafana1 grafana[1606]: logger=ngalert.multiorg.alertmanager t=2023-11-09T19:43:58.146710778+09:00 level=info msg="starting MultiOrg Alertmanager"
Nov 09 19:43:58 vm-grafana1 grafana[1606]: logger=grafana.update.checker t=2023-11-09T19:43:58.183858919+09:00 level=info msg="Update check succeeded" duration=39.528195ms
Nov 09 19:43:58 vm-grafana1 grafana[1606]: logger=plugins.update.checker t=2023-11-09T19:43:58.213099882+09:00 level=info msg="Update check succeeded" duration=68.474152ms
azureuser@vm-grafana1:~$ 

変更点1に戻っていることの検証

最後に、Grafanaの画面で変更点1に戻っていることを確認します。

・ポート番号

・ダッシュボード/ユーザー

・プラグイン

個別ディレクトリの解説

今回はバックアップ不要であるディレクトリも含めて、親ディレクトリ(/etc/grafana/var/lib/grafana)ごとバックアップを行いました。
特段問題無ければ、この運用が一番シンプルのため推奨しますが、「バックアップ必要なディレクトリだけバックアップしたい」「バックアップ容量を削減したい」などあるかもしれません。
そのため、現時点で分かっている範囲で、個別ディレクトリの解説をいたします。
※なお、基本的にはと書いている通り、例えばprovisioningなどを頻繁に更新する場合はその都度バックアップを取るか、今回のように一括でバックアップ対象に含めることを推奨します。(ただ、これらをGitなどで変更管理しているためバックアップ不要、といった判断も出来ます。)

設定ファイル関連の解説

/etc/grafana/および$WORKING_DIR/conf/の配下に作成されるディレクトリについて解説します。

  • provisioning
    このディレクトリは、Grafana起動時に配置したいダッシュボードやデータソースのyamlファイルを格納するディレクトリになります。
    日々、自動的に更新されるものではないため基本的にはバックアップ不要ですが、例えばCI/CDで定期的に更新するなどの運用をしている場合、バックアップを検討しても良いでしょう。
    ※前述の通り、Gitなどで変更管理している場合はバックアップ不要、との判断も出来ます。

Grafana生成ファイル関連の解説

/var/lib/grafana/および$WORKING_DIR/data/の配下に作成されるディレクトリについて解説します。

  • alerting
    アラート機能を利用した際に使用される一時ディレクトリのためバックアップ不要
  • csv
    CSVエクスポート機能を利用した際に使用される一時ディレクトリのためバックアップ不要
  • log(APTでは/var/log/grafana/)
    ログファイルが格納されるディレクトリ。
    リストアするにあたってはバックアップ不要ではあるが、バックアップ領域の容量として許容されるならバックアップを推奨。(トラブルシューティング時などのため)
  • plugins
    導入したプラグインが格納されるディレクトリ。前述の通りバックアップ必須
  • png
    レポート作成時にグラフが含まれる場合、その画像が格納される一時ディレクトリのためバックアップ不要
  • 上記以外
    Grafanaが実験的な機能などにより作成されるディレクトリであり、利用している機能やバージョンにより変化する可能性が高いため、バックアップを推奨

終わりに

Grafanaは可視化するデータを溜め込まないという性質上、一般的なOLTPシステムに比べて、データの更新頻度が低いです。
しかし、だからと言ってバックアップ・リストアの計画が不要かというと、ダッシュボードやユーザー、プラグインなどは更新されますので、バックアップ・リストアの計画は必要になってきます。
今回はユーザーから「ある一時点の過去に戻したい」との要望があったというケースでご紹介しましたが、そこまで運用で手厚くカバーしないまでも、障害発生時に備えて定期的なバックアップを計画することが大事になります。
また、今回の手順を応用して「別サーバーへの移行・複製」なども行えますので、ぜひご活用ください。

ハンズオン・セミナーご紹介

最後にもう一点だけ、同様の内容をハンズオン形式のセミナーでご紹介しますので、良ければご覧ください。

・セミナー動画(アーカイブ)
後日掲載予定
・セミナー資料
よくわかるGrafana入門 ~バックアップ・リストアとアップグレード~

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です