サーバ運用の要の1つであるバックアップの取得方法です。
一昔前までは、データの整合性を保つため、Linuxをシングルユーザモードで起動してバックアップを取得する必要があり
シングルユーザモードで起動するため、バックアップ取得中はサービスの停止を余儀なくされていました。
最近のLinuxではLVM(Logical Volume Manager:論理ボリュームマネージャ)が採用されており
LVMのスナップショット機能を使うことでサービスを停止することなくバックアップ(オンラインバックアップ)を取得できるようになりました。
今回もCentOS7を使って設定します。
CentOS7からファイルシステムにxfsが採用されたのでバックアップコマンドは dump ではなく xfsdump コマンドを利用します。
0. LVMとスナップショットについて
スナップショットを利用するにあたり、まずLVMについて理解する必要があります。
LVMは下記で構成されています。
- 物理ボリューム(physical volume)
- 論理ボリュームグループ(volume group)
- 論理ボリューム(logical volume)
構成のイメージは
です。
スナップショットの格納先は、論理ボリュームグループの未使用スペースを使います。
もし未使用スペースが無い場合は、
- 論理ボリュームグループを拡張する
- 論理ボリュームを縮小する
- Linuxインストール時に未使用スペースを確保した構成にする
のいづれかの方法で確保してください。(別途解説します)
未使用スペースの容量は、スナップショットを取得する論理ボリュームの10%から20%程度です。
(ファイルの更新頻度やスナップショットの保持期間によってはさらに必要となる場合があります)
今回は論理ボリュームグループに22.51GBの未使用がある構成を利用します。
# vgdisplay
--- Volume group ---
VG Name VolGroup01
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 3
Open LV 3
Max PV 0
Cur PV 1
Act PV 1
VG Size 99.51 GiB
PE Size 4.00 MiB
Total PE 25474
Alloc PE / Size 19712 / 77.00 GiB
Free PE / Size 5762 / 22.51 GiB
VG UUID ymDTJH-QJmj-OHAo-QNNv-FPal-7fiV-xyZdJb
1. スナップショットの取得
早速スナップショットを取得してみます。
現在の論理ボリュームはこちらです。
# lvscan
ACTIVE '/dev/VolGroup01/root' [25.00 GiB] inherit
ACTIVE '/dev/VolGroup01/swap' [2.00 GiB] inherit
ACTIVE '/dev/VolGroup01/home' [50.00 GiB] inherit
/dev/VolGroup01/root と/dev/VolGroup01/home のスナップショットを取得します。
スナップショットのサイズは、今回はざっくり5GB( -L 5G )としました。
実際に運用する際は、ファイルの更新頻度やスナップショットの保持期間にあわせて調整してください。
# lvcreate -s -L 5G -n root_snap /dev/VolGroup01/root
Logical volume "root_snap" created.
# lvcreate -s -L 5G -n home_snap /dev/VolGroup01/home
Logical volume "home_snap" created.
Snapshotが増えていれば取得完了です。
# lvscan
ACTIVE Original '/dev/VolGroup01/root' [25.00 GiB] inherit
ACTIVE '/dev/VolGroup01/swap' [2.00 GiB] inherit
ACTIVE Original '/dev/VolGroup01/home' [50.00 GiB] inherit
ACTIVE Snapshot '/dev/VolGroup01/root_snap' [5.00 GiB] inherit
ACTIVE Snapshot '/dev/VolGroup01/home_snap' [5.00 GiB] inherit
2. nfsサーバの準備
バックアップファイルをnfsサーバに格納するため事前にnfsサーバを構築します。
必要なパッケージをインストールします。
# yum install nfs-utils
idmapd.conf ファイル内の記述を自ドメインに修正します。
# vi /etc/idmapd.conf
[General]
#Domain = local.domain.edu
Domain = localdomain # 追加します。
バックアップデータを保存するディレクトリを作成します。
# mkdir /backup
共有するディレクトリを指定します。
# vi /etc/exports
/backup 192.168.24.0/24(rw,wdelay,no_root_squash,no_subtree_check)
no_root_squash はrootでマウントするためです。
NFS サービスを起動します。
# systemctl start nfs-server
# systemctl enable nfs-server
3. バックアップの取得
nfsサーバの共有ディレクトリをマウントします。
# mkdir /backup
# mount -t nfs 192.168.24.63:/backup /backup
xfsdumpコマンドを使ってバックアップを取得します。
まずはディスク構成情報を出力します。
# fdisk -l > /backup/fdisk.txt
# df -k > /backup/df.txt
# pvdisplay > /backup/pv.txt
# vgdisplay > /backup/vg.txt
# lvdisplay > /backup/lv.txt
# cat /etc/fstab > /backup/fstab.txt
# ls -l /dev/disk/by-uuid/ > /backup/uuid.txt
スナップショットを一旦マウントします。マウントしないとバックアップができません。
参考:xfsdumpでdoes not identify a file system
# mkdir /mnt/root_snap
# mkdir /mnt/home_snap
# mount -t xfs -o ro,nouuid /dev/VolGroup01/root_snap /mnt/root_snap
# mount -t xfs -o ro,nouuid /dev/VolGroup01/home_snap /mnt/home_snap
/boot のデバイスを確認します。
# mount | grep /boot
/dev/sda1 on /boot type xfs (rw,relatime,attr2,inode64,noquota)
/boot、/root、/homeのバックアップを取得します。
# xfsdump -J -l 0 - /dev/sda1 2>> backup_boot.log | cat | gzip > /backup/boot.dump.gz
# xfsdump -J -l 0 - /dev/VolGroup01/root_snap 2>> backup_root.log | cat | gzip > /backup/root.dump.gz
# xfsdump -J -l 0 - /dev/VolGroup01/home_snap 2>> backup_home.log | cat | gzip > /backup/home.dump.gz
ログファイルが出力されますので内容を確認します。
ステータスが
xfsdump: Dump Status: SUCCESS
となっていればバックアップ処理が完了です。
4. 後処理
マウントした各スナップショットを解除します。
# umount /mnt/root_snap/
# umount /mnt/home_snap/
スナップショットを削除します。
# lvremove /dev/VolGroup01/root_snap
Do you really want to remove active logical volume root_snap? [y/n]: y
Logical volume "root_snap" successfully removed
# lvremove /dev/VolGroup01/home_snap
Do you really want to remove active logical volume home_snap? [y/n]: y
Logical volume "home_snap" successfully removed
スナックショットが削除されていることを確認します。
# lvscan
ACTIVE '/dev/VolGroup01/root' [25.00 GiB] inherit
ACTIVE '/dev/VolGroup01/swap' [2.00 GiB] inherit
ACTIVE '/dev/VolGroup01/home' [50.00 GiB] inherit
お疲れ様でした。