【お題3】 LVMスナップショットによるバックアップ

・2TBのスナップショット取得も一瞬?

→1TBのデータが居るソースボリュームの場合0.5秒未満。ただし、ソースボリュームが書き込み中だった場合は10秒くらい。

 

【お題4】 LVMスナップショットボリュームに対するrsyncによる増分バックアップで前日との重複ブロックは除外されるか?

→重複排除はブロック単位ではなくファイル単位なので、変更があったファイルを構成する重複ブロックは除外されずコピーされる。

 

【お題5】 LVMスナップショットとバックアップ元のdirtyキャッシュの関係

・ファイルがまだdirtyな状態でLVMスナップショットを取得した場合、LVMスナップショットをマウントしたらdirtyなファイルのステータス、read/writeの可否は?

→リニアソースボリュームもシンボリュームも連続でデータ書き込み中にスナップショット取得すると書き込み中データはDirtyキャッシュ反映はされるが書き込み途中のファイルの断面が取得されるので壊れる。【お題5~6】 LVMスナップショットの静止点参照

 

【お題6】 LVMスナップショットをlvcreate -sコマンドで取得した時点でディスク書き込み継続中だったプロセスが存在した場合のlvcreate -sコマンドの実行時間

※例えば、ディスク書き込み開始から完了まで1分かかるプロセスがあって、この書き込みが30秒経過した時点でlvcreate -sコマンドを発行すると、lvcreate -sはこの書き込みが完了するまでの30秒間待ってからスナップショットボリュームを作成するのか?下記の場合で調べる

1.メモリにファイルマッピングしないでファイルにデータを書き込むプロセス

・単独のプロセスがページキャッシュに連続書き込みしてる最中にlvcreate -s

①メモリ容量が4GBくらいのVMで10GBくらいのファイルをcpコマンドでコピーしてcpコマンドのexitコードが返ってくる前にlvcreate -sを実行して確認する。

 

・単独のプロセスがページキャッシュへの書き込みが完了してからkernelがページキャッシュからディスクにwrite backしてる最中にlvcreate -s

①メモリ容量が4GBくらいのVMで10GBくらいのファイルをcpコマンドでコピーしてcpコマンドのexitコードが返ってきてからkernelのDirtyキャッシュが捌けきるまでの間に、lvcreate -sを実行して確認する。

 

・親プロセスから子プロセスが生成と消滅を繰り返しながら子プロセスがファイルにデータを追記していくプロセス

①bashのforループ内でecho hoge > fileを10秒おきに10回実行するスクリプトをバックグラウンドで実行してる最中に、lvcreate -sを実行する。

 

2.メモリにファイルマッピングしてファイルにデータを書き込むプロセス

・単独のプロセスがページキャッシュに連続書き込みしてる最中にlvcreate -s

 

・単独のプロセスがページキャッシュへの書き込みが完了してからkernelがページキャッシュからディスクにwrite backしてる最中にlvcreate -s

 

 

★openしっぱなし共有ファイルに1分間の間に複数のプロセスから都度書き込まれる場合

 

★書き込むたびにopenとcloseされる共有ファイルに1分間の間に複数のプロセスから都度書き込まれる場合

 

→データ書き込み中にスナップショットを取得した場合10秒くらいかかる【お題5~6】 LVMスナップショットの静止点スナップショットを取得中、元のファイルシステムに対する書き込み性能がガタ落ちするか? その2参照

 

 

 

【お題7】 LVM2レガシースナップショットボリュームの容量がオーバーしたらどうなるか

→スナップショットボリュームがマウントできなくなる。ソースボリュームは無害

→ソースボリュームは無害。スナップショットボリュームは壊れる。以後マウントできなくなる。

スナップショットを取得している間、元のファイルシステムに対する書き込み性能がガタ落ちするか?参照

 

【お題8】 LVM2シンプロスナップショットボリュームのシンプロプールの容量がオーバーしたらどうなるか

→ディスクフルと同じでそれ以上の書き込みができなくなる。シンソースボリュームもシンスナップボリュームと同じシンプールを使用している場合、シンソースボリュームも同様に書き込みできなくなる。シンスナップショットボリュームがサイズ上限に達したらどうなるか参照

※シンプールのデータだけでなくメタデータがオーバーフローした場合、同じシンプールを共有するシンボリュームやシンスナップショットボリュームに書き込みできなくなる!

→監視してアラート飛ばす必要があるぷに

 

 

【お題9】 LVMスナップショットボリュームに対するバックアップの速度比較

1.レガシースナップショット+rsync

2.レガシースナップショット+xfsdump

3.シンスナップショット+rsync

.シンスナップショット+xfsdump

【お題3.5】1TBのファイルのコピー時間 その1【お題3.5】1TBのファイルのコピー時間 その2参照

 

【お題10】 MongoDBデータオンラインバックアップにLVMスナップショットボリュームとrsync(xfsdump)を使った増分バックアップの諸検証

1.MongoDBオンラインバックアップに関する考察

・collectionファイル内の1ドキュメントが変更した場合でもrsyncではファイル単位で増分コピーになるか?

・MongoDBの静止点とは?「トランザクションとか)

・MongoDBのチェックポイントとは?

・MongoDBのVer.4以前と以降の違い

・RDB(PostgreSQL)の静止点とMongoDBの静止点の考え方の違いの考察

2.Linuxファイルシステムの静止点の復習

・fsfreezeコマンドの動作

・lvmスナップショットの動作

・Linux kernelのwriteIOの復習

3.上記1.と2.を踏まえたMongoDBオンラインバックアップをLVMスナップショットなどで静止点を取得して行うことの有効性と問題点について考察

㊥【お題10】 MongoDBデータオンラインバックアップの諸検証以降参照

 

 

 

【お題3.5】1TBのファイルのコピー時間 その1の続き

3.シンスナップショットボリュームからリニアボリュームへのコピー時間

※シンスナップショットのソースボリュームがリニアボリュームの場合とシンボリュームの場合がある。

今回はソースボリュームがリニアボリュームの場合をA

ソースボリュームがシンボリュームの場合をBとする。

※xfsdumpはレベル0~9までの増分バックアップを毎日取得した場合、最低でも10日に一回はフルバックアップする必要があるのでフルバックアップ量が膨大で週末などの時間内(72時間とか)に終わらない場合使えない。

 

A.ソースボリュームがリニアボリュームの場合

※ソースボリュームがリニアボリュームでスナップショットボリュームがシンスナップショットボリュームのケース

ただし、この場合、シンスナップショットボリュームが作成されている間はソースリニアボリュームはread-onlyなので書き込みできない。

【準備】

# lvs
   LV              VG  Attr       LSize   Pool          Origin     Data%  Meta%  Move Log Cpy%Sync Convert
  home            cl  -wi-ao---- 173.87g
  root            cl  -wi-ao----  50.00g
  swap            cl  -wi-ao----   7.81g
  1TBthin_snap1   dst Vwi---tz-k   2.00t big_thinpool  dst_thinlv
  big_thinpool    dst twi-aotz--   2.44t                          40.30  20.04
  dst_thinlv      dst Vwi-aotz--   2.00t big_thinpool             49.20
  testlv_bk       dst -wi-a-----  30.00g
  src_2TB_linerlv src -wi-ao----   2.00t
  test_thinpool   src twi-aotz--  10.00g                          0.10   0.68
  testlv          src -wi-ao---- 200.00g            ←ソースリニアボリューム
  thin_snap       src Vwi-a-tz-k   5.00g test_thinpool thinlv_1   0.00
  thinlv_1        src Vwi-a-tz--   5.00g test_thinpool            0.21

 

・リニアボリューム(src/testlv)を外部デバイスとしてシンプール(src/test_thinpool)からシンスナップショットボリューム(src/thin_snap2)を作成する。

# lvcreate -n thin_snap2 -s src/testlv --thinpool src/test_thinpool
  Using default stripesize 64.00 KiB.
  Cannot use writable LV as the external origin.

# lvchange -pr src/testlv            ←testlvリニアボリュームを読み取り専用に変更
  Logical volume src/testlv changed.
# lvs src/testlv
  LV     VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  testlv src -ri-ao---- 200.00g

# lvcreate -n thin_snap2 -s src/testlv --thinpool src/test_thinpool
  Using default stripesize 64.00 KiB.
  Cannot use active LV for the external origin.

# lvchange -an src/testlv               ←testlvリニアボリュームを非アクティブ化
  Logical volume src/testlv contains a filesystem in use.     ←testlvリニアボリュームがマウント中なので怒られた
# mount | grep testlv
/dev/mapper/src-testlv on /src type xfs (ro,relatime,seclabel,attr2,inode64,noquota)
# umount /src
# lvchange -an src/testlv
# lvs src/testlv

  LV     VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  testlv src -ri------- 200.00g                    
 ←testlvリニアボリュームが非アクティブになった
# lvcreate -n thin_snap2 -s src/testlv --thinpool src/test_thinpool
  Using default stripesize 64.00 KiB.
  WARNING: Sum of all thin volume sizes (210.00 GiB) exceeds the size of thin pool src/test_thinpool (10.00 GiB)!
  For thin pool auto extension activation/thin_pool_autoextend_threshold should be below 100.
  Logical volume "thin_snap2" created.

→リニアソースボリュームを外部デバイスとしてシンボリュームからシンスナップショットが作成された

※シンプールの外部ボリューム(今回はソースリニアボリューム)からシンスナップショットボリュームを作成する時点で、ソースボリュームは、非アクティブでかつ読み取り専用でないといけない。

また、シンスナップショット取得後は、ソースボリュームをアクティブ化できるが、スナップショットを削除するまで書き込み可のステータスにはできない。ソースボリュームをアクティブ化してマウントできるが読み取り専用でしかマウントできない。

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/configuring_and_managing_logical_volumes/creating_thinly_provisioned_snapshot_volumes

 


# lvs | grep testlv
  testlv_bk        dst -wi-a----- 30.00g
  testlv           src ori------- 200.00g
  thin_snap2      src Vwi-a-tz-- 200.00g test_thinpool testlv     0.00

# mkdir /thin_snap2
# mount /dev/src/thin_snap2 /thin_snap2
# ll /thin_snap2

合計 4
drwxr-xr-x. 25 root root 4096  9月  7 04:59 1

→ソースボリュームが非アクティブでもスナップショットボリュームをマウントできる。

# ll /dev/src/testlv
ls: /dev/src/testlv にアクセスできません: そのようなファイルやディレクトリはありません
→非アクティブな論理ボリュームはOSに認識されていない状態

# ll /dev/src/thin_snap2
lrwxrwxrwx. 1 root root 8  9月 14 13:43 /dev/src/thin_snap2 -> ../dm-11

→ソース論理ボリュームが非アクティブでもそのスナップショットボリュームだけはアクティブな状態にできる

# echo hoge > /thin_snap2/hoge
# cat /thin_snap2/hoge

hoge
→シンスナップショットボリュームに書き込みもできる。

# lvchange -ay src/testlv        ←testlvリニアボリュームをアクティブ化
# lvchange -prw src/testlv
  Cannot change permissions of external origin src/testlv.
→シンスナップショットが存在しているリニアソースボリュームを書き込み可にできない。

# mount -o nouuid /dev/src/testlv /src  ←同じuuidのスナップショットボリュームを先にマウントしているので
mount: /dev/mapper/src-testlv is write-protected, mounting read-only
# mount | grep testlv
/dev/mapper/src-testlv on /src type xfs (ro,relatime,seclabel,nouuid,attr2,inode64,noquota)
# ll /src
合計 4
drwxr-xr-x. 25 root root 4096  9月  7 04:59 1

※ちなみに論理ボリュームのUUIDではなくブロックデバイスのUUID

# lvdisplay src/thin_snap2 | grep -i uuid
  LV UUID                OiCF5Z-xPDK-UmyF-oEGp-I2Xg-Nyip-J2ECQM
# lvdisplay src/testlv | grep -i uuid
  LV UUID                sX712a-TAmM-Nou2-5qBH-uH2k-YvA9-SAZXW9

# ll /dev/src/testlv
lrwxrwxrwx. 1 root root 8  9月 14 14:13 /dev/src/testlv -> ../dm-12

# ll /dev/src/thin_snap2
lrwxrwxrwx. 1 root root 8  9月 14 13:43 /dev/src/thin_snap2 -> ../dm-11

# ll /dev/disk/by-uuid/
合計 0
lrwxrwxrwx. 1 root root 11  9月 14 14:13 3b5cfd1b-cb1b-4acd-9da6-e2fb2e09b4f0 -> ../../dm-12
lrwxrwxrwx. 1 root root 11  9月 14 13:15 4c6a5945-6370-4898-8605-2b85e0857faf -> ../../dm-17
lrwxrwxrwx. 1 root root 11  9月 14 06:03 52fa371a-f59d-409e-8cb6-43ca53dfdedd -> ../../dm-18
lrwxrwxrwx. 1 root root 10  9月  7 03:35 7783-8DA5 -> ../../sda1
lrwxrwxrwx. 1 root root 10  9月  7 03:35 7c253e80-5c65-4c17-99f3-1ca6b21a5034 -> ../../dm-2
lrwxrwxrwx. 1 root root 10  9月  7 03:35 81803b90-e8e3-4505-be6f-554cd218c4e9 -> ../../dm-1
lrwxrwxrwx. 1 root root 10  9月 10 18:05 99d185bc-c8fe-4753-b579-bdbb0362052a -> ../../dm-9
lrwxrwxrwx. 1 root root 10  9月  7 03:35 ab72024a-956e-4a75-bebe-d06c88587cf0 -> ../../dm-0
lrwxrwxrwx. 1 root root 10  9月  7 03:35 c3e5a506-7f4d-4790-b0fb-a6256d7f59bd -> ../../sda2

# umount /src

# lvchange -an src/testlv
# ll /dev/src/testlv

ls: /dev/src/testlv にアクセスできません: そのようなファイルやディレクトリはありません
# ll /dev/src/thin_snap2
lrwxrwxrwx. 1 root root 8  9月 14 13:43 /dev/src/thin_snap2 -> ../dm-11

# ll /dev/disk/by-uuid/
合計 0
lrwxrwxrwx. 1 root root 11  9月 14 14:22 3b5cfd1b-cb1b-4acd-9da6-e2fb2e09b4f0 -> ../../dm-11
lrwxrwxrwx. 1 root root 11  9月 14 13:15 4c6a5945-6370-4898-8605-2b85e0857faf -> ../../dm-17
lrwxrwxrwx. 1 root root 11  9月 14 06:03 52fa371a-f59d-409e-8cb6-43ca53dfdedd -> ../../dm-18
lrwxrwxrwx. 1 root root 10  9月  7 03:35 7783-8DA5 -> ../../sda1
lrwxrwxrwx. 1 root root 10  9月  7 03:35 7c253e80-5c65-4c17-99f3-1ca6b21a5034 -> ../../dm-2
lrwxrwxrwx. 1 root root 10  9月  7 03:35 81803b90-e8e3-4505-be6f-554cd218c4e9 -> ../../dm-1
lrwxrwxrwx. 1 root root 10  9月 10 18:05 99d185bc-c8fe-4753-b579-bdbb0362052a -> ../../dm-9
lrwxrwxrwx. 1 root root 10  9月  7 03:35 ab72024a-956e-4a75-bebe-d06c88587cf0 -> ../../dm-0
lrwxrwxrwx. 1 root root 10  9月  7 03:35 c3e5a506-7f4d-4790-b0fb-a6256d7f59bd -> ../../sda2

# df -h /thin_snap2
ファイルシス               サイズ  使用  残り 使用% マウント位置
/dev/mapper/src-thin_snap2   200G   43G  158G   22% /thin_snap2

 

・コピー先のリニアボリューム(dst/testlv_bk)を200GBに拡張する。

# lvextend -L 200g dst/testlv_bk
  WARNING: Sum of all thin volume sizes (4.00 TiB) exceeds the size of thin pools and the size of whole volume group (2.73 TiB)!
  For thin pool auto extension activation/thin_pool_autoextend_threshold should be below 100.
  Size of logical volume dst/testlv_bk changed from 30.00 GiB (7680 extents) to 200.00 GiB (51200 extents).
  Logical volume dst/testlv_bk successfully resized.

