トップに戻る 最初に戻る 前に戻る 次へ進む
$Date: 2014-08-14 17:26:53 +0900 (2014/08/14 (木)) $
$Revision: 973 $

Subversion WebDAV 透過ライトスループロキシ

概要

Subversion 1.5 の新機能である WebDAV 透過ライトスループロキシ(WebDAV Transparent Write-Through Proxy) に関して解説します。

リンク

前提条件

WebDAV 透過ライトスループロキシ とは?

WebDAV 透過ライトスループロキシとは Subversion 1.5 で導入される、一種のレプリケーション(複製)機能です。 マスターサーバー 1 つと、1 つ以上のスレーブサーバーで構成されます。

適用例

マスターサーバーが遠隔地にあって、その間の回線が遅いとき場合などに、ローカルネットワーク上に スレーブサーバーを設置します。クライアントは、常にスレーブサーバーを使用するようにします。 チェックアウト、更新、ログの閲覧等の読み込みアクセスは、ローカルネットワークで処理できるので 高速に処理できます。そしてクライアントはスレーブサーバーに対してコミットすれば、「透過的に」 マスターサーバーにも反映されます。大部分のアクセスは読み込みアクセスだけなのでスループットを 改善することができます。

読み込みアクセスの場合

  1. ユーザーはスレーブサーバー(のうちの一つ)にアクセスします
  2. スレーブサーバーは、ローカルのリポジトリにアクセスしてユーザーに結果を返します。
読み込みアクセスの場合、マスターサーバーにアクセスする必要がありません。 また、スレーブサーバーは複数用意することが可能です。

書き込みアクセスの場合

  1. ユーザーはスレーブサーバー(のうちの一つ)にアクセスします
  2. スレーブサーバーは、マスターサーバーにリクエストをスルーします。
  3. マスターサーバーは、ローカルのリポジトリに変更をコミットします。
  4. (post-commit フックを通じて)マスターサーバーから スレーブサーバーに svnsync により変更を反映させます。

注意事項

本機能には、一点注意しないといけない点があります。 Subversion 1.5 で実装されている WebDAV Write Though Proxy には一点欠陥があります。 それは、ユーザーがコミットしたときに、マスターサーバーのリポジトリは更新されますが、 スレーブサーバーのリポジトリは自動的には更新されないことです。 マスターサーバーで post-commit フックスクリプトを作成してマスターサーバーから スレーブサーバー側に変更を反映させなければいけません。これは svnsync を使って 実現します。

必要なバージョン

必要な Subversion のバージョン
必要な バージョン
マスターサーバー 任意 (ただし svnsync を使用する場合 1.4 以降)
スレーブサーバー ver 1.5 以降
クライアント 任意

参考:

WebDAV Write Through Proxy の設定方法

  1. マスターサーバーの httpd.conf 設定
  2. スレーブサーバーの httpd.conf 設定
  3. スレーブサーバーの pre-revprop-change フックスクリプト設定
  4. スレーブサーバーを svnsync が使えるように初期化
  5. マスターサーバーの post-commit フックスクリプト設定
  6. マスターサーバーの post-revprop-change フックスクリプト設定

マスターサーバーの httpd.conf 設定

特に注意する点はありません。通常通り Subversion 用の設定を行います。

スレーブサーバーの httpd.conf 設定

設定のポイントは 3点です。
  1. SVNMasterURI という新しいキーワードを使って マスターサーバーの URI(URL) を指定します。
  2. (Apache 2.2 で)mod_proxy.so を有効にする。
  3. svnsync を使ってマスターサーバーからスレーブサーバーに 最新のデータを反映させるための専用 URL の設定

マスターサーバーの post-commit フックスクリプト設定

svnsync を利用して同期するためのスクリプトを作成します。

スレーブサーバーの pre-revprop-change フックスクリプト設定

pre-revprop-change フックスクリプトを変更して、リビジョン属性の 変更を許可します。

マスターサーバーの post-revprop-change フックスクリプト設定

Post-revprop-change フックスクリプトを作成して、ユーザーがリビジョン属性を 変更した場合に svnsync で同期させます。

WebDAV Write Through Proxy の設定の具体例

例での条件

マスターサーバーの httpd.conf

# 通常の Subversion で必要なモジュールのロード
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule dav_svn_module modules/mod_dav_svn.so

<Location /svn>
	DAV svn
	SVNPath /var/svn/repos
</Location>

スレーブサーバーの httpd.conf

