03/5/2018, 12:56 AM GMT+9

CentOS7でLVMのスナップショットを用いたオンラインバックアップをとる

前提環境

この記事は、以下の環境を前提にしています。(異なる環境でもおよそ同じだと思いますが念の為。)

  • CentOS7
  • バックアップ対象のファイルシステムがLVMで管理されていること(CentOS7のデフォルト?)
  • ファイルシステムがxfs (CentOS7のデフォルト?)

xfsdump を用いた基本的なバックアップの取り方については、自宅サーバ(CentOS7)のバックアップをとる   を参照してください。この記事の内容を前提に、サーバーを止めることなくバックアップを行う方法について解説します。

目標

  • サービスを中断せずにバックアップをとる
  • ただし、データの整合性は維持したい(バックアップ中に対象のファイルシステムにあるファイルが書き換えられても安全にバックアップしたい)

いわゆるオンラインバックアップです。

前置き

前回は xfsdump を用いてファイルシステム全体をバックアップすることに成功しました。しかしながら、ファイルシステム全体のバックアップを取るためには、データの整合性を保つために、そのサーバーで提供しているサービスを一時中断する必要がありました。容量にもよりますが、バックアップには数時間かかることもありますから、自宅サーバーで運用しているレベルのサービスでも流石に問題となってきます。

そこで今回は、CentOS7 では標準の環境である、LVM によって管理される xfs のオンラインバックアップ(サービスを中断せずにバックアップを取ること)にチャレンジしていきたいと思います。

スナップショットとは

LVM においては、論理ボリュームのスナップショットを取ることができます。これは、対象の論理ボリュームとは別にスナップショット領域を作成し、対象の論理ボリュームのファイルに変更があったときのみ、スナップショットに元のデータを保持するというものです。

スナップショットの何が嬉しいかというと、

  1. スナップショットの対象となる論理ボリュームのファイルに変更が加えられている最中で一時的にその整合性が保たれていない状態にあっても、スナップショットにおいては整合性が保たれている
  2. 対象の論理ボリュームと見かけ上同じように扱える(xfsdump が使える)
  3. スナップショットはサービスを停止せずに作成できる
  4. スナップショット領域に必要な容量はバックアップ中に変更されるファイルの量(そこまで大きな容量を要求しない)

つまり、オンラインバックアップを実現するにはスナップショットを作成し、それを 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 を縮小する必要があります。私の場合もそうだったので、縮小する方法はまた後で書くと思います(// TODO)

スナップショット領域をマウント(ここでつまづいた)

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

多分これでバックアップが取れたはずです。お疲れ様でした。

自動化(追記)

さて、ここまでの手順はそこまで複雑ではないものの、毎日あるいは毎週これを行うとなると非常に面倒です。このような単純作業の定期実行は人間のやるべき作業ではないでしょう。そこで、ここまでの手順を自動化してみたのが次の記事です。ぜひ合わせてご覧ください。

http://blog.cosnomi.com/archives/859


Cosnomi
Cosnomi

コンピュータ(Web, 機械学習など)が好きな医学部生

Twitter / GitHub