2009年6月30日火曜日

スナップショット使用してMySQLの動作している仮想サーバをバックアップ

以前、IPnutsでvserverを使った仮想サーバのバックアップについて、ディスクの構成を中心にして紹介しました。
仮想サーバのバックアップ(その1)
仮想サーバのバックアップ(その2)
仮想サーバのバックアップ(その3)

この時は、まだLVMを使ってなかったので、スナップショットは使わずにバックアップをとっていました。

その後、ディスクが故障したためミラーリングしたディスク上でLVMを作成し、使用するように変更しました。

ミラー上にLVMを作る

また、他のサーバも移行してきました。

Pylonsの仮想環境を仮想マシンに移行する
Pylonsの仮想環境を仮想マシンに移行する(2)

しばらく、バックアップは以前のままでしたが、これだと、バックアップのときのダウンタイムが長くなります。そこで、せっかくLVMにしているのでスナップショットを利用して、ダウンタイムがほとんどなくなるようにスクリプトを書き直しました。

vserverの仮想サーバが2台分動作しています。非効率ですが、他のサーバから単純に移行したものなのでMySQLのデータベースもそれぞれの仮想サーバで稼働しています。

以下はバックアップのスクリプトです。

#!/bin/sh
MNTSNAP=/mnt/var_snap
VARSNAP=lvvar_snap
VARSNAPDEV=/dev/vg/$VARSNAP
VARDEV=/dev/vg/lvvar

vsqllock(){
vserver $1 exec mysql $2 -e "flush tables with read lock;"
}

vsqlunlock(){
vserver $1 exec mysql $2 -e "unlock tables;"
}

if [ -d $MNTSNAP ] ;then
mountpoint $MNTSNAP && umount $MOUNTSNAP
else
mkdir $MNTSNAP
fi

lvremove -f $VARSNAPDEV
vsqllock vserver1 database1
vsqllock vserver2 database2
sync
sync
lvcreate -s -L 1g -n $VARSNAP $VARDEV
vsqlunlock vserver1 database1
vsqlunlock vserver2 database2

if mount -o ro $VARSNAPDEV $MNTSNAP ;then
nice rsync -av --delete $MNTSNAP/lib/vservers/vserver1 /var2/lib/vservers/
nice rsync -av --delete $MNTSNAP/lib/vservers/vserver2 /var2/lib/vservers/
umount $MNTSNAP
else
echo "### mount failed ###"
echo "### mount -o ro,nouuid $VARSNAPDEV $MNTSNAP"
echo "### ------------ ###"
fi

lvremove -f $VARSNAPDEV


ネットワークから更新されるデータはデータベースのテーブルだけなので、仮想サーバを落とさずにMySQLのコマンドでテーブルが更新されないようにして、スナップショットをとります。これだと、ダウンタイムはほとんど起こりません。

mysqlのコマンドは、スクリプトの中ではvsqllock,vsqlunlockのなかで行っていますが、1行だけなので、vserverのexecコマンドでホスト側から直接仮想サーバーのmysqlコマンドを実行しています。

参考
http://labs.unoh.net/2006/09/lvm_xfs_mysql.html
http://dev.mysql.com/doc/refman/5.1/ja/flush.html

スナップショットは仮想サーバー側からとれないので、.sql文のなかでsystemコマンドを使ってスナップショットをとることはできません。

LVMでスナップショットをとったあと、すぐにロックをはずし、正常稼働状態にすることができます。その後スナップショットをマウントしてゆっくりバックアップをとることができます。

0 件のコメント: