はじめに
Subversionはこれまでで最も人気のあるオープンソースのバージョン管理システムであり、実際、その評価は当然と言えます。最小単位でのコミット(アトミックコミット)、高速なブランチ/タグ作成、効率的なバイナリファイル処理、HTTPおよびWebDAVでのアクセスなど、数々の強力な機能を備えており、多くの組織にとって利用価値の高い選択肢となっています。また、Subversion 1.5に搭載されている、より高度な機能、特にマージ追跡機能などは、このバージョン管理システムの価値を一層高めています。
優れたバージョン管理システムは、ソフトウェア開発を行う組織にとって戦略的に重要な意味を持ちます。開発者なら誰でも知っているように、ソースコードはIT組織のまさに「血液」です。従って、ソースコードを適切に管理することはビジネス的に意義のあることで、ソースコードリポジトリを使用する主なメリットの1つは、ソースコードが常に安全な場所にしっかり保管されているという保証です。
しかし、本当に保証されていると言えるでしょうか。
サーバーはクラッシュする可能性があり、ネットワークはダウンする可能性があります。火事が起きてデータセンターに被害が出ることもあるでしょう。このような非常事態に直面した場合に、ソースコードリポジトリを短期間のうちに必要な状態まで復元できる保証はあるでしょうか。はたして単純なファイルシステムのバックアップだけで十分でしょうか。
この記事では、Subversionリポジトリを安全かつ確実にバックアップし、最新の状態まで迅速に復元できるようにするためのいくつかの戦略を示します。また、ライトスループロキシという方式を使って単純ながら強力な高可用性ソリューションを構築する簡単な方法も紹介します。
最も基本的な方法:リポジトリをバックアップする
Subversionリポジトリのバックアップを取る主な理由は、何かあった場合に大切なソースコードを復元できるようにするためです。最も基本的なバックアップ戦略の1つは、単純に、データを安全な場所に定期的にコピーすることです。Subversionではこの作業を簡単に行えます。
デフォルトでは、SubversionリポジトリはFSFSというフラットファイル形式で保存されます。この形式は可搬性に優れ、複製や移動が簡単です。リポジトリをFSFS形式で保存しておくと、そのリポジトリファイルを適切なディレクトリにコピーするだけでリポジトリを復元できます。ただし、リポジトリをただ定期的に(例えば1時間ごとに)コピーした場合には、コミットが正しく反映されないおそれがあります。前回のバックアップからサーバーのクラッシュまでの間に、ユーザーがリポジトリにコミットした変更が失われてしまうのです。
この問題を回避するには、ユーザーがコミットしたときにデータが自動的にバックアップされるようにします。そのためにはSubversion Hooksを使用します。Hooksは、Subversionの上級ユーザーならば知っておきたい強力なスクリプティング機能です。Subversionリポジトリのhooksディレクトリは次のようなファイルが配置されているはずです。
Kapiti:repos johnsmart$ ls hooks/ post-commit.tmpl pre-lock.tmpl post-lock.tmpl pre-revprop-change.tmpl post-revprop-change.tmpl pre-unlock.tmpl post-unlock.tmpl start-commit.tmpl pre-commit.tmpl
これらは基本的に、Subversionのコミットライフサイクル中のいくつかのキーポイントで実行されるスクリプトです。例えば、post-commit
というスクリプトはsvn commit
操作の直後に毎回実行されます。
Subversionリポジトリを自動的にバックアップするには、このスクリプト内に、Subversionリポジトリ全体をバックアップするためのコマンドを記述します。こうしておくと、誰かが変更内容をリポジトリにコミットするたびに、リポジトリ全体が適切に複製され、安全な場所に配置されます。
ただし、この方法の大きな問題は、スケーラビリティがあまり高くないという点です。リポジトリが大きくなるにつれて、すべてのバージョンを保管するために必要な領域は大きくなり、リポジトリファイルをバックアップするのにかかる時間も長くなります。また、クラッシュ後にリポジトリを復元するのは極めて手動的な作業です。しかし、実はもっと良いソリューションがあります。「svnsync」というツールを使うのです。