なんとなく

誰得感満載な記事が多いかも。Mono関係とLinuxのサーバ関係、レビューとか。

さくらのVPSでOSgridの運用設定-2

今回は、バックアップとリストアについて触れていきたいと思います。

内容

  • はじめに
  • バックアップ
    • 「いつ」バックアップするか(タイミング)
    • 「何を」バックアップするか(対象)
    • 「どのように」バックアップするか(方法)
    • 「どこに」バックアップするか(場所)
    • 「何日間残すか」
    • 「いつ」「何を」「どこに」「どのように」バックアップし、「何日間残すか」スクリプト
    • スクリプトの定期実行
  • リストア
  • システム的なバックアップ以外の方法

はじめに

データ消失のリスクに対するものとして、バックアップを取るという対策を講じる必要があります。ただ、さくらのVPSにおいては、HDDはミラーリングしてあるので、HDDの物理的な異常については考慮しなくてよいのですが、作業者の操作ミスについては、対応できないのです。当たり前なことですが。そのリスクを軽減するためにバックアップを定期的にとっておく必要があります。

上記で軽減するといったのは、常にバックアップを取るという手法ではなく、定期的に取る手法ですので、操作ミスをした場合、その時点から定期的にとっているところまでのデータは失われます。ただし、失われるのは、その期間ですのである程度は元に戻り、リスクを軽減出来るということです。

また、バックアップしたものをきちんと元に戻せなければなりませんから、リストアについてもきちんと確認しておく必要があります。

それでは、「いつ」、「何を」、「どのように」、「どこに」バックアップで取るか、そして「何日間残すか」について考えていきたいと思います。

バックアップ

「いつ」バックアップするか(タイミング)

まず、「いつ」についてです。
定期的にバックアップを取るといっても、1時間に1回なのか1日に1回なのか1ヶ月に1回なのかでは、もし、データを消失した場合に戻せるものも量が変わってきます。また、バックアップを取る頻度によってもデータの容量が変わってきます。

今回は、操作ミスをするという操作をする頻度が余り少ないという点、および、さくらのVPS512M*1で動かせるSIMが4つ程度(パフォーマンスについてはまた別途に記述したいです)で、データベースのデータ量がさほど大きくないという点を考慮して(データベースはフルバックアップ)、今回は1日に1回バックアップを取ることとします。ご自身の条件によって検討されるのがベストです。

「何を」バックアップするか(対象)

次に「何を」についてです。
どのデータをバックアップするかについてですが、

http://opensimulator.org/wiki/Backups

をみると設定ファイルとデータベースに保存してあるデータを取ればいいようです。

設定ファイル
設定ファイルについては、
前々回のエントリ*2
OSgirdに接続するための設定

  • OpenSim.ini
  • GridCommon.ini
  • FlotsamCache.ini
  • Regions.ini

と記載したファイルです。

場所は

  • (Osgridの実行ファイルを解凍したディレクトリ)/bin/OpenSim.ini
  • (Osgridの実行ファイルを解凍したディレクトリ)/bin/config-include/GridCommon.ini
  • (Osgridの実行ファイルを解凍したディレクトリ)/bin/config-include/FlotsamCache.ini
  • (Osgridの実行ファイルを解凍したディレクトリ)/bin/Regions/Regions.ini

にあります。

以上のファイルをバックアップして上げる必要があります。

データベース
また、データベースに保存してあるデータについては、DBの作成において作成したデータベースのopensimが対象となります。

「どのように」バックアップするか(方法)

では、「どのように」バックアップするかです。
設定ファイル
設定ファイルはtarで固めてあげるのがいいと考えます。ホームディレクトリ にbzip2の圧縮形式で固めます。

[takeshich@foo ~]$ tar cfj ~/test.tar.bz2 OpenSim.ini config-include/GridCommon.ini config-include/FlotsamCache.ini Regions/Regions.ini

データベース
また、データベースについては、mysqldumpを使ってダンプを取ってあげるのがいいと考えます。速度と圧縮率を考慮するとこちらはgzipのオプション無しがよいかと考えます。ホームディレクトリにmysqldumpを使ってgzipの圧縮形式で固めます。

[takeshich@foo ~]$ mysqldump -u opensim -ppassword --single-transaction --databases opensim | gzip >  ~/opensim_db.gz
「何日間残すか」

何日間残すかについてです。HDDの容量と相談して決めれば良いと思います。
現在運用しているのは、4SIMで43671プリムで、他にもデータはあるかと思いますが、データベースでは上記方法でだと5.9MBytesぐらいのようようです。6MBytesと考えて、30日でも180Mbyteです。ただ、30日ぐらい前には巻き戻さないと考えられます。そこで、30日が妥当ではないかという判断をします。

「いつ」「何を」「どこに」「どのように」バックアップし、「何日間残すか」スクリプト

「いつ」、「何を」、「どのように」、「どこに」バックアップで取るか、そして「何日間残すか」について、まとめたものをスクリプトにしました。

[takeshich@foo ~]$ vi osgridbackup.sh
#!/bin/bash

#バックアップ対象:OSgridの設定ファイル、db
#保存期間は30日間
#ローカルバックアップ先:/home/takeshich/osgridbackup
#実行タイミング:1日1回、03:00
#サービスはとめない。
#ログをとる
#ネットワークストレージにもコピーを(VPSが復旧できない何かがあった場合への保険)

#保存先
BACKUPDIR=/home/takeshich/osgridbackup
#保存対象
FILESDIR="OpenSim.ini config-include/GridCommon.ini config-include/FlotsamCache.ini Regions/Regions.ini"
#osgridの実行ファイルのあるディレクトリのパス
OSGRIDDIR=/home/takeshich/osgrid/bin
#ログ出力先
LOGFILENAME=/home/takeshich/osgrid_backup.log

#DBの情報
DBUSER=opensim
DBPASS=password

#日付情報
TODAY=`date +%Y%m%d`
#30日前の日付
DAYSAGO=`date --date "30 days ago" +%Y%m%d`

#実処理
#mysqlのopensim dbのバックアップ
/usr/bin/mysqldump -u ${DBUSER} -p${DBPASS} --databases opensim | gzip > ${BACKUPDIR}/osgrid_db_${TODAY}.gz

#エラー処理
if [ $? = "0" ]
then
        echo ${TODAY} "mysqldump is ok" >> ${LOGFILENAME}
else
        echo ${TODAY} "mysqldump was failed" >> ${LOGFILENAME}
fi

#ファイルのアーカイブ
#ファイルを直接バックアップを取って差分をとって、
#変更があった場合のみやるのもいいかもしれない。
cd ${OSGRIDDIR}
tar cfj ${BACKUPDIR}/osgrid_files_${TODAY}.tar.bz2 ${FILESDIR}

#エラー処理
if [ $? = "0" ]
then
        echo ${TODAY} "filebackup is ok" >> ${LOGFILENAME}
else
        echo ${TODAY} "filebackup was failed" >> ${LOGFILENAME}
        exit -1
fi

#ネットワークストレージに転送
#ネットワークストレージを/mnt/atdisk/backup/にマウントしてあると想定
#cp ${BACKUPDIR}/osgrid_db_${TODAY}.gz /mnt/atdisk/backup/
#cp ${BACKUPDIR}/osgrid_files_${TODAY}.tar.gz /mnt/atdisk/backup/

#30日前のファイルを削除
#ファイルの存在を確認して削除
if [ -s ${BACKUPDIR}/osgrid_db_${DAYSAGO}.gz ]
then
        rm -f ${BACKUPDIR}/osgrid_db_${DAYSAGO}.gz
        echo ${TODAY} "osgrid_db_${DAYSAGO}.gzを削除" >> ${LOGFILENAME}
fi

if [ -s /mnt/atdisk/backup/osgrid_db_${DAYSAGO}.gz ]
then
        rm -f /mnt/atdisk/backup/osgrid_db_${DAYSAGO}.gz
        echo ${TODAY} "osgrid_db_${DAYSAGO}.gzを削除転送先" >> ${LOGFILENAME}
fi