# lvs dst/testlv_bk
  LV        VG  Attr         LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  testlv_bk dst -wi-a----- 200.00g

# mkfs.xfs /dev/dst/testlv_bk

# mkdir /testlv_bk
# mount /dev/dst/testlv_bk /testlv_bk

# df -h /testlv_bk
ファイルシス              サイズ  使用  残り 使用% マウント位置
/dev/mapper/dst-testlv_bk   200G   33M  200G    1% /testlv_bk

3-A-1.cpコマンドでコピー

# echo 3 > /proc/sys/vm/drop_caches

# time cp -r /thin_snap2/* /testlv_bk/

real    8m31.892s           ←レガシースナップショットからのコピーより時間がかかった?
user    0m1.571s
sys     1m19.200s

3-A-2.tarコマンドでアーカイブ

# echo 3 > /proc/sys/vm/drop_caches

# time tar cf /testlv_bk/thin_snap.tar /thin_snap2

----(略)----

real    9m18.667s          ←レガシースナップショットからのコピーより時間がかかった?
user    0m3.315s
sys     1m21.642s

3-A-3.xfsdumpコマンドでイメージバックアップ

# echo 3 > /proc/sys/vm/drop_caches

# time xfsdump -l 0 -f /testlv_bk/thin_snap.dump /thin_snap2

----(略)----

real    6m40.685s
user    0m3.128s
sys     1m9.068s

3-A-4.rsyncコマンドでコピー

# rm -rf /testlv_bk/*

# echo 3 > /proc/sys/vm/drop_caches
# time { rsync -auvh /thin_snap2/ /testlv_bk/ > /dev/null; }

real    11m52.228s        ←rsyncのコピー時間はなぜかコピー元がレガシースナップショットの場合とあまり変わらない?
user    3m22.757s
sys     1m28.464s

 

B.ソースボリュームがシンボリュームの場合

※ソースボリュームがシンボリュームでスナップショットボリュームがシンスナップショットボリュームのケース

【準備】

# lvs

  LV              VG  Attr       LSize   Pool          Origin     Data%  Meta%  Move Log Cpy%Sync Convert
  home            cl  -wi-ao---- 173.87g
  root            cl  -wi-ao----  50.00g
  swap            cl  -wi-ao----   7.81g
  1TBthin_snap1   dst Vwi---tz-k   2.00t big_thinpool  dst_thinlv
  big_thinpool    dst twi-aotz--   2.44t                          40.30  20.04
  dst_thinlv      dst Vwi-aotz--   2.00t big_thinpool             49.20
  testlv_bk       dst -wi-ao---- 200.00g
  src_2TB_linerlv src -wi-ao----   2.00t
  test_thinpool   src twi-aotz--  10.00g                          1.76   1.20
  testlv          src ori------- 200.00g
  thin_snap       src Vwi-a-tz-k   5.00g test_thinpool thinlv_1   0.00
  thin_snap2      src Vwi-aotz-- 200.00g test_thinpool testlv     0.08
  thinlv_1        src Vwi-a-tz--   5.00g test_thinpool            0.21        ←シンスナップショットのソースシンボリューム

 

・src/testlv内の43GBのデータをソースシンボリューム(src/thinlv_1)にコピーする。

その前にsrc/testlvを200GBに拡張する。

# time lvextend -L 200G src/thinlv_1
  WARNING: Sum of all thin volume sizes (405.00 GiB) exceeds the size of thin pool src/test_thinpool (10.00 GiB)!
  For thin pool auto extension activation/thin_pool_autoextend_threshold should be below 100.
  Size of logical volume src/thinlv_1 changed from 5.00 GiB (1280 extents) to 200.00 GiB (51200 extents).
  Logical volume src/thinlv_1 successfully resized.

real    0m0.358s
user    0m0.015s
sys     0m0.020s

# lvs
  LV              VG  Attr          LSize   Pool          Origin     Data%  Meta%  Move Log Cpy%Sync Convert
  home            cl  -wi-ao---- 173.87g
  root            cl  -wi-ao----  50.00g
  swap            cl  -wi-ao----   7.81g
  1TBthin_snap1   dst Vwi---tz-k   2.00t big_thinpool  dst_thinlv
  big_thinpool    dst twi-aotz--   2.44t                          40.30  20.04
  dst_thinlv      dst Vwi-aotz--   2.00t big_thinpool             49.20
  testlv_bk       dst -wi-ao---- 200.00g
  src_2TB_linerlv src -wi-ao----   2.00t
  test_thinpool   src twi-aotz--  10.00g                          1.76   1.20
  testlv          src ori------- 200.00g
  thin_snap       src Vwi-a-tz-k   5.00g test_thinpool thinlv_1   0.00
  thin_snap2      src Vwi-aotz-- 200.00g test_thinpool testlv     0.08
  thinlv_1        src Vwi-a-tz-- 200.00g test_thinpool            0.01

・thinlv_1のxfsファイルシステムを拡張する。

# mkdir /thinlv_1
# mount /dev/src/thinlv_1 /thinlv_1

# df -h /thinlv_1
ファイルシス             サイズ  使用  残り 使用% マウント位置
/dev/mapper/src-thinlv_1   5.0G   33M  5.0G    1% /thinlv_1

# xfs_growfs /dev/src/thinlv_1
meta-data=/dev/mapper/src-thinlv_1 isize=512    agcount=8, agsize=163824 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=1310592, imaxpct=25
         =                       sunit=16     swidth=16 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 1310592 to 52428800

# df -h /thinlv_1
ファイルシス                 サイズ  使用  残り  使用% マウント位置
/dev/mapper/src-thinlv_1   200G   46M  200G    1%  /thinlv_1

 

・シンプール拡張

# lvextend -L 200g src/test_thinpool

# lvs | grep test_thinpool
  test_thinpool    src twi-aotz-- 200.00g                          5.00   48.76
  thin_snap        src Vwi-a-tz-k    5.00g test_thinpool thinlv_1   0.00
  thin_snap2      src Vwi-aotz-- 200.00g test_thinpool testlv     0.08
  thinlv_1         src Vwi-aotz-- 200.00g test_thinpool            4.92

 

・43GBのデータをソースシンボリューム(src/thinlv_1)にコピー

# echo 3 > /proc/sys/vm/drop_caches

# time cp -r /testlv_bk/* /thinlv_1/

real    12m13.015s
user    0m1.529s
sys     1m11.682s

# lvs
  LV              VG  Attr       LSize   Pool          Origin     Data%  Meta%  Move Log Cpy%Sync Convert
  home            cl  -wi-ao---- 173.87g
  root            cl  -wi-ao----  50.00g
  swap            cl  -wi-ao----   7.81g
  1TBthin_snap1   dst Vwi---tz-k   2.00t big_thinpool  dst_thinlv
  big_thinpool    dst twi-aotz--   2.44t                          40.30  20.04
  dst_thinlv      dst Vwi-a-tz--   2.00t big_thinpool             49.20
  testlv_bk       dst -wi-ao---- 200.00g
  src_2TB_linerlv src -wi-a-----   2.00t
  test_thinpool   src twi-aotz-- 200.00g                          26.10  18.57
  testlv          src -ri-a----- 200.00g
  thinlv_1        src Vwi-aotz-- 200.00g test_thinpool            25.31

# df -h /thinlv_1
ファイルシス                 サイズ  使用  残り  使用% マウント位置
/dev/mapper/src-thinlv_1   200G   43G  158G   22% /thinlv_1

 

・シンスナップショット取得

# time lvcreate -s -n thin_snap3 src/thinlv_1
  Using default stripesize 64.00 KiB.
  WARNING: Sum of all thin volume sizes (400.00 GiB) exceeds the size of thin pool src/test_thinpool and the amount of free space in volume group (346.37 GiB)!
  For thin pool auto extension activation/thin_pool_autoextend_threshold should be below 100.
  Logical volume "thin_snap3" created.
real    0m0.494s
user    0m0.021s
sys     0m0.056s

