投稿日 2008年4月28日 月曜日 カテゴリ backup 投稿者 omaeコメントは受け付けていません。 

ccollect – (pseudo) incremental backup with different exclude lists using hardlinks and rsync

社内の Subversion, Trac, tDiary などを実行しているサーバがあるのですが、これらのデータの世代別バックアップを取るのに ccollect を使っています。

ccollect で特徴的なところは、rsync によりインクリメンタルなバックアップを実行するようになっており shell script で出来ているところです。また、変更のないファイルは hardlink が作成されディスクを消費しないように出来ています。

インストール

現状 ccollect をパッケージにしている Linux distributor はないようなので、ソースからインストールします。まず ccollect のサイトから ccollect-0.7.0.tar.bz2 をダウンロードします。

展開する場所は、ここでは /usr/local/share にインストールすることにします。

$ tar xjf ccollect-0.7.0.tar.bz2 -C /usr/local/share

/usr/local/share/ccollect-0.7.0 に展開されます。

後で役に立つかも知れないので /usr/local/share/ccollect でアクセスできるように symlink を作成しておきます。

$ ln -s ccollect-0.7.0 /usr/local/share/ccollect

設定

ccollect の設定ファイルは /etc/ccollect ディレクトリに置きます。環境変数 CCOLLECT_CONF で指定すれば別のディレクトリに置くことも出来ます。

今回は /var, /home, /etc をバックアップ対象として 60 日保存されるように設定しました。

mkdir /etc/ccollect

interval

まずは 60 日保存をデフォルトの設定として /etc/ccollect/defaults/intervals/daily に書き込みます。

mkdir -p /etc/ccollect/defaults/intervals
echo -n 60 >/etc/ccollect/defaults/intervals/daily

source

次は /etc/ccollect/sources ディレクトリにバックアップの設定を対象ごとに記述します。

mkdir /etc/ccollect/sources
# /var
mkdir /etc/ccollect/sources/var
echo '/var' >/etc/ccollect/sources/var/source
echo '/disk/backups/var' >/etc/ccollect/sources/var/destination
echo '/var/tmp' >/etc/ccollect/sources/var/exclude
echo '/var/cache' >>/etc/ccollect/sources/var/exclude
# /home
mkdir /etc/ccollect/sources/home
echo '/home' >/etc/ccollect/sources/home/source
echo '/disk/backups/home' >/etc/ccollect/sources/home/destination
# /etc
mkdir /etc/ccollect/sources/etc
echo '/etc' >/etc/ccollect/sources/etc/source
echo '/disk/backups/etc' >/etc/ccollect/sources/etc/destination

上記のように source にバックアップ元を、destination にバックアップ先を書き込んでおくだけです。 またバックアップ対象から除外したい場合には exclude ファイルに対象となるディレクトリをリストしておきます。

バックアップの直前でコマンドを実行することやリモートマシンにあるディレクトリをバックアップすること(rsync + ssh で)も出来ますので、より細かな設定は Source configuration を見てください。

バックアップ実行

後は次のコマンドを1日1回実行すれば、すべてのバックアップ元に対して 60 日保存のバックアップが実行できます。

/usr/local/share/ccollect/ccollect.sh -a daily

手動で実行してバックアップができているか試しておきます。

$ ls -l /disk/backups/var
total 0
drwxr-xr-x 3 root root 16 2008-04-24 04:51 daily.20080424-0451.17298
drwxr-xr-x 3 root root 16 2008-04-25 04:51 daily.20080425-0451.17953
drwxr-xr-x 3 root root 16 2008-04-26 04:51 daily.20080426-0451.18710
drwxr-xr-x 3 root root 16 2008-04-27 04:51 daily.20080427-0451.19905
drwxr-xr-x 3 root root 16 2008-04-28 04:51 daily.20080428-0451.20670

うまくいっていれば上記のようなディレクトリが出来ているはずです。

バックアップ対象ごとに設定可能な項目

最後にバックアップごとに指定できる項目を列挙しておきます。

source

バックアップ対象のパスを rsync が理解できる形式でテキストで記述します。

destination

バックアップ先のディレクトリをテキストで記述します。

verbose

/etc/ccollect/sources/NAME/verbose というファイルがあると verbose モードになります。 実際には rsync に -v オプションが渡ります。

very_verbose

verbose モードよりも更に verbose になります。これもファイルがあるとこのモードになります。 実際には mkdir -v, rm -v, rsync -vv で実行されます。

summary

rsync が終わったときにサマリーを出力させたい場合には summary ファイルを作成しておきます。

exclude

exclude ファイルにはバックアップ対象から除外したいパスを一行ずつ記述します。

rsync_options

rsync に渡したいオプションがあれば、rsync_options ファイルに一行ごとに記述します。

pre_exec

このファイルが用意すとバックアップ元に対してバックアップを開始する前に実行してくれます。 pre_exec を実行しようとするので、pre_exec ファイルは実行可能にしておきます。

post_exec

pre_exec はバックアップの開始前ですが、post_exec はバックアップの終了後に実行されます。 このファイルも同様に実行可能にしておきます。

delete_incomplete

このファイルがあると、バックアップが不完全だった場合に不完全になったバックアップ先のディレクトリを削除するようになります。

remote_host

バックアップ先を自マシンではなくて、別のマシンにしたい場合にはこの remote_host ファイルにそのホスト名を記述します。

投稿日 2008年4月21日 月曜日 カテゴリ CMS, MODx, MySQL, rsync 投稿者 sugimotoコメント(0) » 

OpenGrooveの検索アプライアンスサーバ「zeera document search」の製品サイトはMODx CMSを利用して構築しています。

サイトの更新は

  1. 別に用意したテスト環境で更新
  2. 更新に問題がないか社内でチェック
  3. 本番環境に更新分を反映

という手順でやっているのですが、#3の反映作業は手作業にすると、手間がかかり、反映漏れが出るもとになります。

そこで、ssh, rsync, mysqldumpを使って、#3の手順を自動化し、更新分を確実に反映することにしました。

1. 反映の方法

自動化の方法の概要を簡単に説明すると以下の通りです。

- rsyncでディレクトリの同期

MODx CMSは、

   top --- manager
        +- assets

というディレクトリ構造をしていて、assetsにテンプレート,CSS,imageなどが保存されています。 逆にmanagerにはMODxのコアスクリプトと設定ファイルがあります。 そのため、assetsをrsyncで同期することにします。

- データベースの更新

MODx CMSはMySQLでデータを保存しています。 環境依存なデータはsite_settingsテーブルに集約されているため、このテーブル以外をコピーします。

- サーバ間の接続はSSHを使用する

自動化するためにパスフレーズなしの鍵をつくり、自動接続して本番環境にデータを転送します。

2. サーバの設定

自動化のためにテストサーバから本番サーバにSSHで接続するための環境を作ります。

- 鍵の作成

テストサーバで鍵を作成します。

> ssh-keygen -t rsa

パスフレーズを聞かれますが、入力せずにリターンキーを押し、パスフレーズなしで作成します。 出来上がった公開鍵は本番サーバに転送し、/home/[user]/.ssh/authorized_keysに入れておきます。

3. データベースの更新の設定

mysqldumpでテスト環境のデータベースをdumpして、本番環境にdumpデータを反映します。

まず、テスト環境のデータをコピーし、本番環境に反映するためのSQL文のファイルを生成するシェルスクリプトを用意します。

[dump_modx_data.sh]

#!/bin/bash
work_dir=/home/user/xxxxx
filename=dumpfile.dump
file_path=$work_dir$filename

echo "" > $file_path

# データを削除するSQL文をファイルに書き込み
echo "TRUNCATE TABLE active_users;" >> $file_path
...site_settings 以外のテーブルについて同じ

# データを INSERT するSQL文をファイルに書き込み
mysqldump -u [user] -p[password] [database] --no-create-info \
        --tables [テーブルを列挙] >> $file_path

これで、データベース反映用のSQLスクリプトがダンプされます。

4. データベース反映用のSQLスクリプトを本番サーバで実行する

次に、先ほどのシェルスクリプトで作成したデータベース反映用のSQLスクリプトを本番サーバで実行します。

[insert_dumpfile.sh]

#!/bin/bash
work_dir=/home/user/workdirectory
filename=dumpfile.dump
file_path=$work_dir$filename
#本番サーバで実行するシェルスクリプト
command=remote_commands.sh

#SQLスクリプトを本番サーバにコピー
scp $file_path remoteuser@remoteserver:/temporary/dir/.
#sshでログインしてSQLスクリプトを実行
ssh -l remoteuser remoteserver < $work_dir$command
#作業後に削除
rm -f $file_path

[remote_commands.sh] < 本番サーバー上で実行されるシェルスクリプト

#!/bin/bash
filename=/temporary/dir/dumpfile.dump
mysql -u [user] -p[password] [database] < $filename
rm -f $filename

5. rsync でディレクトリをコピーする

スタイルシートや、画像ファイルはデータベースには保存されていないので、rsyncでディレクトリの同期をして本番サーバに反映します。assets ディレクトリ全体を同期の対象にします。

[rsync_assets.sh]

#!/bin/bash
#rsyncコマンドでassetsディレクトリの同期
#削除されたファイルも反映する
#remoteディレクトリは親ディレクトリを指定する
rsync -a --delete --exclude "cache/docid_*.pageCache.php" /path/to/local remoteserver:/parent/path/to/remote    

6. 反映の実行

これまでに作成したシェルスクリプトを

  1. dump_modx_data.sh
  2. insert_dumpfile.sh
  3. rsync_assets.sh

の順に実行すると自動的にテストサーバーのデータが本番サーバーに反映されます。

3つのファイルを一つにまとめて、cronに登録しておけば、毎晩、自動的にテストサーバーのデータが本番サーバーに反映されます。