MAGAZINE

ルーターマガジン

インフラ/運用

LVMスナップショットによるバックアップと別ホストへのリストア

2023.08.02
Pocket

こんにちは、エンジニアの増田です。弊社の一部システムではプロダクション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で優先度を落としてあげると良いかもしれません。ビッグデータを扱う弊社ならではのバックアップ・リストアに関する共有でした。

Pocket

CONTACT

お問い合わせ・ご依頼はこちらから