# lvs
  LV                VG  Attr          LSize   Pool            Origin     Data%  Meta%  Move Log Cpy%Sync Convert
  home              cl  -wi-ao---- 173.87g
  root               cl  -wi-ao----  50.00g
  swap              cl  -wi-ao----   7.81g
  1TBthin_snap1   dst Vwi---tz-k   2.00t  big_thinpool   dst_thinlv
  big_thinpool      dst twi-aotz--   2.44t                                40.30  20.04
  dst_thinlv        dst Vwi-a-tz--   2.00t  big_thinpool                49.20
  testlv_bk         dst -wi-ao---- 200.00g
  src_2TB_linerlv  src -wi-a-----   2.00t
  test_thinpool    src twi-aotz-- 200.00g                               26.83  19.05
  testlv            src -ri-a----- 200.00g
  thin_snap3       src Vwi---tz-k 200.00g test_thinpool  thinlv_1
  thinlv_1         src Vwi-aotz-- 200.00g test_thinpool                26.04

# lvchange -ay -K /dev/src/thin_snap3
# lvs

  LV              VG  Attr       LSize   Pool          Origin     Data%  Meta%  Move Log Cpy%Sync Convert
  home            cl  -wi-ao---- 173.87g
  root            cl  -wi-ao----  50.00g
  swap            cl  -wi-ao----   7.81g
  1TBthin_snap1   dst Vwi---tz-k   2.00t big_thinpool  dst_thinlv
  big_thinpool    dst twi-aotz--   2.44t                          40.30  20.04
  dst_thinlv      dst Vwi-a-tz--   2.00t big_thinpool             49.20
  testlv_bk       dst -wi-ao---- 200.00g
  src_2TB_linerlv src -wi-a-----   2.00t
  test_thinpool   src twi-aotz-- 200.00g                          26.83  19.06
  testlv          src -ri-a----- 200.00g
  thin_snap3      src Vwi-a-tz-k 200.00g test_thinpool thinlv_1   26.04
  thinlv_1        src Vwi-aotz-- 200.00g test_thinpool            26.04

# mkdir /thin_snap3

# mount -o nouuid /dev/src/thin_snap3 /thin_snap3
# ll /thin_snap3

合計 4
drwxr-xr-x. 25 root root 4096  9月 14 20:41 1

 

3-B-1.cpコマンドでコピー

# rm -rf /testlv_bk/*

# echo 3 > /proc/sys/vm/drop_caches

# time cp -r /thin_snap3/* /testlv_bk/

real    12m47.084s       ←リニアソースボリュームのときよりコピーより時間がかかった?
user    0m1.817s
sys     1m26.194s

 

3-B-2.tarコマンドでアーカイブ

# rm -rf /testlv_bk/*
# echo 3 > /proc/sys/vm/drop_caches

# time tar cf /testlv_bk/thin_snap.tar /thin_snap3

----(略)----

real    12m22.000s      ←リニアソースボリュームのときよりコピーより時間がかかった?
user    0m4.169s
sys     1m28.265s

 

3-B-3.xfsdumpコマンドでイメージバックアップ

# echo 3 > /proc/sys/vm/drop_caches

# time xfsdump -l 0 -f /testlv_bk/thin_snap.dump /thin_snap3

----(略)----

real    10m4.734s       ←リニアソースボリュームのときよりコピーより時間がかかった?
user    0m3.937s
sys     1m14.228s

 

3-B-4.rsyncコマンドでコピー

# rm -rf /testlv_bk/*
# echo 3 > /proc/sys/vm/drop_caches
#  time { rsync -auvh /thin_snap3/ /testlv_bk/ > /dev/null; }

real    14m11.936s      ←リニアソースボリュームのときよりコピーより時間がかかった?
user    3m44.170s
sys     1m29.022s

 

【まとめ】

■cpで約43GBのコピー時間

・リニアボリューム→リニアボリューム                 5m58s

・レガシースナップショットボリューム→リニアボリューム      7m38s.

・リニアボリュームのシンスナップショット→リニアボリューム   8m32s

・シンボリュームのシンスナップショット→リニアボリューム    12m47s

 ※cpコマンドは差分バックアップできない

■rsyncで約43GBのコピー時間

・リニアボリューム→リニアボリューム                 8m11s

・レガシースナップショットボリューム→リニアボリューム      11m37s.

・リニアボリュームのシンスナップショット→リニアボリューム   11m52s

・シンボリュームのシンスナップショット→リニアボリューム    14m12s

 

※LVMスナップショットをマウントしてコピーすればダウンタイムは一瞬なのでこの方式は鉄板。

※コピーコマンドは差分バックアップの方が有利なのでxfs-dumpかrsyncの2択

※xfs-dumpは最低でも10回に1回はフルバックアップが必要になるのでrsyncの方がお得。

※rsyncは上記のようにフルバックアップの所要時間は一番長いが、初回を除いてフルバックアップ不要で差分バックアップできるので上記の4つのバックアップツールの中では一番有用と思われる。

※LVMスナップショットはレガシースナップショットとシンスナップショットのどっちが有利か?

→シンスナップショットは上記のようにレガシースナップショットより3割くらい時間がかかる。

また、シンスナップショット取得中にソースボリューム(本番データ)への書き込みが必要な場合(ダウンタイムほぼ0を目指してるのだから当然書き込みは必要)、ソースボリュームもシンボリュームで作成する必要がある。

※一方、レガシースナップショットよりシンスナップショットの方がバックアップの際にメリットとなることはシンスナップショットでバックアップした際の長所を調べる参照

 

 

※ただし、今回はPCに7200回転のHDDをSRCとDST用にそれぞれ一本ずつ接続して計測したが、エンタープライズ環境では、ここで計測したコピー所要時間よりだいぶ短くなる

エンタープライズ環境で使われている物理ストレージのwriteキャッシュ容量が仮に500GBだった場合、500GBよりずっと小さいサイズのデータなら書き込み所要時間は劇的に短縮される。

いっぽうHDDの方も、

ストライプディスク本数×ディスク1台のスループット≃RAIDグループのスループット

のようになるので、書き込み速度はおおむねストレイプディスクの本数倍になる。

 

※論理ボリュームを拡張した場合はxfs-repairコマンドでファイルシステムの整合性チェックと修復が必要

 # xfs-repair /dev/src/testlv

 

※LVMメタデータだけ枯渇した場合の対処法

1. lvs -aで確認

 # lvs -a
  LV                    VG  Attr       LSize   Pool          Origin     Data%  Meta%  Move Log Cpy%Sync Convert
  home                  cl  -wi-ao---- 173.87g
  root                  cl  -wi-ao----  50.00g
  swap                  cl  -wi-ao----   7.81g
  1TBthin_snap1         dst Vwi---tz-k   2.00t big_thinpool  dst_thinlv
  big_thinpool          dst twi-aotz--   2.44t                          40.30  20.04
  [big_thinpool_tdata]  dst Twi-ao----   2.44t
  [big_thinpool_tmeta]  dst ewi-ao----  80.00m
  dst_thinlv            dst Vwi-a-tz--   2.00t big_thinpool             49.20
  [lvol0_pmspare]       dst ewi-------  80.00m
  testlv_bk             dst -wi-ao---- 200.00g
  [lvol0_pmspare]       src ewi-------  12.00m
  src_2TB_linerlv       src -wi-a-----   2.00t
  test_thinpool         src twi-aotz-- 200.00g                          26.92  20.84
  [test_thinpool_tdata] src Twi-ao---- 200.00g
  [test_thinpool_tmeta] src ewi-ao---- 140.00m
  testlv                src -ri-a----- 200.00g
  thin_snap3            src Vwi-aotz-k 200.00g test_thinpool thinlv_1   26.04
  thinlv_1              src Vwi-aotz-- 200.00g test_thinpool            26.04

2.メタデータだけ拡張

 #lvreduce -L 128M src/test_thinpool_tmeta

3.システムリブート

 

下記の1.~3.のデバイスの組合わせに対して、下記の1.~4.の方法で1TBのファイルのコピー(アーカイブ)所要時間を計測する。

 

【srcとdstデバイスの組合わせ】

1.リニアボリュームからリニアボリュームへのコピー(アーカイブ)

