GFSの機能を組み合わせて、CLVMのスナップショットを取ってみた(1)

Red Hat Cluster Suite の CLVMでは、クラスタリングを行った状態でのsnapshotには対応しておらず、バックアップのためにはストレージ側の機能などを使用する必要がある、というのは、リンク先の話などからも間違いないようなのだが、
http://www.jp.redhat.com/magazine/NO11/
http://www.mail-archive.com/linux-cluster@redhat.com/msg04535.html
実は、GFSの機能と組み合わせることで、一応CLVMで管理しているLVについても、 snapshotらしきものが取れるらしいことがわかったので、念のため書いておく。 ( 以下 自己責任で ry) )
http://archives.free.net.ph/message/20090325.120731.bfccfe3a.ja.html

方策としては、

 # gfs2_tool freeze /mnt

などを使って、一時的にGFS(筆者の環境ではFedoraなのでGFS2 しか使えなさそう。。 ) の書込みを抑え、その間に lvcreate --snapshot で通常通りスナップショットを取得するという方法である。

実際にcman, clvmd 起動状態でsnapshotを取ってみたところ、snapshotを作成したノードでしかsnapshot LVが認識されないというアレな状況になり、、 CLVMがsnapshotに対応していないというのは間違いなさそうだ。

ただ、実際のところsnapshot をバックアップ向けに、別のノードから使用することはあまりないため、これはこれでバックアップのためのひとつの方策として使えそうだ。。

なお、リンク先にもある通り、 snapshot LVは、GFSのメタデータも合わせてコピーしてしまうため、ファイルシステムの名前を変更しないと、元のGFSと同時にマウントすることが出来ない。ファイルシステム名の変更は、こんな感じで実施できた

# gfs2_tool sb /dev/mapper/virtiovg1-virtiolv1_snap table fedoracluster1:mygfs1_snap

mygfs1_snap など他のLV名と重複しない名前をつける必要がある。このコマンドを実行すると、実行の可・不可を、 [y|n] で、聞いてくるのだが、自動で実行したい時には、無理やり y を書き込んだら上手くいった ..

echo $'y\n' | gfs2_tool sb /dev/mapper/virtiovg1-virtiolv1_snap table fedoracluster1:mygfs1_snap

結局snapshotを作成する時には、 freeze, snapshot 作成, テーブル名変更, unfreeze の流れを一気に実行することになるのだが、筆者はこんな感じで試していた。

gfs2_tool freeze /mnt && lvcreate -L 300M --snapshot -n virtiolv1_snap /dev/virtiovg1/virtiolv1 
&& echo $'y\n' | gfs2_tool sb /dev/mapper/virtiovg1-virtiolv1_snap table fedoracluster1:mygfs1_snap &&  gfs2_tool unfreeze /mnt 

VG名, LV名, マウントポイントなどは適宜変更のこと。

PostgreSQLを使う際には、既にPITR対応のオンラインバックアップ手法や、Slony-I を組み合わせたバックアップ手法など、LVMスナップショットよりもよさげな案がいくつかあり、改めてスナップショットを使う機会があるかどうかは微妙なのだが、念のためこの方法も覚えておこうと思う。

あえてSlony-I を使わない(ディスク引き継ぎテイクオーバー実施 ) のDBでは使えるか。。。( でも、その場合も pg_start_backup 後にゆっくり取ればよいので、スナップショットを使う必要はないかも。。)