仮想サーバのバックアップ(その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 件のコメント:
コメントを投稿