2.レガシースナップショットボリュームからリニアボリュームへのコピー(アーカイブ)

3.シンスナップショットボリュームからリニアボリュームへのコピー(アーカイブ)

【コピー(アーカイブ)方法】

1.cpコマンドでコピー

2.tarコマンドでアーカイブ

3.xfsdumpコマンドでイメージバックアップ

4.rsyncコマンドでコピー

 

【検証環境】

# free -h
                total        used        free      shared  buff/cache   available
Mem:            15G        201M       15G       8.9M      160M         14G
Swap:           7.8G          0B        7.8G

# cat /proc/cpuinfo|grep processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3

# cat /etc/centos-release
CentOS Linux release 7.3.1611 (Core)

# fdisk -l /dev/sdb
Disk /dev/sdb: 3000.6 GB, 3000592982016 bytes, 5860533168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト

# fdisk -l /dev/sdc
Disk /dev/sdc: 3000.6 GB, 3000592982016 bytes, 5860533168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト

# lvs
  LV            VG  Attr       LSize   Pool          Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home          cl  -wi-ao---- 173.87g
  root          cl  -wi-ao----  50.00g
  swap          cl  -wi-ao----   7.81g
  testlv_bk     dst -wi-a-----  30.00g
  test_thinpool src twi-aotz--  30.00g                      0.10   0.54
  testlv        src owi-aos---  30.00g
  testsnap      src swi-a-s---  30.12g               testlv 0.00
  testsnap2     src swi-a-s---  30.12g               testlv 0.00
  testsnap3     src swi-a-s---  25.00g               testlv 0.00
  thinlv_1      src Vwi-aotz--  50.00g test_thinpool        0.06
  thinlv_2      src Vwi-a-tz--  50.00g test_thinpool        0.00

 

1.リニアボリュームからリニアボリューム

・2TBのリニアボリュームをsrcとdstデバイスに作る。

# lvcreate -L 2048G -n src_2TB_linerlv src
  WARNING: Sum of all thin volume sizes (100.00 GiB) exceeds the size of thin pools (30.00 GiB)!
  For thin pool auto extension activation/thin_pool_autoextend_threshold should be below 100.
  Logical volume "src_2TB_linerlv" created.

# lvcreate -L 2048G -n dst_2TB_linerlv dst
  Logical volume "dst_2TB_linerlv" created.

# lvs
  LV              VG  Attr       LSize   Pool          Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home            cl  -wi-ao---- 173.87g
  root            cl  -wi-ao----  50.00g
  swap            cl  -wi-ao----   7.81g
  dst_2TB_linerlv dst -wi-a-----   2.00t
  testlv_bk       dst -wi-a-----  30.00g
  src_2TB_linerlv src -wi-a-----   2.00t
  test_thinpool   src twi-aotz--  30.00g                      0.10   0.54
  testlv          src owi-aos---  30.00g
  testsnap        src swi-a-s---  30.12g               testlv 0.00
  testsnap2       src swi-a-s---  30.12g               testlv 0.00
  testsnap3       src swi-a-s---  25.00g               testlv 0.00
  thinlv_1        src Vwi-aotz--  50.00g test_thinpool        0.06
  thinlv_2        src Vwi-a-tz--  50.00g test_thinpool        0.00

# time mkfs.xfs /dev/src/src_2TB_linerlv
meta-data=/dev/src/src_2TB_linerlv isize=512    agcount=4, agsize=134217728 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=536870912, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=262144, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
real    0m6.383s
user    0m0.003s
sys     0m0.215s

# mkdir /src_2TB_linerlv;mount /dev/src/src_2TB_linerlv /src_2TB_linerlv

# time mkfs.xfs /dev/dst/dst_2TB_linerlv
meta-data=/dev/dst/dst_2TB_linerlv isize=512    agcount=4, agsize=134217728 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=536870912, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=262144, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
real    0m6.142s
user    0m0.008s
sys     0m0.211s

# mkdir /dst_2TB_linerlv;mount /dev/dst/dst_2TB_linerlv /dst_2TB_linerlv
# df -h

ファイルシス                    サイズ  使用  残り 使用% マウント位置
/dev/mapper/cl-root                50G  948M   50G    2% /
devtmpfs                          7.7G     0  7.7G    0% /dev
tmpfs                             7.8G     0  7.8G    0% /dev/shm
tmpfs                             7.8G  8.6M  7.7G    1% /run
tmpfs                             7.8G     0  7.8G    0% /sys/fs/cgroup
/dev/sda2                        1014M  132M  883M   13% /boot
/dev/sda1                         200M  9.5M  191M    5% /boot/efi
/dev/mapper/cl-home               174G   33M  174G    1% /home
/dev/mapper/src-thinlv_1           50G   38M   50G    1% /mnt
/dev/mapper/src-testlv             30G   43M   30G    1% /src
tmpfs                             1.6G     0  1.6G    0% /run/user/0
/dev/mapper/src-src_2TB_linerlv   2.0T   33M  2.0T    1% /src_2TB_linerlv
/dev/mapper/dst-dst_2TB_linerlv   2.0T   33M  2.0T    1% /dst_2TB_linerlv

# export SRC="/src_2TB_linerlv"
# export DST="/dst_2TB_linerlv"

# echo $SRC $DST
/src_2TB_linerlv /dst_2TB_linerlv

・1TBの試料データを下記のコマンドで作成

別のVMの中身をそっくりそのまま/src_2TB_linerlvディレクトリ配下にコピーする

※上記のホストどうしはそれぞれWifi接続(802.11n)なので50MB/sくらいしか出ないw

[root@centos7copy ~]# time rsync -auvh --exclude '/dev' --exclude '/sys'  \

--exclude '/run' --exclude '/proc' / 192.168.101.1:/src_2TB_linerlv/
root@192.168.101.1's password:
sending incremental file list

----(略)----

sent 44.50G bytes  received 3.53M bytes  3.60M bytes/sec
total size is 44.74G  speedup is 1.01
real    206m0.503s
user    2m25.235s
sys     37m22.420s

→と思ったら平均3.6MB/sだったw 30Mbpsくらいだったとさw

 

・1TBをコピーする所要時間を測る前に、まずは上記の44GBをコピー(アーカイブ)する所要時間を計測してみる。

1-1.cpコマンドでコピー

# echo 3 > /proc/sys/vm/drop_caches
# free -h

              total        used        free      shared  buff/cache   available
Mem:            15G        216M         15G        8.9M         86M         14G
Swap:          7.8G          0B        7.8G

# time cp -r /src_2TB_linerlv/* /dst_2TB_linerlv/

real    5m58.433s
user    0m1.432s
sys     1m7.555s

→1TBだったら単純に23倍して137分強

1-2.tarコマンドでアーカイブ

# rm -rf /dst_2TB_linerlv/*

# echo 3 > /proc/sys/vm/drop_caches

# time tar cf /dst_2TB_linerlv/hoge.tar /src_2TB_linerlv/*

real    5m30.308s
user    0m3.656s
sys     1m9.549s

1-3.xfsdumpコマンドでイメージバックアップ(初回)

# rm -rf /dst_2TB_linerlv/*
# echo 3 > /proc/sys/vm/drop_caches
# time xfsdump -l 0 -f /dst_2TB_linerlv/hoge.dump /src_2TB_linerlv

----(略)----

real    4m46.904s
user    0m2.832s
sys     0m58.582s

1-4.rsyncコマンドでコピー

# rm -rf /dst_2TB_linerlv/*

# echo 3 > /proc/sys/vm/drop_caches

# time rsync -auvh /src_2TB_linerlv/ /dst_2TB_linerlv/
sending incremental file list

----(略)----

sent 44.76G bytes  received 3.58M bytes  91.07M bytes/sec
total size is 44.74G  speedup is 1.00
real    8m10.581s      ←xfsdumpの方が速い
user    3m13.329s
sys     1m11.904s

1-1'.もう一回cpコマンドでコピー

# echo 3 > /proc/sys/vm/drop_caches
# time cp -r /src_2TB_linerlv/* /dst_2TB_linerlv/

real    5m57.268s
user    0m1.394s
sys     1m7.719s

 

