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論理ボリュームの詳細表示

*1 : とは書きましたが、よく分からない人はLVMなんて触らない方がよいです。

過去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で設定できる模様)。

*2 : Disk I/Oを発行すると画面が固まる。

LVMまとめ

これで完璧と思ったものの、スナップショットが1つあるだけで動作が重すぎます。ソフトウェアRAIDと組み合わせたせいかもしれませんが、(キャッシュを超える)大きなファイルを書き込むと異様に遅くなります。

どれくらい遅いかと言うと、100MB/s出るHDDで10MB/sとかなります……。このときシステム全体の動作も異様に重くなります(load averageが跳ね上がるしDisk I/Oが帰ってこない)。システム全体が全く使えなくなる。7つもスナップショット作ったら確実に死亡フラグです。


LVMはcopy on writeと言って書き込みが発生するごとにそれぞれのスナップショット領域にコピーを持ってくるという実装のようです。スナップショットが複数あればそれぞれにコピーを書きこみます。全く意味がわかりません。

物理ディスクを記憶領域グループとして抽象化しているのですから、書き込み発生時に新たな領域を割り当てて、スナップショットの参照用に古い領域をそのまま保存することが可能ですし、それが当然考えられる実装です。


結論。LVMスナップショットは(それ自体の保存目的では)まるで使えない。*3

NILFS使おう……。


おなじことやってる人が居た。

*3 : LVMはあくまでスナップショットを取ってそれを別HDDに退避することを目的としているようです。そのようなクリティカルな同期に残念ながら用がないので(単純な非同期コピーで十分)今回はLVM自体に用がなくなりました。