2010/05/23(日)LVMによる自動バックアップを構築するも、遅いのでボツ
Linux上でRAIDを構成していますが、RAIDとはいえ壊れるときは壊れるし、そもそも論理的障害には無力。そこでLVMによる自動バックアップを構築しました。
しかしまとめにあるように、パフォーマンスが酷すぎてLVMスナップショット自体によるバックアップ目的ではまるで使えませんでした。
LVM既存ボリュームを縮める
ボリュームグループ内に空きがないとスナップショットが生成できないとは知りませんでした(汗)
900GB全部確保してしまったボリュームグループを800GBにして、100GB削ります。
必要なプロセスを止めてまずumount。よく分からない人はシングルユーザーモードで作業してください。*1
# umount /data
縮小の場合はファイルシステムを縮めてからボリュームを縮めます。
# e2fsck /dev/data/data # resize2fs /dev/data/data 800G # lvresize -L 800G /dev/data/data
resize2fs と lvresize で与える値は必ず同じにしてください。
最後に mount して戻します。
# mount /data
メモ
コマンド | 説明 |
---|---|
pvscan | 物理ボリュームの表示 |
vgscan | ボリュームグループの表示 |
lvscan | 論理ボリュームの表示 |
lvdisplay | 論理ボリュームの詳細表示 |
過去7日分のスナップショットを自動で作る
毎日1回、過去7日分のスナップショットを自動で作成するようにしておきます。
#!/bin/sh DEV=/dev/home/home NUM=`date +"%w"` NAME=bak$NUM if [ -r /dev/home/$NAME ]; then lvremove -f /dev/data/$NAME fi lvcreate -s -L 10G -n $NAME /dev/data/home
bak0(日曜)~bak6(土曜)まで10Gずつ7個で70GB。
手動で実行し、lvscan で実際に作成されているか確認します。
# lvscan ACTIVE Original '/dev/data/home' [800.00 GiB] inherit ACTIVE Snapshot '/dev/data/bak1' [10.00 GiB] inherit
ディスク内を上書きしすぎると容量が足りなくなります。単純に1Gのファイルを消したり追加すると1G消費するという訳ではないので、様子を見ながら足りなければ増やす予定。
ボリュームの空きは次で確認できます。
# lvdisplay /dev/data/bak1
上のスクリプトをrootのcrontabに登録して1日1回実行するようにしました。
単純な速度テスト
スナップショットが1つも無いとき。
~$ time dd if=/dev/zero of=test bs=10M count=10
10+0 記録始め
10+0 記録終わり
104857600 バイト (105 MB) コピー終了, 0.231374 s, 453 MB/s
real 0m3.544s
user 0m0.000s
sys 0m0.960s
スナップショットが1つあるとき。
~$ time dd if=/dev/zero of=test bs=10M count=100
100+0 記録始め
100+0 記録終わり
1048576000 バイト (1.0 GB) コピー終了, 59.1756 s, 17.7 MB/s
real 0m59.198s
user 0m0.000s
sys 0m1.690s
RAIDの影響があってはまずいので、全く別マシンでRAIDなしでテストもしましたが、1GB書き込みがスナップショットなし「79MB/s」でスナップショットありでは「22MB/s」でした。そしてやはりDisk I/Oが帰ってこなくなります。*2
メモリ搭載量にもよると思いますが300MBぐらいはライトキャッシュが働くので、1Gぐらい書き込んであげないと判別は難しいです(/etc/lvm/lvm.confで設定できる模様)。
LVMまとめ
これで完璧と思ったものの、スナップショットが1つあるだけで動作が重すぎます。ソフトウェアRAIDと組み合わせたせいかもしれませんが、(キャッシュを超える)大きなファイルを書き込むと異様に遅くなります。
どれくらい遅いかと言うと、100MB/s出るHDDで10MB/sとかなります……。このときシステム全体の動作も異様に重くなります(load averageが跳ね上がるしDisk I/Oが帰ってこない)。システム全体が全く使えなくなる。7つもスナップショット作ったら確実に死亡フラグです。
LVMはcopy on writeと言って書き込みが発生するごとにそれぞれのスナップショット領域にコピーを持ってくるという実装のようです。スナップショットが複数あればそれぞれにコピーを書きこみます。全く意味がわかりません。
物理ディスクを記憶領域グループとして抽象化しているのですから、書き込み発生時に新たな領域を割り当てて、スナップショットの参照用に古い領域をそのまま保存することが可能ですし、それが当然考えられる実装です。
結論。LVMスナップショットは(それ自体の保存目的では)まるで使えない。*3