・ためしに、一番速いxfsdumpで440GBバックアップの所要時間を測ってみる。

まず440GBのソースディレクトリを作成する。

# ls -1 $SRC | grep -v org | while read X;do mv ${SRC}/$X $SRC/org/;done

# echo 3 > /proc/sys/vm/drop_caches

# time for ((i=1;i<=10;i++));do mkdir ${SRC}/$i;cp -r ${SRC}/org/* ${SRC}/$i/;done

real    132m48.713s
user    0m15.753s
sys     12m30.723s

 

# ll /src_2TB_linerlv
合計 40
drwxr-xr-x. 25 root root 4096  9月  7 00:47 1
drwxr-xr-x. 18 root root  251  9月  7 02:39 10
drwxr-xr-x. 25 root root 4096  9月  7 01:00 2
drwxr-xr-x. 25 root root 4096  9月  7 01:13 3
drwxr-xr-x. 25 root root 4096  9月  7 01:26 4
drwxr-xr-x. 25 root root 4096  9月  7 01:40 5
drwxr-xr-x. 25 root root 4096  9月  7 01:53 6
drwxr-xr-x. 25 root root 4096  9月  7 02:07 7
drwxr-xr-x. 25 root root 4096  9月  7 02:20 8
drwxr-xr-x. 25 root root 4096  9月  7 02:33 9
drwxr-xr-x. 25 root root 4096  9月  7 00:31 org

→上記の「org」、「1」~「10」ディレクトリ内にそれぞれ合計43GB分のファイルやディレクトリが居る

# df -h
ファイルシス                             サイズ  使用  残り 使用% マウント位置
/dev/mapper/cl-root                    50G  1.8G   49G    4% /
devtmpfs                                   7.7G     0    7.7G    0% /dev
tmpfs                                       7.8G     0    7.8G    0% /dev/shm
tmpfs                                       7.8G  8.6M   7.7G    1% /run
tmpfs                                       7.8G     0     7.8G    0% /sys/fs/cgroup
/dev/sda2                             1014M  132M  883M   13% /boot
/dev/sda1                               200M  9.5M  191M    5% /boot/efi
/dev/mapper/cl-home                174G   33M  174G    1% /home
/dev/mapper/src-thinlv_1             50G   38M    50G    1% /mnt
/dev/mapper/src-testlv               30G   43M    30G    1% /src
tmpfs                                      1.6G       0    1.6G    0% /run/user/0
/dev/mapper/src-src_2TB_linerlv   2.0T   465G   1.6T   23% /src_2TB_linerlv
/dev/mapper/dst-dst_2TB_linerlv   2.0T   85G  2.0T    5% /dst_2TB_linerlv

→約420GBを同一デバイス内にコピーするのに133分

src-src_2TB_linerlvのデータサイズを計算しやすい約500GBにするンゴ。

# pwd
/src_2TB_linerlv

# time cp -rp 10 11

real    13m20.022s           ←別ディスクへのコピーの2倍強の時間がかかった
user    0m2.132s
sys     1m19.362s

# df -h /src_2TB_linerlv
ファイルシス                            サイズ  使用  残り  使用% マウント位置
/dev/mapper/src-src_2TB_linerlv   2.0T  507G  1.6T   25% /src_2TB_linerlv

→約470GBを同一デバイス内にコピーするのに約146分

 

・44GBのディレクトリを2つ並列でコピー

# time { cp -r $SRC/1 $DST/1 & cp -r $SRC/2 $DST/2; }

[1] 9487
real    13m48.177s
user    0m1.454s
sys     1m11.744s

# du -h --max-depth=0 $DST/1
43G     /dst_2TB_linerlv/1
# du -h --max-depth=0 $DST/2
43G     /dst_2TB_linerlv/2

→コピーを並列実行してもコピー元とコピー先の両方のディスクで帯域を取り合ってしまうのでコピー所要時間は改善されない。

・44GBのディレクトリを2つ逐次でコピー

その前に先ほどコピーしたディレクトリいったん消す。(削除時間が余計に乗ってしまうので)

# rm -rf $DST/{1,2}

# echo 3 > /proc/sys/vm/drop_caches

# time { cp -r $SRC/1 $DST/1;cp -r $SRC/2 $DST/2; }

real    11m59.152s
user    0m2.581s
sys     2m13.642s

# du -h --max-depth=0 $DST/1
43G     /dst_2TB_linerlv/1
# du -h --max-depth=0 $DST/2
43G     /dst_2TB_linerlv/2

→1つのコピー元ディスクから別の1つのコピー先ディスクにディレクトリをコピーする場合、並列でコピープロセスを同時実行するより、コピープロセスを1つずつ逐次実行したほうがオーバーヘッドが少なくなるようだ。

※また、当然だが、コピー元のサイズとコピー所要時間はほぼ正比例している。

★なので、時間短縮のためこれ以後は、1TBのコピー所要時間は43GBのファイルシステムのコピー所要時間を計測してこれを単純に23倍して見積もることにするぷに。

★500GBのxfsdumpは中止。上記の傾向がわかったから。xfsdumpのほうがcpより2割くらい速いってことで換算すればよさそう

 

2.レガシースナップショットボリュームからリニアボリューム

・コピー元ディスク上に作成済みの/dev/src/testlvリニア論理ボリュームを30GBから200GBに拡張してコピー元ファイルシステムにする。

# umount /dev/src/testlv
# lvchange -an src/testsnap

Change of snapshot src/testsnap will also change its origin src/testlv and 2 other snapshot(s). Proceed? [y/n]: y
# lvchange -an src/testsnap2
Change of snapshot src/testsnap2 will also change its origin src/testlv and 2 other snapshot(s). Proceed? [y/n]: y
# lvchange -an src/testsnap3
Change of snapshot src/testsnap3 will also change its origin src/testlv and 2 other snapshot(s). Proceed? [y/n]: y

# lvextend -L+170G /dev/src/testlv
  WARNING: Sum of all thin volume sizes (100.00 GiB) exceeds the size of thin pools (30.00 GiB)!
  For thin pool auto extension activation/thin_pool_autoextend_threshold should be below 100.
  Size of logical volume src/testlv changed from 30.00 GiB (7680 extents) to 200.00 GiB (51200 extents).
  Logical volume src/testlv successfully resized.

# lvs
  LV              VG  Attr       LSize   Pool          Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home            cl  -wi-ao---- 173.87g
  root            cl  -wi-ao----  50.00g
  swap            cl  -wi-ao----   7.81g
  dst_2TB_linerlv dst -wi-ao----   2.00t
  testlv_bk       dst -wi-a-----  30.00g
  src_2TB_linerlv src -wi-ao----   2.00t
  test_thinpool   src twi-aotz--  30.00g                      0.10   0.54
  testlv          src owi---s--- 200.00g
  testsnap        src swi---s---  30.12g               testlv
  testsnap2       src swi---s---  30.12g               testlv
  testsnap3       src swi---s---  25.00g               testlv
  thinlv_1        src Vwi-aotz--  50.00g test_thinpool        0.06
  thinlv_2        src Vwi-a-tz--  50.00g test_thinpool        0.00

# lvchange -ay /dev/src/testlv
# mount /dev/src/testlv /src
# xfs_growfs /dev/src/testlv

meta-data=/dev/mapper/src-testlv isize=512    agcount=4, agsize=1966080 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=7864320, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=3840, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 7864320 to 52428800

# df -h /src
ファイルシス               サイズ  使用  残り 使用% マウント位置
/dev/mapper/src-testlv   200G   44M  200G    1% /src

・ついでに下記の3つのレガシースナップショットボリュームを削除しちゃおう

# lvremove src/testsnap
  Logical volume "testsnap" successfully removed
# lvremove src/testsnap2
  Logical volume "testsnap2" successfully removed
# lvremove src/testsnap3
  Logical volume "testsnap3" successfully removed

# vgs
  VG  #PV #LV #SN Attr   VSize   VFree
  cl    1   3   0 wz--n- 231.69g   4.00m
  dst   1   2   0 wz--n-   2.73t 716.52g
  src   1   5   0 wz--n-   2.73t 516.45g

 

・/dst_2TB_linerlv/1ディレクトリ(43GB)を/src/にコピーする。

# time cp -r /dst_2TB_linerlv/1 /src/
real    7m37.192s
user    0m1.415s
sys     1m8.653s

んっ?リニアボリュームサイズが2TBのときより時間がかかった!? まあいっか。

・testlv論理ボリューム内のファイルに下記のようなささいな変更を加える

# cd /src/1/usr/local/src
# ll

合計 3624068
-rw-r--r--. 1 root root  123711003  9月  7 04:57 go1.14.4.linux-amd64.tar.gz
-rw-r--r--. 1 root root 3586257564  9月  7 04:58 oracle-database-ee-18c-1.0-1.x86_64.rpm
drwxr-xr-x. 3 root root         25  9月  7 04:57 rsync
-rw-r--r--. 1 root root    1069784  9月  7 04:58 rsync-3.2.3.tar.gz

# time md5sum oracle-database-ee-18c-1.0-1.x86_64.rpm
2ef79c73660191b1b6d68a5380892b60  oracle-database-ee-18c-1.0-1.x86_64.rpm

real    0m6.830s
user    0m6.486s
sys     0m0.344s

# echo -n "a" | dd of=oracle-database-ee-18c-1.0-1.x86_64.rpm bs=1 seek=1 conv=notrunc
1+0 レコード入力
1+0 レコード出力
1 バイト (1 B) コピーされました、 0.000107406 秒、 9.3 kB/秒

# md5sum oracle-database-ee-18c-1.0-1.x86_64.rpm
3f5d8575bce713114ea6f9e07ccc5e83  oracle-database-ee-18c-1.0-1.x86_64.rpm

# echo unko > ./unko.txt
# ll
合計 3624072
-rw-r--r--. 1 root root  123711003  9月  7 04:57 go1.14.4.linux-amd64.tar.gz
-rw-r--r--. 1 root root 3586257564  9月  7 05:25 oracle-database-ee-18c-1.0-1.x86_64.rpm
drwxr-xr-x. 3 root root         25  9月  7 04:57 rsync
-rw-r--r--. 1 root root    1069784  9月  7 04:58 rsync-3.2.3.tar.gz
-rw-r--r--. 1 root root          5  9月  7 05:28 unko.txt

・拡張したsrc/testlv論理ボリュームに対する10GBのレガシースナップショットを作成する

# lvcreate --size 10G -s -n legacy_snap /dev/src/testlv
  Using default stripesize 64.00 KiB.
  WARNING: Sum of all thin volume sizes (100.00 GiB) exceeds the size of thin pools (30.00 GiB)!
  For thin pool auto extension activation/thin_pool_autoextend_threshold should be below 100.
  Logical volume "legacy_snap" created.

# lvs
  LV              VG  Attr       LSize   Pool          Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home            cl  -wi-ao---- 173.87g
  root            cl  -wi-ao----  50.00g
  swap            cl  -wi-ao----   7.81g
  dst_2TB_linerlv dst -wi-ao----   2.00t
  testlv_bk       dst -wi-a-----  30.00g
  legacy_snap     src swi-a-s---  10.00g               testlv 0.00
  src_2TB_linerlv src -wi-ao----   2.00t
  test_thinpool   src twi-aotz--  30.00g                      0.10   0.54
  testlv          src owi-aos--- 200.00g
  thinlv_1        src Vwi-aotz--  50.00g test_thinpool        0.06
  thinlv_2        src Vwi-a-tz--  50.00g test_thinpool        0.00

・レガシースナップショットをマウントする。

# mkdir /legacy

# mount -o nouuid  /dev/src/legacy_snap /legacy_snap/   ←「nouuid」オプションが無いとマウントできない。
# ll /legasy_snap/
合計 4
drwxr-xr-x. 25 root root 4096  9月  7 04:59 1

 

2-1.cpコマンドでコピー

# time cp -r /legacy_snap/1 /dst_2TB_linerlv/12

real    7m38.081s
user    0m1.555s
sys     1m31.803s

2-2.tarコマンドでアーカイブ

# time tar cf /dst_2TB_linerlv/legacy_snap.tar  /legacy_snap/1

----(略)----

real    7m14.378s
user    0m3.596s
sys     1m34.667s

2-3.xfsdumpコマンドでイメージバックアップ(初回)

# time xfsdump -l 0 -f /dst_2TB_linerlv/legacy_snap.dump /legacy_snap

----(略)----

real    5m43.216s
user    0m3.237s
sys     1m20.813s

※xfsdumpで増分バックアップ

レガシースナップショットに直接変更を書き込む

# echo piyo > /legacy_snap/1/usr/local/src/chinko.txt

# echo -n "b" | dd of=/legacy_snap/1/usr/local/src/oracle-database-ee-18c-1.0-1.x86_64.rpm bs=1 seek=1 conv=notrunc
1+0 レコード入力
1+0 レコード出力
1 バイト (1 B) コピーされました、 0.00010475 秒、 9.5 kB/秒

# time xfsdump -l 1 -f /dst_2TB_linerlv/legacy_snap_1.dump /legacy_snap

----(略)----

xfsdump: media file size 3587263888 bytes
xfsdump: dump size (non-dir files) : 3587077368 bytes
xfsdump: dump complete: 11 seconds elapsed
xfsdump: Dump Summary:
xfsdump:   stream 0 /dst_2TB_linerlv/legacy_snap_1.dump OK (success)
xfsdump: Dump Status: SUCCESS

real    0m10.922s
user    0m0.046s
sys     0m2.374s

スナップショットを一旦削除して、ソースに差分を書き込み翌日分のスナップショットを作成してバックアップを取得する。

# umount /legacy_snap/
# lvremove /dev/src/legacy_snap

Do you really want to remove active logical volume src/legacy_snap? [y/n]: y
  Logical volume "legacy_snap" successfully removed

# echo piyopiyo > /src/1/usr/local/src/chinko.txt

# ll /src/1/usr/local/src/
合計 3624076
-rw-r--r--. 1 root root          9  9月  7 10:33 chinko.txt
-rw-r--r--. 1 root root  123711003  9月  7 04:57 go1.14.4.linux-amd64.tar.gz
-rw-r--r--. 1 root root 3586257564  9月  7 05:25 oracle-database-ee-18c-1.0-1.x86_64.rpm
drwxr-xr-x. 3 root root         25  9月  7 04:57 rsync
-rw-r--r--. 1 root root    1069784  9月  7 04:58 rsync-3.2.3.tar.gz
-rw-r--r--. 1 root root          5  9月  7 05:28 unko.txt

# cat /src/1/usr/local/src/chinko.txt
piyopiyo
# md5sum /src/1/usr/local/src/oracle-database-ee-18c-1.0-1.x86_64.rpm
3f5d8575bce713114ea6f9e07ccc5e83  /src/1/usr/local/src/oracle-database-ee-18c-1.0-1.x86_64.rpm
# echo -n "c" | dd of=/src/1/usr/local/src/oracle-database-ee-18c-1.0-1.x86_64.rpm bs=1 seek=1 conv=notrunc
1+0 レコード入力
1+0 レコード出力
1 バイト (1 B) コピーされました、 0.000112155 秒、 8.9 kB/秒

# md5sum /src/1/usr/local/src/oracle-database-ee-18c-1.0-1.x86_64.rpm
01795d1e5b4f2c9d22b289d1a1ce9b77  /src/1/usr/local/src/oracle-database-ee-18c-1.0-1.x86_64.rpm

# lvcreate --size 10G -s -n legacy_snap /dev/src/testlv
  Using default stripesize 64.00 KiB.
  WARNING: Sum of all thin volume sizes (100.00 GiB) exceeds the size of thin pools (30.00 GiB)!
  For thin pool auto extension activation/thin_pool_autoextend_threshold should be below 100.
  Logical volume "legacy_snap" created.

# mount -o nouuid /dev/src/legacy_snap /legacy_snap/
# cat /legacy_snap/1/usr/local/src/chinko.txt

piyopiyo

# time xfsdump -l 1 -f /dst_2TB_linerlv/legacy_snap_1_.dump /legacy_snap
xfsdump: using file dump (drive_simple) strategy
xfsdump: version 3.1.7 (dump format 3.0) - type ^C for status and control
 ============================= dump label dialog ==============================
