皆様MySQLのバックアップは管理できていますでしょうか。
増え続けるMySQLクラスタと、手製のバックアップスクリプトの管理、雑然としているcrontabにお困りではありませんか?
バックアップ管理のためのOSSとしては、 Amanda、Bacula あたりが有名ですが、それなりにお作法が多く、またデータベースに限らない汎用的なバックアップ管理ソフトウェアですので、ちょっと多機能すぎるかな…という事もあるかもしれません。
そこで、現在テクニカルプレビュー版ではあるものの、PMM 2.18.0で実装されたBackup Managementをご紹介します。
環境の準備について
監視対象のMySQLデータベースはクライアント側にインストール済みとします。
PMM Server/Clientについては、以下を参照の上セットアップします。
https://docs.percona.com/percona-monitoring-and-management/setting-up/server/index.html
https://docs.percona.com/percona-monitoring-and-management/setting-up/client/index.html
Backup Management機能を利用するにあたり、サーバ側では当該機能を有効化する必要があります。
起動時の環境変数(-e ENABLE_BACKUP_MANAGEMENT=1)でも有効化できますし、GUI(Settings/Advanced Settings)からも有効化は可能です。
フラグ
1 2 3 4 5 6 |
docker run -d --restart always \ --publish 443:443 \ -v pmm-data:/srv \ --name pmm-server \ -e ENABLE_BACKUP_MANAGEMENT=1 \ percona/pmm-server:2 |
クライアントサーバでは以下の条件を満たしておく必要があります。
- PMM2 Clientがインストールされ、PMM Serverに登録済みであり、MySQL(or MongoDB)の監視サービスが有効化されている
- 以下がインストール済みであり、pmm-agentの起動ユーザの$PATHに含まれている
- systemdでmysql.service(or mysqld.service)が起動している
- サービスは –user=mysql で起動しており、OSのmysqlユーザはmysql:mysqlである
- datadirは/var/lib/mysqlである
- pmm-agentは/var/lib/mysqlのread/writeパーミッションを持つ
- MySQL 8.0以上の場合、pmm2-clientからMySQLへの接続ユーザには
BACKUP_ADMIN
権限が必要
基本的に必要なパッケージがインストールされていれば、デフォルトで要件を満たすことができます。
ここではツールのインストールコマンドだけご紹介しておきます。
1 2 3 |
$ dnf -y install https://downloads.percona.com/downloads/percona-release/percona-release-1.0-27/redhat/percona-release-1.0-27.noarch.rpm $ percona-release enable tools release $ dnf -y install percona-xtrabackup-80 qpress # xtrabackupはmysqlに適したバージョンを利用する必要があります。 |
S3ストレージの準備
残念ながら、現在のところバックアップの保管先はS3オブジェクトストレージのみです。
Currently supported: MySQL database server or MongoDB replica set cluster, backing up to Amazon AWS S3 storage locations.
しかしながら、UI上ではローカルバックアップ等の内容も確認され、近い将来実装されることが期待できます。
AWS S3やAzure blob storageを利用することができますが、今回は検証ですので、ローカルにOSSのオブジェクトストレージであるminioを起動して利用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
$ cd ~ $ mkdir -p /data/minio $ wget https://dl.min.io/server/minio/release/linux-amd64/minio $ wget https://dl.min.io/client/mc/release/linux-amd64/mc $ chmod +x minio mc $ cp mc /usr/bin $ ./minio server /data/minio & API: http://<IP>:9000 http://127.0.0.1:9000 RootUser: minioadmin RootPass: minioadmin Console: http://<IP>:35617 http://127.0.0.1:35617 RootUser: minioadmin RootPass: minioadmin Command-line: https://docs.min.io/docs/minio-client-quickstart-guide $ mc alias set myminio http://<IP>:9000 minioadmin minioadmin Documentation: https://docs.min.io WARNING: Console endpoint is listening on a dynamic port (35617), please use --console-address ":PORT" to choose a static port. WARNING: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables $ mc alias set myminio http://<IP>:9000 minioadmin minioadmin $ mc mb myminio/mysql-backup Bucket created successfully <code>myminio/mysql-backup</code>. $ mc ls myminio [2022-01-10 14:16:45 JST] 0B mysql-backup/ |
バックアップロケーションの登録
それではここからPMM ServerのUIでの操作になります。
ログイン後の画面の、左側のメニューバーから以下のアイコンをクリックしてBackup Managementの画面を表示します。
S3の接続情報を、PMM Serverに登録する必要があります。
まずは、「Storage Locations」タブから、「+Add」ボタンを押下し、以下のようにS3接続情報を登録します。
オンデマンドバックアップ
「Backup Inventory」タブの 「+Add」ボタンは、すぐにバックアップを取得する際に利用します。
押下すると、バックアップ情報を入力できます。
情報を入力し、「Backup」ボタンを押下するとすぐにバックアップが実行されます。
取得したバックアップはリストに表示され、Status列がSuccessとなったらバックアップ完了です。
スケジュールバックアップ
指定した間隔でバックアップを取得する事もできます。
オンデマンドと同様に対象のクライアントやバックアップ名、ロケーションを設定し、下部のメニューでは、
- 実行スケジュール
- バックアップ保持数(Retention)
- バックアップが失敗した場合の自動リトライ機能、リトライ回数、間隔(Retry mode/Retry interval,seconds)
といった事を指定できます。
今回はテストですので、毎分バックアップを実行するようにして、ちゃんと世代数等が確保されるかを確認してみます。
watch コマンドでしばらくストレージ内の様子を確認していると、ちゃんと2世代分のバックアップが保持されることが確認できました。
1 2 3 |
Every 2.0s: mc ls myminio/mysql-backup pmm-minio: Wed Jul 27 08:24:08 2022 [2022-07-27 08:24:08 UTC] 0B scheduled backup_2022-07-27T08:23:00Z/ [2022-07-27 08:24:08 UTC] 0B scheduled backup_2022-07-27T08:24:00Z/ |
注意点としては、バックアップ取得->削除の流れですので、瞬間的にRetention + 1の数のバックアップになります。
ストレージには余裕を持つことが必要です。
1 2 3 4 |
Every 2.0s: mc ls myminio/mysql-backup pmm-minio: Wed Jul 27 08:25:06 2022 [2022-07-27 08:24:08 UTC] 0B scheduled backup_2022-07-27T08:23:00Z/ [2022-07-27 08:25:06 UTC] 0B scheduled backup_2022-07-27T08:24:00Z/ [2022-07-27 08:25:06 UTC] 0B scheduled backup_2022-07-27T08:25:00Z/ |
スケジュールで取得したバックアップも「Backup Inventory」タブで確認可能です。
動作が確認できたため、一旦スケジュールバックアップを停止します。
リストアの実行
取得したバックアップは任意のPMM Clientとして登録された環境にリストアすることが可能です。
バックアップは何も作成していないMySQLサーバで取得したものですので、world database
をインポートして、リストア後にもとに戻るか確認してみます。
1 2 3 4 5 6 7 8 9 |
$ curl -sSkL https://downloads.mysql.com/docs/world-db.tar.gz | \ tar xzfO - | \ mysql -uroot -p $ mysql -uroot -p -e "SHOW DATABASES LIKE 'world'" +------------------+ | Database (world) | +------------------+ | world | +------------------+ |
先ほどのリストアボタンを押下すると、リストア用のメニューが表示されます。
「Compatible services」を選択すると、「Service name」から任意のリストア先となるクライアントを選択することが可能です。
ただし、異なるMySQLバージョン、MySQLフォークで取得したバックアップ等の互換性はユーザが考えてリストアすることが必要です。
バックアップ名にバージョンやアーキテクチャをつけておくと便利かと思います。
リストアを実行すると、「Restore history」タブから状況を確認することができます。
StatusがSuccessになっていれば成功しているはずです。
クライアントのmysqlに戻りましょう。
1 2 3 4 5 6 7 8 9 |
$ mysql -uroot -p -e "SHOW DATABASES" +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ |
worldデータベースがなくなっています。
/var/lib/mysql
配下のファイルのタイムスタンプはリストア時刻になっていました。
1 2 3 4 5 6 |
$ ls -ld /var/lib/mysql/* | head -5 -rw-r-----. 1 mysql mysql 196608 Jul 27 08:43 /var/lib/mysql/#ib_16384_0.dblwr -rw-r-----. 1 mysql mysql 8585216 Jul 27 08:41 /var/lib/mysql/#ib_16384_1.dblwr drwxr-x---. 2 mysql mysql 187 Jul 27 08:41 /var/lib/mysql/#innodb_temp -rw-r-----. 1 mysql mysql 56 Jul 27 08:41 /var/lib/mysql/auto.cnf -rw-r-----. 1 mysql mysql 157 Jul 27 08:41 /var/lib/mysql/binlog.000010 |
エラーログからは、リストアのためにサービスが再起動している様子があります。
1 2 3 4 5 6 7 |
2022-07-27T08:41:21.489259Z 0 [System] [MY-013172] [Server] Received SHUTDOWN from user <via user signal>. Shutting down mysqld (Version: 8.0.28-20). : 2022-07-27T08:41:24.523292Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.28-20) Percona Server (GPL), Release 20, Revision fd4b5a776a6. : 2022-07-27T08:41:28.945917Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.28-20) starting as process 28276 : 2022-07-27T08:41:29.931929Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.28-20' socket: '/var/lib/mysql/mysql.sock' port: 3306 Percona Server (GPL), Release 20, Revision fd4b5a776a6. |
以上より、非常に簡単にリストアも完了しました。
所感
触ってみた限りでは、早くテクニカルプレビューを脱してほしい…という機能で非常に便利でした。
リストア用サーバを用意しておけば、簡単にバックアップ自体の正常性確認も行うことができます。
現在のUIから推察する限りは、本格リリース時に以下の機能の実装が期待できます。
- MySQL/MongoDB以外のデータベース(PostgreSQL?)
- Logical Backup(mysqldump? mysqlsh dumpInstance()? mydumper?)
- Local Client Backup(バックアップをクライアントサーバ上に保存)
- Local Server Backup(バックアップをPMMサーバ上に保存)
- MySQLでのIncremental Backup(MongoDBではすでに利用可能)
改善してほしいところは以下のような点があります。
- バックアップ対象となるdatadirのパスを任意に選択したい
- 中規模以上の環境への対応のために優先度等細かなジョブ制御パラメータもほしい
- xtrabackup自体のオプションを制御したい
- MariaDB(mariabackup)への対応
PMM Serverを構築するだけで、MySQLの詳細な監視とアラート機能、バックアップ等など様々な機能が手に入ります。
※ さすがPercona社はかゆいところに手がとどく製品を作ることが上手です
バックアップスクリプトとcronの管理が辛いと感じているユーザは、導入の価値があるのではと思います。
PMMをお楽しみください!