当サイトでは、そもそもがSubversion自体が「履歴機能付きのバックアップツール」という位置づけで紹介しています。
確かに最新ファイルは各ユーザの手元と、Subversionリポジトリ内に保管されているので、安心です。
では、過去の履歴はどうでしょうか?
大抵の場合は過去の履歴はSubversionリポジトリ内にだけしかありません。つまりサーバが壊れれば、過去の履歴は消えてしまいます。これでは魅力半減です。そこで・・・。
方法1:サーバ全体をバックアップ
通常(かどうかは分かりませんが、少なくとも私たちは)、サーバのディスクはRAIDを組んでいたり、定期的にバックアップを取っています。
また、データセンターならば、自然災害などにもかなり対応できます。
これらの対策で十分に安全で、これまでに困った事態に陥ったことは一度もないのですが、最近少しばかり事情が変わってきました。
さらに多重化!
事情の変化とは、顧客の増加に伴い、「万が一にも消えては困るデータ」が増えてきたこと。
それと、「万が一サーバが止まっても、すぐに復旧させたい」というケースが出てきました。
正確には、お客さんから要望が出たわけではなく、あくまでもサービスを提供する側の責任として、この程度の体制は取っておこうということなのですが・・・。
で、SVNリポジトリをミラーリングすることにしました。
仮に本家のサーバがダウンしても、ミラーリングサーバに切り替えれば、すぐに復旧可能です。
方法2:svnsync でミラーリング
バックアップ元を xxx.yyy.zzz というサーバの「リポジトリ名」というリポジトリとし、http://xxx.yyy.zzz/リポジトリ名 でアクセスできるものとします。
バックアップ先は別のマシン(Linux)とします。まず、バックアップ先のマシンにリポジトリを作り(名前はバックアップ元と同じにします)、同期設定をします。
設定も運用も、バックアップ先(バックアップを取る側)だけの作業です。
# svnadmin create リポジトリ名
# chown -R apache:apache リポジトリ名
# cat > リポジトリ名/hooks/pre-revprop-change << EOT
> #! /bin/sh
> exit 0
> EOT
# chmod +x リポジトリ名/hooks/pre-revprop-change
# svnsync init file:///var/lib/svn/リポジトリ名 http://xxx.yyy.zzz/リポジトリ名
これで準備完了です。場合によってはユーザ名とパスワードを求められますので入力するか、svnsyncコマンドの引数に “–username ユーザ名 –password パスワード” 引数をつけてください。
同期するときは、
# svnsync sync file:///var/lib/svn/リポジトリ名
です。
これを例えば crontab コマンドで、1時間おきとかに実行すれば、簡単なミラーリングが実現できます。
手作業で実行してもいいですし。
post-commit で完全にミラーリング
方法2からもう少し頑張れば、完全ミラーリングを実現できます。
svnsyncコマンドを、本家リポジトリ(バックアップ元)へのコミットと同時に実行するのです。
そのためのファイルが、”リポジトリ/hooks/post-commit” です。このファイルは、コミット後に実行したいコマンドを書けますので、(注意:本家リポジトリ(バックアップ元)の中です!)
#! /bin/sh
svnsync sync バックアップ先リポジトリのURL
として、chmod +x で実行可能にしておけばOK。
注意点は、バックアップ元のマシンから、バックアップ先のリポジトリを操作するので、http://~~などでバックアップ先リポジトリにアクセスできる必要があることです。同じマシン内ならば、file:///~~で構いません。
コミットのたびに本家と分家の両方にコミット動作が入るので、若干遅くなります。どうしても気になるようなら、crontab の方法を取るしかないでしょう。