if [ -s ${BACKUPDIR}/osgrid_files_${DAYSAGO}.tar.gz ]
then
        rm -f ${BACKUPDIR}/redmine_files_${DAYSAGO}.tar.gz
        echo ${TODAY} "osgrid_files_${DAYSAGO}.tar.gz" >> ${LOGFILENAME}
fi

#ネットワークストレージのファイルも削除
#if [ -s /mnt/atdisk/backup/osgrid_files_${DAYSAGO}.tar.gz ]
#then
#        rm -f /mnt/atdisk/backup/osgrid_files_${DAYSAGO}.tar.gz
#        echo ${TODAY} "osgrid_files_${DAYSAGO}.tar.gz" >> ${LOGFILENAME}
#fi

バックアップデータの保存先に、所定の方法でバックアップを取ったデータを30日間保存し、30日間が過ぎたら削除するというスクリプトです。

スクリプトを実行するための前準備として実行できる形にしてあげます。

[takeshich@foo ~]$ chmod a+x ./osgridbackup.sh

さらにバックアップデータの保存先を準備します。

[takeshich@foo ~]$ mkdir osgridbackup

試しに実行してみます。

[takeshich@foo ~]$ ./osgridbackup.sh

実行後にバックアップデータの保存先にデータが格納されているかどうかを確認します。

[takeshich@foo ~]$ ls -lah ~/osgridbackup
  • osgrid_db_日付.gz
  • osgrid_files_日付.tar.bz2

があることを確認します。

スクリプトの定期実行

1日1回という頻度で実行するためには、cronを用います。
今回は、夜間に実行したいので、1日1回03:30に実行するようにします。

[takeshich@foo ~]$ crontab -e

以下を追加します。

30 3 * * * /home/takeshich/osgridbackup.sh

登録できたかどうか確認します。

[takeshich@foo ~]$ crontab -l
30 3 * * * /home/takeshich/osgridbackup.sh

と表示されることを確認します。

リストア

発生した障害*3程度にもよりますが、データベースをリストアしたい場合で、データベースが存在する場合は、バックアップデータを格納しているディレクトリでデータベースのダンプを解凍します。

[takeshich@foo ~]$ gzip -d osgrid_db_日付.gz

対象のデータベースにバックアップとして取っていたダンプをインポートしてあげます。

[takeshich@foo ~]$ mysql -u opensim -ppassword --databases opensim < osgrid_db_日付

データベースが存在しない場合は、まず、rootでデータベースとユーザを作ってあげます。

mysql> create database opensim character set utf8;
mysql> create user 'opensim'@'localhost' identified by 'password';
mysql> grant all privileges on opensim.* to 'opensim'@'localhost';
mysql> flush privileges;
mysql> quit

インポートする器ができたので、データベースのダンプを解凍します。

gzip -d osgrid_db_日付.gz

対象のデータベースにバックアップとして取っていたダンプをインポートしてあげます。

mysql -u opensim -ppassword --database opensim < osgrid_db_日付

としてあげれば、戻るはずです。

設定ファイルについては、設定ファイルのバックアップを解凍します。

[takeshich@foo ~]$ tar xvfj osgrid_files_日付.tar.bz2

解凍されたファイルをコピーしてあげます。

cp ./OpenSim.ini (Osgridの実行ファイルを回答したディレクトリ)/bin/OpenSim.ini
cp ./config-include/GridCommon.ini  (Osgridの実行ファイルを回答したディレクトリ)/bin/config-include/GridCommon.ini
cp ./config-include/FlotsamCache.ini (Osgridの実行ファイルを回答したディレクトリ)/bin/config-include/FlotsamCache.ini
cp ./Regions/Regions.ini (Osgridの実行ファイルを回答したディレクトリ)/bin/Regions/Regions.ini

システム的なバックアップ以外の方法

システム的なバックアップ手法とは別にOARsとしてエクスポートする方法などがあります。
http://opensimulator.org/wiki/OpenSim_Archives
に記述されています。容量がデータベースよりもかなり多くなるようです。

*1:これを書いている2012/03/21に512のプランがなくなるというプレスリリースがありました。

*2:http://d.hatena.ne.jp/takeshich/20120307/1331136918

*3:やっちまった