概要
MySQL8.0がEOLになり、弊社で運用しているサービスのMySQLもリプレイスすることになりました。その中でも特に時間のかかる部分について実際にかかった時間やパラメータを踏まえて記事にしてみました。
特にバックアップやリストアにかかる時間などデータベースの運用に関わる人は気になるところかもしれません。
対象マシン
あまり興味がなく、以下のざっくりした情報だけです。多分ハード好きな同僚から細かくスペック情報が来ると思うので、その時に更新します。
- CPU:128スレッド
- メモリ:約1TB
- 1GBイーサネット環境
バックアップとリストアのパターンその1(圧縮なし)
- PerconaXtrabackup8.0を利用してバックアップします。バックアップ時のdataディレクトリのサイズは1.4TBです
- リストア先のマシン(MySQL8.4)でリストアします
- 圧縮なしだと4時間30分ほどかけてバックアップとリストアが完了します
バックアップその1(約4時間15分)
- PerconaXtrabackup8.0でバックアップします
- 以下ストリーミングでバックアップします
time sudo xtrabackup \
--backup \
--user=root \
--socket=/opt/mysql-data/mysql.sock \
--parallel=16 \
--slave-info \
--stream=xbstream | nc [転送先] 9999
-
所要時間: 約4時間15分
-
特記事項:
- 並列処理数(
--parallel=16
)を指定 - ストリーミング(
--stream=xbstream
)形式で取得し、そのままネットワーク経由で送信 - リモート転送時間を含む全体の実行時間
- 並列処理数(
リストア
- PerconaXtrabackup8.0でリストアします
リストア前処理の時間
prepare(約1分15秒)
- バックアップから InnoDB の整合性を復元する処理です
time sudo xtrabackup --prepare --parallel=32 --target-dir=/opt/xxx_backup
- 所要時間: 約1分15秒
copy-back(約6分)
- バックアップデータを MySQL のデータディレクトリへ復元
time sudo xtrabackup --copy-back --parallel=32 --target-dir=/opt/xxx_backup
- 所要時間: 約6分
バックアップとリストアのパターンその2(圧縮あり)
- 圧縮ありだとdataディレクトリが1.4TBであっても90分ほどでバックアップとリストアが完了します
バックアップ
- PerconaXtrabackup8.0でバックアップします
time sudo xtrabackup \
--backup \
--user=root \
--socket=/opt/mysql-data/mysql.sock \
--parallel=16 \
--slave-info \
--compress \
--stream=xbstream | nc [転送先] 9999
-
所要時間: 約58分
-
特記事項:
- 並列処理数(
--parallel=16
)を指定 - ストリーミング(
--stream=xbstream
)形式で取得し、そのままネットワーク経由で送信 - リモート転送時間を含む全体の実行時間
-
--compress
オプションで圧縮しています。
- 並列処理数(
リストア
- PerconaXtrabackup8.0でリストアします
- リストア時には
--compress
オプションによる圧縮を解凍する必要があります
解凍処理(約8分)
- 圧縮転送されたファイルを解凍してxtrabackupで利用できる形式に戻す作業です
time sudo find /opt/xxx_backup -type f -print0 | xargs -0 -n1 -P$(nproc) zstd -d --rm
- 所要時間: 約7分47秒
prepare(約1分54秒)
- バックアップから InnoDB の整合性を復元する処理になります
time sudo xtrabackup --prepare --parallel=24 --target-dir=/opt/xxx_backup
- 所要時間: 約1分54秒
- 32スレッドから24スレッドにしたところ、prepare時間は伸びました
copy-back(約6分)
- バックアップデータを MySQL のデータディレクトリへ復元する処理です
time sudo xtrabackup --copy-back --parallel=32 --target-dir=/opt/xxx_backup
- 所要時間: 約6分
- スレッド数を変えずに処理すると概ね10秒以内の誤差でした
まとめ
-
--parallel
オプションについてはストレージやネットワークの制限を大きく受ける印象でした(スレッド増やしても頭打ちになる)。ただし--compress
オプションを利用した場合にはCPUも回っていました。圧縮ってちゃんと計算してるんだなっていうのが目に見えて面白いです -
--parallel
オプションを増やしすぎると同居してるMySQLで使えるスレッドが減るため注意してください - 物理バックアップでは、xtrabackupが最も使い勝手が良かったため利用しています