Percona XtraBackupの機能紹介 (1) 差分バックアップ

誰もが一度は「差分だけバックアップできたらな」と思うところですが、なんとXtraBackupには差分バックアップがあるのです。

  • Incremental Backups

  • 巨大に膨れ上がったデータベースの更新分だけを抽出して、別サーバで完全体に戻しておく、といったことができるため、より効率的なバックアップを行うことができます。少なくともバイナリログによる差分バックアップとかダサいことはやる必要がなくなります。



    メリットとデメリット


    メリット

  • 差分バックアップの処理時間は全体バックアップより短くなります
  • 差分バックアップは容量が変更分だけのためかなり小さくなります
  • ベースバックアップから好きな差分のところまで復元できます

  • デメリット

  • リストアのために差分の適用処理が必要になります
  • ベースと差分のバックアップ世代管理が複雑になります


  • 差分バックアップ


    バックアップ取得

    まるごと取得したバックアップに対して、差分だけを別のディレクトリに保存していきます。

    ファイル種類

    ベースは通常通り ibdata と .ibd ファイルで保存されますが、差分は同ファイルに .delta .meta の拡張子がついたデータが保存されます。

    容量

    差分を取る前に数回更新クエリを実行しただけですが、ベースが1GBに対して、差分は1MBに満たないサイズになっています。

    チェックポイント

    それぞれの xtrabackup_checkpoints ファイルにはLSNの値が記録されています。
    from_lsn から to_lsn までが差分として記録した範囲です。last_lsn はxtrabackup終了時のチェックポイントであり、取得中に更新クエリが実行されていると to_lsn より値が大きくなることがあります。


    リストア

    まずベースを –prepare –apply-log-only してから、ベースに対して、差分を適用していきます。
    仕上がったベースディレクトリが完成品となり、続きは通常のリストアと同じ手順になります。


    正常性の確認

    差分で取得してベースに適用したデータが、本当に正しいデータとなっているかを確認します。
    以下のような手順でバックアップ取得とクエリ実行を行い、最初のベースに差分を適用したデータと、最後に再取得したベースをmd5で比較します。なんとなくログファイルを 1MB×2 と極小にして実験しています。

  • ベースバックアップ取得
  • sysbenchで更新クエリを流しっぱなしにする(500qps以上)
  • 差分1取得(データ更新中)
  • 差分2取得(データ更新中)
  • sysbenchを停止する
  • 差分3取得(更新停止後)
  • 最新バックアップ取得

  • バックアップ取得

    リストア

    比較

    ibdataと更新したテーブルの.ibdをmd5で比較してみます。

    差分3まで適用したバックアップと、新規バックアップのハッシュ値が一致したので、差分システムに問題ないことが判明しました。


    使いどころ

    普通のバックアップは、1日に1回の全体バックアップで、別サーバに転送しておいて、最新何日か分と月初めなど特定の日にちを除いて間引きする、といったものだと思います。

    それに対して差分バックアップはどう使うべきか考えてみます。

    例えば極端に、最初の1回を除いて残り全て差分で保存したらどうなるか。
    1年後にバックアップを必要とした時、365個の差分を割り当ててからリストアすることになります。これだと数が多いし、1年間の差分が全て正常かなんて自信がもてないでしょう。せめて、差分を取得するたびに別サーバで差分を適用して常に完成版を作っておくべきと思いますが、それでもその完成版が正常なバックアップであることを定期的に証明したいだろうし(※1)、世代管理という機能を失うのであまり上手くありません。

    日曜日だけ全体バックアップにして、他は差分にするといった落とし所もありますが、本番サーバで全体バックアップを実行してしまうとあまり通常の方法と変わりありません。

    ※1 差分の正常性を疑うなら、通常の全体バックアップも疑うべきで、逆に考えると差分も信じるしかないのですが・・・差分だとやはり心理的に怖さがあるので大丈夫だと確認できる仕組みを用意したいところです

    重要なポイントとして、差分のウマ味は、本番サーバでの処理時間と容量が激減し、別サーバへの転送時間も短くなることなので、その部分は常に固定にしたいと考えます。

    なので例えば、本番サーバでは常に差分のみ取得して転送し、別サーバでは適用を行いつつ日曜には完成版のコピーを保管しておき、3ヶ月以上経過したものは削除する。これだと12個の完成版と、3ヶ月分の差分ファイルで済み、特定の日にちのデータが欲しい時用の世代管理にもなります。あとはディスク容量に応じて間引きやコピー頻度を調整するだけです。


    こうなると、あとは差分適用バックアップの正常性のみが問題になります。
    とはいえ、データの中身を照会しての完全一致確認など不可能ですから、信頼してしまうのも1つの手だと思います。

    ハッシュでの確認が簡単ですが、常に更新される本番データでそれはできないので、サービスメンテナンスのタイミングで
  • メンテに入る
  • 差分バックアップ&別サーバで適用
  • 本番とバックアップサーバのデータのハッシュ照合
  • 一致しなかったら新規に全体バックアップ取り直し
  • それからメンテ作業へ

  • とオペレーションを増やせば定期的に確認できます。この方法は、作業量増加により人災が起こる可能性も増えますが、それよりもバックアップに対する姿勢と質が強固になるメリットがあると思います。

    落とし所が難しいですが、サービスが大きくなると必須な仕組みにもなりうるので、お試ししておくと良いのではないでしょうか。