MAGAZINE
ルーターマガジン
LVMスナップショットによるバックアップと別ホストへのリストア
こんにちは、エンジニアの増田です。弊社の一部システムではプロダクションDBのデータをmysqldump
を利用してバックアップし、ステージングDBへリストアしております。データ量が増えるに連れてバックアップ・リストア共に時間がかかることが課題となっています。その課題を解決すべく、LVMのLVスナップショットでバックアップをとり、別ホストへリストアする手順をご紹介します。
環境
- OS:CentOS Linux release 7.7.1908 (Core)
- ファイルシステム:XFS
- LV用ディスク:/dev/sdb(10GB)
- コピー元:snapshot-test
- コピー先:snapshot-test-2
手順
1. PV(物理ボリューム)の作成
まずはコピー元のマシンでPVを作成します。
[user@snapshot-test ~]# pvcreate /dev/sdb
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
Physical volume "/dev/sdb" successfully created.
pvdisplay
で確認できます。
[user@snapshot-test ~]# pvdisplay
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
"/dev/sdb" is a new physical volume of "10.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb
VG Name
PV Size 10.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID lQMTbz-AWoG-kMNp-CD6Z-56Xm-dSeS-vza9tf
2. VG(ボリュームグループ)の作成
次にVGを作成しましょう。先程作成したPVをこれから作るVGに割り当てます。
[user@snapshot-test ~]# vgcreate lvm-from /dev/sdb
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
Volume group "lvm-from" successfully created
[user@snapshot-test ~]# vgdisplay
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
--- Volume group ---
VG Name lvm-from
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size <10.00 GiB
PE Size 4.00 MiB
Total PE 2559
Alloc PE / Size 0 / 0
Free PE / Size 2559 / <10.00 GiB
VG UUID L4u3su-eeJw-pc4i-htIF-oaps-H9tu-kY4t9F
3. LV(論理ボリューム)の作成
次にバックアップ対象となるデータが入る、LVを作成します。本記事ではこのコピー元もLVをオリジナルLVと呼びます。スナップショット領域のストレージを残しておくために、空き容量の50%をオリジナルLVに割り当てます。
[user@snapshot-test ~]# lvcreate -n original -l 50%FREE lvm-from
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
Logical volume "original" created.
[user@snapshot-test ~]# lvdisplay
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
--- Logical volume ---
LV Path /dev/lvm-from/original
LV Name original
VG Name lvm-from
LV UUID 88RBvG-F0KE-gc0j-evLf-wJPm-cfof-FlM200
LV Write Access read/write
LV Creation host, time snapshot-test, 2023-07-25 19:08:52 +0900
LV Status available
# open 0
LV Size <5.00 GiB
Current LE 1279
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
4. 作成したオリジナルLVをマウント
[user@snapshot-test ~]# mkdir /mnt
[user@snapshot-test ~]# mkdir /mnt/{original,snap}
[user@snapshot-test ~]# mkfs.xfs /dev/lvm-from/original
meta-data=/dev/lvm-from/original isize=512 agcount=4, agsize=327424 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=1309696, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[user@snapshot-test ~]# mount -t xfs /dev/mapper/lvm--from-original /mnt/original/
[user@snapshot-test ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 476M 0 476M 0% /dev
tmpfs tmpfs 487M 0 487M 0% /dev/shm
tmpfs tmpfs 487M 1.6M 485M 1% /run
tmpfs tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 xfs 15G 6.6G 8.5G 44% /
tmpfs tmpfs 98M 0 98M 0% /run/user/0
/dev/mapper/lvm--from-original xfs 5.0G 33M 5.0G 1% /mnt/original
5. ダミーデータの作成
先程マウントしたディレクトリに移動して、ダミーデータを作成します。
[user@snapshot-test ~]# dd if=/dev/zero of=/mnt/original/test bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 0.820655 s, 1.3 GB/s
[user@snapshot-test ~]# ls -lh /mnt/original/
total 1000M
-rw-r--r-- 1 root root 1000M Jul 25 19:14 test
6. スナップショット作成
スナップショットを作成します。
[user@snapshot-test ~]# lvcreate -s -l 100%FREE -n snap /dev/lvm-from/original
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
Logical volume "snap" created.
lvscan
で確認しましょう。Original,
SnapshotともにActiveですね。
[user@snapshot-test ~]# lvscan
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
ACTIVE Original '/dev/lvm-from/original' [<5.00 GiB] inherit
ACTIVE Snapshot '/dev/lvm-from/snap' [5.00 GiB] inherit
snapをマウントしてみます。このときoriginalと同時にはマウントできないので、アンマウント解除します。(なんでunmountじゃないんでしょうか、、) originalで作成した1,000MBのtestファイルが存在することを確認できました!バックアップ成功です。スナップショットの作成は一瞬でした。
[user@snapshot-test ~]# umount /dev/mapper/lvm--from-original
[user@snapshot-test ~]# mount -t xfs /dev/mapper/lvm--from-snap /mnt/snap/
[user@snapshot-test ~]# ls -lh /mnt/snap/
total 1000M
-rw-r--r-- 1 root root 1000M Jul 25 19:14 test
オリジナルLVをマウントするように戻しておきます。
[user@snapshot-test ~]# umount /dev/mapper/lvm--from-snap
[user@snapshot-test ~]# mount -t xfs /dev/mapper/lvm--from-original /mnt/original/
[user@snapshot-test ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 476M 0 476M 0% /dev
tmpfs tmpfs 487M 0 487M 0% /dev/shm
tmpfs tmpfs 487M 1.5M 485M 1% /run
tmpfs tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 xfs 15G 6.6G 8.5G 44% /
tmpfs tmpfs 98M 0 98M 0% /run/user/0
/dev/mapper/lvm--from-original xfs 5.0G 1.1G 4.0G 21% /mnt/original
コピー元での作業は終わりです。コピー先に移動します。
7. コピー先でデータコピー先となる領域LVを作成
コピー先にコピー元のスナップショットを移してくるLVを作成します。このときコピー元のスナップショットLVと同じサイズに揃えないと、コピー先のサイズに上書きされるので注意。
[user@snapshot-test-2 ~]# vgdisplay
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
[user@snapshot-test-2 ~]# vgcreate lvm-to /dev/sdb
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
Volume group "lvm-to" successfully created
[user@snapshot-test-2 ~]# lvcreate -n original2 -l 1279 lvm-to
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
WARNING: xfs signature detected on /dev/lvm-to/original2 at offset 0. Wipe it? [y/n]: y
Wiping xfs signature on /dev/lvm-to/original2.
Logical volume "original2" created.
lvdisplay
で確認しましょう。
[user@snapshot-test-2 ~]# lvdisplay
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
--- Logical volume ---
LV Path /dev/lvm-to/original2
LV Name original2
VG Name lvm-to
LV UUID OPzcKD-gy55-cIpZ-EeJh-YDyY-eCDf-PxasUW
LV Write Access read/write
LV Creation host, time snapshot-test-2, 2023-07-25 19:23:03 +0900
LV Status available
# open 0
LV Size <5.00 GiB
Current LE 1279
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
これで準備完了です。次にリストアを行います。
8. コピー元からのリストア
今からスナップショットをコピー先に持ってきます。このときコピー先に書き込みが入らないようにアンマウントしておきましょう。
[user@snapshot-test-2 ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 476M 0 476M 0% /dev
tmpfs tmpfs 487M 0 487M 0% /dev/shm
tmpfs tmpfs 487M 1.5M 485M 1% /run
tmpfs tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 xfs 15G 1.6G 14G 11% /
tmpfs tmpfs 98M 0 98M 0% /run/user/0
コピー先(今作業しているマシン)からコピー元(スナップショット作成したマシン)へsshでリモートのddコマンドを実行します。その出力をパイプでコピー先がリストア先のLVに書き出す。 if(input file):スナップショットLV path of(output file):コピー先のLV path
コピーに時間がかかるのでtmuxセッション内での実行やバックグラウンド実行をおすすめします。
[user@snapshot-test-2 /]# ssh guest@ip_address "dd if=/dev/mapper/lvm--from-snap" | dd of=/dev/mapper/lvm--to-original2
リストア進捗を確認したいときは、コピー元もしくはコピー先のマシンで以下のコマンドを実行してください。
[user@snapshot-test-2 ~]# pkill -USR1 dd
すると、標準出力に何%まで書き込みが完了したかが表示されます。
700145+0 records in
700145+0 records out
358474240 bytes (358 MB) copied, 48.3879 s, 7.4 MB/s
5GBで14分ほどかかりました。(わりと時間がかかっているのは環境要因もありそうです。)
10477568+0 records in
10477568+0 records out
5364514816 bytes (5.4 GB) copied, 836.689 s, 6.4 MB/s
9. データの確認
マウントして正しく移行できているかを確認します。
[user@snapshot-test-2 mnt]# mount /dev/mapper/lvm--to-original2 /mnt/original2
[user@snapshot-test-2 mnt]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 476M 0 476M 0% /dev
tmpfs tmpfs 487M 0 487M 0% /dev/shm
tmpfs tmpfs 487M 1.5M 485M 1% /run
tmpfs tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 xfs 15G 1.6G 14G 11% /
tmpfs tmpfs 98M 0 98M 0% /run/user/0
/dev/mapper/lvm--to-original2 xfs 5.0G 1.1G 4.0G 21% /mnt/original2
[user@snapshot-test-2 mnt]# ls -lh /mnt/original2/
total 1000M
-rw-r--r-- 1 root root 1000M Jul 25 19:14 test
1,000MBのtestファイルが持ってこれています!
最後に
なかなかこれほど低レイヤーの技術を触ることがなかったのでいい経験になりました。ddコマンドでデータを書き込むときにはサービスに影響のないように、niceで優先度を落としてあげると良いかもしれません。ビッグデータを扱う弊社ならではのバックアップ・リストアに関する共有でした。
CONTACT
お問い合わせ・ご依頼はこちらから