お名前.com VPSでの安価な負荷分散運用とスナップショット&バックアップ 3ページ
LVMのスナップショットを利用したファイルのバックアップ
LVMのスナップショットを利用するには、バックアップを取得したいディレクトリ(ボリューム)をLVM物理ボリューム(PV)として構成しておく必要がある。基本的には、OSインストール時にディスクパーティションの設定をカスタマイズして、ブート用の基本パーティション(/boot)とLVM物理ボリューム(PV)を作成し、LVM物理ボリューム(PV)の中にLVM論理ボリューム(LV)として、/やスワップパーティションなどを構成することになる。

LVM論理ボリューム(LV)確保時のポイントとしては、LVM物理ボリューム(PV)にスナップショット用の空き領域を確保しておくことである。スナップショット用の領域にはバックアップ対象ボリュームの稼働差分が保管されるので、更新頻度やスナップショットの保管期間(バックアップコピー時の時間)によって、必要な空き領域のサイズが決まってくる。目安としてはバックアップ対象ボリュームの1、2割程度の領域が確保できていれば十分だ。一方で、LVM論理ボリューム(LV)のサイズ拡張は比較的容易なので、あまりぎりぎりのサイズ設計をせずにかなり余裕を持ったパーティション設計にしておくことをお勧めする。
ここでは、/var以下の任意のディレクトリをバックアップすることを想定し、起動パーティションの/bootのほかは、すべてLVM物理ボリューム(PV)上の以下のようなパーティション構成を例に解説していく。
# df Filesystem 1K-ブロック 使用 使用可 使用% マウント位置 /dev/mapper/vg_00-LogVol00 10321208 717572 9079348 8% / tmpfs 510284 0 510284 0% /dev/shm /dev/vda1 198337 27054 161043 15% /boot /dev/mapper/vg_00-LogVol02 20642428 194284 19399568 1% /var ※LVM物理ボリュームのボリュームグループ名は「vg_00」 ※スワップはLogVol01にある
LVMのスナップショットを取得
この構成のサーバーでは、LVM物理ボリューム(PV)上に空き領域があればとくに追加の作業をすることなく稼働中の任意のタイミングでスナップショットを取得できる。LVM物理ボリューム(PV)に空き領域があるか、pvscanコマンドで確認しておこう。
# pvscan PV /dev/vda2 VG vg_00 lvm2 [99.80 GiB / 67.80 GiB free] Total: 1 [99.80 GiB] / in use: 1 [99.80 GiB] / in no VG: 0 [0 ]
1行目の最後のfreeで60GB以上空きがあることがわかる。
一方、LVM論理ボリュームの状態はlvscanコマンドで確認できる。
# lvscan ACTIVE '/dev/vg_00/LogVol01' [2.00 GiB] inherit ACTIVE '/dev/vg_00/LogVol00' [10.00 GiB] inherit ACTIVE '/dev/vg_00/LogVol02' [20.00 GiB] inheritdfコマンドとの対比でも確認できるように、/dev/vg_00/LogVol02が/varに該当するパーティションである。空き領域がある状態が確認でき、ターゲットのボリューム名も確認できたら、lvcreateコマンドを使ってスナップショットを取得すればOKだ。
# lvcreate -s -L 4G -n snap /dev/vg_00/LogVol02
「-s」(もしくは「–snapshot」)でスナップショットを取得することになり、「-L」(「–size」)でスナップショット(稼働ボリュームとの差分)を保管する領域のサイズを指定する。20GBの領域(/var)が対象であれば4GBもあれば十分だ。「-n」(「–name」)はボリューム名となる。最後にスナップショット対象のボリューム名を指定する。
スナップショットを取得した後のlvscanコマンドの実行例は以下のようになる。
# lvscan ACTIVE '/dev/vg_00/LogVol01' [2.00 GiB] inherit ACTIVE '/dev/vg_00/LogVol00' [10.00 GiB] inherit ACTIVE Original '/dev/vg_00/LogVol02' [20.00 GiB] inherit ACTIVE Snapshot '/dev/vg_00/snap' [4.00 GiB] inherit
新しいスナップショット用のLVM論理ボリュームとして/dev/vg_00/snapが確保されていることがわかる。
LVMのスナップショットをマウントしてバックアップを行う
スナップショットのボリュームを任意のディレクトリにマウントすれば、lvcreateを実行した時点の/varの状態を参照できるようになる。
# mount -o ro /dev/vg_00/snap /mnt # mount : : /dev/mapper/vg_00-snap on /mnt type ext4 (ro)
この状態で/mntにはスナップショットを作成した時点における/var以下のファイルやディレクトリが格納されている。
あとは/mntにある必要なディレクトリやファイルをほかのサーバーや手元のマシンにコピーすれば良い。同期コピー定番のrsyncを使って/var/logのバックアップを取得する例は以下のようになる。
# rsync -auv --delete -e ssh /mnt/log VPS3:/backup/
/mnt/logは/var/logディレクトリのスナップショットとなっており、/var/logをVPS3(ここにはIPアドレスかホスト名)マシンの/backupディレクトリ以下に同期コピーをしていることになる。マシン間の接続にはSSH(-e ssh)を使っている。
なお、最小インストール構成などではrsyncやSSHクライアントがインストールされていない場合もあるので、そのようなときはあらかじめそれぞれをインストールしておく。CentOSの場合は、以下のコマンドを実行しておけば良い。
# yum -y install rsync openssh-clients
スナップショットの削除
バックアップが終わったらスナップショットは必要なくなるので削除する。/mntからアンマウントし、lvremoveコマンドでスナップショットボリュームを指定する。
# umount /mnt # lvremove /dev/vg_00/snap Do you really want to remove active logical volume snap? [y/n]: y Logical volume "snap" successfully removed
以上でLVMのスナップショットを利用したバックアップ作業は完了である。
SSHの鍵認証による自動接続
標準状態では、rsync実行時にパスワード認証を行って接続しているだろう。実際の運用ではスクリプトなどで自動化するので、一連のバックアップ動作を確認できたらSSHの鍵認証による接続を設定しておくのが良い。詳細は省略するが、たとえば、CentOS同士であれば最低限以下の作業手順だけで鍵認証による接続が行えるようになる。
●VPS3(ファイルを保管する側)で公開鍵を置く場所を作る # cd # mkdir .ssh ●VPS1 or VPS2(バックアップ対象)で鍵を生成し、VPS3に公開鍵を転送 # cd # ssh-keygen # scp .ssh/id_rsa.pub VPS3:/root/.ssh/ ●VPS3で鍵を設定する # touch authorized_keys (ファイルがなければ) # cat id_rsa.pub >> authorized_keys # rm id_rsa.pub
この状態で前述のrsyncを実行すると、パスワードを入力することなく即時に同期コピーが行われる。
あとは、接続可能なIPアドレスを限定したりパスワード認証を無効化したりしてセキュリティを強化したり、バックアップの専用ユーザーを作成するなど、用途にあわせて環境を整備しておこう。
VPSでの運用を工夫していく
本記事で紹介したスナップショット機能では現在VPSの外にイメージを取り出せないが、これを外部ストレージに保管できるようにすることや、追加IPアドレスについても検討されている。今後もユーザーの要望などに応じて新しい機能が追加され、運用の幅が広がっていくだろう。
VPSで高度な冗長性の確保というのは難しいが、レンタルDNSとスナップショット機能があることで、このように費用をかなり抑えながら現実的な運用構成を考えられる。コストパフォーマンスの高いメモリ2GBプランの複数台構成が魅力的な解ではあるが、手頃なメモリ1GBプランや15日のお試しを活用して、実際に複数台構成も試してみてはいかがだろうか。