前提環境
この記事は、以下の環境を前提にしています。(異なる環境でもおよそ同じだと思いますが念の為。)
- CentOS7
- バックアップ対象のファイルシステムがLVMで管理されていること(CentOS7のデフォルト)
- ファイルシステムがxfs (CentOS7のデフォルト)
xfsdump
を用いた基本的なバックアップの取り方については、自宅サーバ(CentOS7)のバックアップをとる を参照してください。この記事の内容を前提に、サーバーを止めることなくバックアップを行う方法について解説します。
目標
- サービスを中断せずにバックアップをとる
- ただし、データの整合性は維持したい(バックアップ中に対象のファイルシステムにあるファイルが書き換えられても安全にバックアップしたい)
いわゆるオンラインバックアップです。
前置き
前回は xfsdump
を用いてファイルシステム全体をバックアップすることに成功しました。しかしながら、ファイルシステム全体のバックアップを取るためには、データの整合性を保つために、そのサーバーで提供しているサービスを一時中断する必要がありました。容量にもよりますが、バックアップには数時間かかることもありますから、自宅サーバーで運用しているレベルのサービスでも流石に問題となってきます。
そこで今回は、CentOS7では標準の環境である、LVMによって管理されるxfsのオンラインバックアップ(サービスを中断せずにバックアップを取ること)にチャレンジしていきたいと思います。
スナップショットとは
LVMにおいては、論理ボリュームのスナップショットを取ることができます。これは、対象の論理ボリュームとは別にスナップショット領域を作成し、対象の論理ボリュームのファイルに変更があったときのみ、スナップショットに元のデータを保持するというものです。
スナップショットの嬉しいところは、次のような点です。
- スナップショットの対象となる論理ボリュームのファイルに変更が加えられている最中で一時的にその整合性が保たれていない状態にあっても、スナップショットにおいては整合性が保たれている
- 対象の論理ボリュームと見かけ上同じように扱える(xfsdumpが使える)
- スナップショットはサービスを停止せずに作成できる
- スナップショット領域に必要な容量はバックアップ中に変更されるファイルの量(そこまで大きな容量を要求しない)
つまり、オンラインバックアップを実現するにはスナップショットを作成し、それを xfsdump
でバックアップすればいいことになります。
具体的な手順
まずはバックアップデータの保存先をマウントします。
mkdir /mnt/backup1
sudo mount /dev/sdb /mnt/backup1
次にSnapshot領域を確保(対象がcl/homeのとき)
lvcreate -s --size=50G --name snap-home /dev/cl/home
もしVGに空きがない場合(homeで残100%を割り当てているケースなど)は、そのLVを縮小する必要があります。
スナップショット領域をマウント(ここでつまづいた)
mkdir /mnt/snap-home
mount -t xfs -o ro,nouuid /dev/cl/snap-home /mnt/snap-home #UUID重複を無視し、読み取り専用でマウント
スナップショット領域をダンプします。
xfsdump -M root -L backup -l 0 -u -f /mnt/backup1/lv0.dump /mnt/snap-home
後処理です。
umount /mnt/snap-home
lvremove /dev/cl/snap-home
umount /mnt/backup1
これでバックアップが取れたはずです。お疲れ様でした。
自動化(追記)
さて、ここまでの手順はそこまで複雑ではないものの、毎日あるいは毎週これを行うとなると非常に面倒です。このような単純作業の定期実行は人間のやるべき作業ではないでしょう。そこで、ここまでの手順を自動化してみたのが次の記事です。ぜひ合わせてご覧ください。