# 通常の Subversion で必要なモジュールのロード
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule dav_svn_module modules/mod_dav_svn.so

# SVNMasterURI を使用するために mod_proxy のロードする必要があります。
LoadModule proxy_module modules/mod_proxy.so

# クライアントアクセス用
<Location /svn>
	DAV svn
	SVNPath D:/subversion/repos
	SVNMasterURI http://192.168.60.128/svn
</Location>


# svnsync 専用
<Location /sync>
	DAV svn
	SVNPath D:/subversion/repos
</Location>

スレーブサーバーの pre-revprop-change フックスクリプト設定

以下のスクリプトを作成して、スレーブサーバーに設置します。

一番手抜きの実装

exit 0

スレーブサーバーを svnsync 用に初期化

$ svnsync init http://192.168.60.1/sync http://192.168.60.128/svn
リビジョン 0 の属性をコピーしました。

マスターサーバーの post-commit フックスクリプト設定

以下のスクリプトを作成して、マスターサーバーに設置します。
#!/bin/sh

/usr/bin/svnsync sync http://192.168.60.1/sync

マスターサーバーの post-revprop-change フックスクリプト設定

以下のスクリプトを作成して、マスターサーバーに設置します。
#!/bin/sh

REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
ACTION="$5"

/usr/bin/svnsync copy-revprops http://192.168.60.1/sync $REV

Trouble Shooting

svnsync init に失敗する (1)

$ svnsync init http://192.168.60.1/svn http://192.168.60.128/svn
svnsync: リポジトリが、リビジョン属性を変更できるようにはなっていません。
管理者に pre-revprop-change フックを作成するよう頼んでください

エラーメッセージの通り、pre-revprop-change フックスクリプトを作成して リビジョン属性を変更できるように設定してください。

svnsync init に失敗する (2)

$ svnsync init http://192.168.60.1/svn http://192.168.60.128/svn
svnsync: DAV リクエストに失敗しました。リポジトリの pre-revprop-change フックが機能不全であるか存在
しない可能性があります
svnsync: 1 つ以上の属性を変更できませんでした。リポジトリに変更は加えられていません
svnsync: 属性 sync-lock を設定中にエラーが発生しました:
could not remove a property

SVNMasterURI を使用しているパスに対して svnsync init を設定しようとした場合に起こります。 設定例で説明しているように svnsync 用に別の URL (http://192.168.60.1/sync ) を用意して そこにアクセスするようにしてください。

スレーブサーバーへのコミットに失敗する (1)

マスターサーバーとスレーブサーバーの Location で 指定するパスが一致していない場合のエラーメッセージ。
D:\tmp\svn>svn ci -m "test"
svn: コミットに失敗しました (詳しい理由は以下のとおりです):
svn: PROPFIND リクエスト (相手: '/svn/trunk') が失敗しました
svn: パス '/svn/trunk' が見つかりません

マスターサーバーの httpd.conf

<Location /svn>
	DAV svn
	SVNPath /var/svn/repos
</Location>

スレーブサーバーの httpd.conf

<Location /test>
	DAV svn
	SVNPath D:/subversion/repos
	SVNMasterURI http://192.168.60.128/svn
</Location>

修正後のスレーブサーバーの httpd.conf

<Location /svn>
	DAV svn
	SVNPath D:/subversion/repos
	SVNMasterURI http://192.168.60.128/svn
</Location>

スレーブサーバーへのコミットに失敗する (2)

SVNMasterURI の指定が間違っている場合のエラーメッセージ
D:\tmp\svn>svn ci -m "test"
svn: コミットに失敗しました (詳しい理由は以下のとおりです):
svn: サーバが、リクエストへのレスポンスとして予想外の戻り値 (405 Method Not Allowed) を送信してきま
した (リクエスト: MKACTIVITY, URL: '/svn/!svn/act/89c76672-7906-234d-bfe4-9beaf31bd6ac')

マスターサーバーの httpd.conf

<Location /svn>
	DAV svn
	SVNPath /var/svn/repos
</Location>

スレーブサーバーの httpd.conf

<Location /svn>
	DAV svn
	SVNPath D:/subversion/repos
	SVNMasterURI http://192.168.60.128/repos/svn
</Location>

修正後のスレーブサーバーの httpd.conf

<Location /svn>
	DAV svn
	SVNPath D:/subversion/repos
	SVNMasterURI http://192.168.60.128/svn
</Location>