マスターサーバーが遠隔地にあって、その間の回線が遅いとき場合などに、ローカルネットワーク上に スレーブサーバーを設置します。クライアントは、常にスレーブサーバーを使用するようにします。 チェックアウト、更新、ログの閲覧等の読み込みアクセスは、ローカルネットワークで処理できるので 高速に処理できます。そしてクライアントはスレーブサーバーに対してコミットすれば、「透過的に」 マスターサーバーにも反映されます。大部分のアクセスは読み込みアクセスだけなのでスループットを 改善することができます。
必要な バージョン | |
---|---|
マスターサーバー | 任意 (ただし svnsync を使用する場合 1.4 以降) |
スレーブサーバー | ver 1.5 以降 |
クライアント | 任意 |
# 通常の 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>
# 通常の 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>
一番手抜きの実装
exit 0
$ svnsync init http://192.168.60.1/sync http://192.168.60.128/svn リビジョン 0 の属性をコピーしました。
#!/bin/sh /usr/bin/svnsync sync http://192.168.60.1/sync
#!/bin/sh REPOS="$1" REV="$2" USER="$3" PROPNAME="$4" ACTION="$5" /usr/bin/svnsync copy-revprops http://192.168.60.1/sync $REV
$ svnsync init http://192.168.60.1/svn http://192.168.60.128/svn svnsync: リポジトリが、リビジョン属性を変更できるようにはなっていません。 管理者に pre-revprop-change フックを作成するよう頼んでください
エラーメッセージの通り、pre-revprop-change フックスクリプトを作成して リビジョン属性を変更できるように設定してください。
$ 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 ) を用意して そこにアクセスするようにしてください。
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>
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>