よかろうもん!

アプリからインフラまで幅広くこなすいまどきのクラウドエンジニアが記す技術ブログ

Subversion WebDAV transparent write-through proxy を試してみた〜導入編〜

Subversion 1.5 のリリースより、レプリケーション機能が追加されています。
マスタサーバ、スレーブサーバの構成であり、ユーザからのcheck outやexportなどの
読み込みアクセスに関しては、スレーブサーバが応答し、commitやimportなどの
書き込みアクセスについてはスレーブサーバはマスタサーバにリクエストを
スルーするというものです。
この機能は、マスターサーバーが遠隔地に配置されており、
その間の回線が遅いときなどに役に立ちます。

それでは早速、テスト環境を整備していきます。
OSはCentOS5.2を使用し、マスタサーバおよびスレーブサーバに
インストールするミドルウェアは以下の通りです。

ちなみに WebDAV transparent write-through proxy 機能を利用するためには、
subversionが1.5以降であることと、apacheが2.2系である必要があります。

apacheのインストール

# tar xvzf httpd-2.2.10.tar.gz
# cd httpd-2.2.10
# ./configure \
--prefix=/usr/local/apache/2.2.10 \
--enable-dav --enable-dav-fs \
--enable-rewrite \
--enable-proxy \
--enable-ssl \
--enable-cgid \
--with-ldap --enable-authnz-ldap --enable-ldap \
--enable-headers \
--with-mpm=prefork
# make
# make install

※マスタサーバについては、enable-proxyオプションはつけなくてもよいです。

subversionのインストール

# tar xvzf subversion-1.5.4.tar.gz
# tar xvzf subversion-deps-1.5.4.tar.gz
# cd subversion-1.5.4
# ./configure \
--prefix=/usr/local/subversion/1.5.4 \
--with-apxs=/usr/local/apache/2.2.10/bin/apxs
# make
# make install

ミドルウェアのインストールが終了したら、
以下のような構成で設定をしていきます。

マスタサーバでリポジトリの作成

[svn-master]$ svnadmin create /var/svn/repos/test

リポジトリを作成したあとは、HTTPアクセスができるようにします。

[svn-master]$ vi /usr/local/apache/2.2.10/conf/httpd.conf

・・・(略)
# for subversion

DAV svn
SVNPath /var/svn/repos/test

それでは、apacheを起動して、テストコミットをしてみます。

[svn-master]$ sudo /usr/local/apache/2.2.10/bin/apachectl start
[svn-master]$ svn co http://localhost/svn
[svn-master]$ cd svn
[svn-master]$ touch subversion.txt
[svn-master]$ svn add subversion.txt
[svn-master]$ svn ci -m "Test Commit"
送信しています subversion.txt
ファイルのデータを送信しています .
リビジョン 1 をコミットしました。

チェックアウトおよびコミットが正常に操作できることが確認できました。

スレーブサーバでの設定

まずはじめに、スレーブサーバではマスタサーバのリポジトリと同期をとるためのリポジトリを作成します。

[svn-slave]$ svnadmin create /var/svn/repos/test

レプリケーション機能を利用するために、Subversionのリビジョンログの変更を許可する設定をしておきます。#処理は不要です。

[svn-slave]$ vi /var/svn/repos/test/hooks/pre-revprop-change
#!/bin/sh
exit 0

フックスクリプトには実行権限を与えておきます。

[svn-slave]$ chmod +x /var/svn/repos/test/hooks/pre-revprop-change

続いてapacheの設定です。

[svn-slave]$ sudo vi /usr/local/apache/2.2.10/conf/httpd.conf
・・・(略)
# for subversion
# クライアントアクセス用

DAV svn
SVNPath /var/svn/repos/test
SVNMasterURI http://192.168.1.16/svn


# svnsync 専用

DAV svn
SVNPath /var/svn/repos/test

apacheの設定が完了したらapacheを起動してきます。

[svn-slave]$ sudo /usr/local/apache/2.2.10/bin/apachectl start

ここまでできたら、マスタサーバのリポジトリとスレーブサーバのリポジトリの同期をとりましょう。#初回のみinitで実施する必要があります。

[svn-slave]$ svnsync init http://192.168.1.17/sync/ http://192.168.1.16/svn/
リビジョン 1 の属性をコピーしました。

マスタサーバでの設定

スレーブサーバのリポジトリと同期がとれましたので、書き込み処理(commit)が発生した場合に、スレーブサーバのリポジトリと常に同期するようにします。

[svn-master]$ vi /var/svn/repos/test/hooks/post-commit
#!/bin/sh
/usr/local/subversion/1.5.4/bin/svnsync sync http://192.168.1.17/sync/

[svn-master]$ chmod +x /var/svn/repos/test/hooks/post-commit

最後にマスターサーバーのpost-revprop-changeを設定しておきます。

[svn-master]$ vi /var/svn/repos/test/hooks/pre-revprop-change
#!/bin/sh

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

/usr/local/subversion/1.5.4/bin/svnsync copy-revprops http://192.168.1.17/sync/ $REV

[svn-master]$ chmod +x /var/svn/repos/test/hooks/pre-revprop-change

これで WebDAV Transparent Write-Through Proxy で動作させるための
設定は終了ですので、スレーブサーバのリポジトリからcheckoutし、
ファイルを編集してコミットし、マスタサーバおよびスレーブサーバの
リポジトリが更新されることを確認してみてください。

今回、WebDAV Transparent Write-Through Proxy の基本動作は確認できましたので、
次回のエントリでは、本システムの一部が正常に動作していない場合に、
WebDAV Transparent Write-Through Proxy がどのような振る舞いをするかを
確認してみたいと思います。