please enter label for this dump session (timeout in 300 sec)
 -> hoge
session label entered: "hoge"
 --------------------------------- end dialog ---------------------------------
xfsdump: level 1 incremental dump of localhost.localdomain:/legacy_snap based on level 0 dump begun Mon Sep  7 07:51:28 2020
xfsdump: dump date: Mon Sep  7 10:42:11 2020
xfsdump: session id: cd80525a-510f-4a15-a723-75eefbc27636
xfsdump: session label: "hoge"
xfsdump: ino map phase 1: constructing initial dump list
xfsdump: ino map phase 2: pruning unneeded subtrees
xfsdump: ino map phase 3: skipping (only one dump stream)
xfsdump: ino map construction complete
xfsdump: estimated dump size: 3586386112 bytes
 ============================= media label dialog =============================
please enter label for media in drive 0 (timeout in 300 sec)
 -> hoge
media label entered: "hoge"
 --------------------------------- end dialog ---------------------------------
xfsdump: creating dump session media file 0 (media 0, file 0)
xfsdump: dumping ino map
xfsdump: dumping directories
xfsdump: dumping non-directory files
xfsdump: ending media file
xfsdump: media file size 3587262720 bytes
xfsdump: dump size (non-dir files) : 3587076824 bytes
xfsdump: dump complete: 50 seconds elapsed
xfsdump: Dump Summary:
xfsdump:   stream 0 /dst_2TB_linerlv/legacy_snap_1_.dump OK (success)
xfsdump: Dump Status: SUCCESS
real    0m50.609s
user    0m0.119s
sys     0m8.574s

# ls -lh /dst_2TB_linerlv/legacy_snap_1_.dump
-rw-r--r--. 1 root root 3.4G  9月  7 10:43 /dst_2TB_linerlv/legacy_snap_1_.dump

→前日のスナップショットをxfsdumpでバックアップした後、スナップショットを削除して、当日作成したスナップショットをxfsdumpで差分バックアップした場合、差分(ファイル)のみがコピーされた

※ただしxfsdumpの場合、増分バックアップを続けて行った場合、レベル0のフルバックアップから最大レベル9までの増分バックアップまでしか取得できず、多くとも10日おきにフルバックアップが必要になる。rsyncの方が一回の差分バックアップ所要時間が長くても、rsyncは永久に差分バックアップだけしてればよい。

 

2-4.rsyncコマンドでコピー(差分コピー)

※/dst_2TB_linerlv/1/は以前cpコマンドでコピー済み。

# time rsync -auvh /legacy_snap/1/ /dst_2TB_linerlv/1/

----(略)----

sent 44.76G bytes  received 3.58M bytes  64.08M bytes/sec
total size is 44.74G  speedup is 1.00
real    11m37.361s
user    3m21.442s
sys     1m41.029s

# ll /dst_2TB_linerlv/1/usr/local/src
合計 3624072
-rw-r--r--. 1 root root  123711003  9月  7 04:57 go1.14.4.linux-amd64.tar.gz
-rw-r--r--. 1 root root 3586257564  9月  7 05:25 oracle-database-ee-18c-1.0-1.x86_64.rpm
drwxr-xr-x. 3 root root         25  9月  7 04:57 rsync
-rw-r--r--. 1 root root    1069784  9月  7 04:58 rsync-3.2.3.tar.gz
-rw-r--r--. 1 root root          5  9月  7 05:28 unko.txt

※chinko.txtは削除してる。

すかさずもう一回

# time rsync -auvh /legacy_snap/1/ /dst_2TB_linerlv/1/
sending incremental file list
sent 5.21M bytes  received 24.11K bytes  299.27K bytes/sec
total size is 44.74G  speedup is 8,541.76
real    0m16.707s
user    0m1.026s
sys     0m2.901s

レガシースナップショットに直接変更を書き込んでもう一回

# echo fuga >> /legacy_snap/1/usr/local/src/unko.txt
# cat /legacy_snap/1/usr/local/src/unko.txt

unko
fuga

# time rsync -auvh /legacy_snap/1/ /dst_2TB_linerlv/1/
sending incremental file list
usr/local/src/unko.txt
sent 5.21M bytes  received 24.14K bytes  3.49M bytes/sec
total size is 44.74G  speedup is 8,541.63
real    0m1.073s
user    0m0.548s
sys     0m0.634s

# cat /dst_2TB_linerlv/1/usr/local/src/unko.txt
unko
fuga

# echo -n "b" | dd of=/legacy_snap/1/usr/local/src/oracle-database-ee-18c-1.0-1.x86_64.rpm bs=1 seek=1 conv=notrunc
1+0 レコード入力
1+0 レコード出力
1 バイト (1 B) コピーされました、 0.000116084 秒、 8.6 kB/秒

# time rsync -auvh /legacy_snap/1/ /dst_2TB_linerlv/1/
sending incremental file list
usr/local/src/oracle-database-ee-18c-1.0-1.x86_64.rpm
sent 3.59G bytes  received 24.13K bytes  266.10M bytes/sec
total size is 44.74G  speedup is 12.45
real    0m12.689s
user    0m14.608s
sys     0m4.127s

# md5sum /legacy_snap/1/usr/local/src/oracle-database-ee-18c-1.0-1.x86_64.rpm
49bf69a88ffb783aedc4b9af4af9b885  /legacy_snap/1/usr/local/src/oracle-database-ee-18c-1.0-1.x86_64.rpm
# md5sum /dst_2TB_linerlv/1/usr/local/src/oracle-database-ee-18c-1.0-1.x86_64.rpm
49bf69a88ffb783aedc4b9af4af9b885  /dst_2TB_linerlv/1/usr/local/src/oracle-database-ee-18c-1.0-1.x86_64.rpm

一回スナップショットを削除して、もう一回作り直して差分コピーしてみる。

# umount /legacy_snap/
# lvremove /dev/src/legacy_snap

Do you really want to remove active logical volume src/legacy_snap? [y/n]: y
  Logical volume "legacy_snap" successfully removed
# lvcreate --size 10G -s -n legacy_snap2 /dev/src/testlv
  Using default stripesize 64.00 KiB.
  WARNING: Sum of all thin volume sizes (100.00 GiB) exceeds the size of thin pools (30.00 GiB)!
  For thin pool auto extension activation/thin_pool_autoextend_threshold should be below 100.
  Logical volume "legacy_snap2" created.

# lvs
  LV              VG  Attr       LSize   Pool          Origin Data%  Meta%  Move Log Cpy%Sync Convert
  home            cl  -wi-ao---- 173.87g
  root            cl  -wi-ao----  50.00g
  swap            cl  -wi-ao----   7.81g
  dst_2TB_linerlv dst -wi-ao----   2.00t
  testlv_bk       dst -wi-a-----  30.00g
  legacy_snap2    src swi-a-s---  10.00g               testlv 0.00
  src_2TB_linerlv src -wi-ao----   2.00t
  test_thinpool   src twi-aotz--  30.00g                      0.10   0.54
  testlv          src owi-aos--- 200.00g
  thinlv_1        src Vwi-aotz--  50.00g test_thinpool        0.06
  thinlv_2        src Vwi-a-tz--  50.00g test_thinpool        0.00

# mount -o nouuid /dev/src/legacy_snap2 /legacy_snap
# ll /legacy_snap/

合計 4
drwxr-xr-x. 25 root root 4096  9月  7 04:59 1

# time rsync -auh /legacy_snap/1/ /dst_2TB_linerlv/1/

real    0m19.603s
user    0m1.208s
sys     0m3.051s

# echo puni >> /legacy_snap/1/usr/local/src/unko.txt
# time rsync -auh /legacy_snap/1/ /dst_2TB_linerlv/1/

real    0m1.087s
user    0m0.581s
sys     0m0.614s

# cat /dst_2TB_linerlv/1/usr/local/src/unko.txt
unko
puni

→前日のスナップショットをrsyncでバックアップした後、スナップショットを削除して、当日作成したスナップショットをrsyncでバックアップした場合、差分(ファイル)のみがコピーされた