作りたいもの
SVNサーバと同じリポジトリを持つミラーサーバ。
SVNサーバのホットスタンバイとして使用するためのもの。
ミラーリングが完了したリビジョンをミラーサーバにログ出力して欲しい。
ミラーリングの失敗時にメールを送信して欲しい。(未了)
構成
サーバ2台構成
- SVNサーバ
通常使用。クライアントが接続してコミットなりチェックアウトする。
- ミラーサーバ
SVNサーバのバックアップ兼ホットスタンバイ
手段の概要
svnsyncを使ったリポジトリのバックアップを行う。
レプリケーションサーバから、SVNサーバにhttp経由で変更内容を取得し、同期する。
同期はレプリケーションサーバがcronで定期的に実行する。
環境
SVNサーバ
- CentOS 5.9 Final
- Subversion 1.6.11-11.el5_9
- mod_dav_svn 1.6.11-11.el5_9
ミラーサーバ
- CentOS 5.9 Final
- Subversion 1.7.9
導入方法は http://www.softel.co.jp/blogs/tech/archives/3457 を参考にした
手順
Subversion 1.7.9のビルド
# Subversionのソースコード取得・解凍
wget http://mirrors.go-part.com/apache/subversion/subversion-1.7.9.tar.gz
tar xvfz subversion-1.7.9.tar.gz
# 依存 ライブラリの取得
wget http://www.sqlite.org/sqlite-amalgamation-3071300.zip
unzip sqlite-amalgamation-3071300.zip
mv sqlite-amalgamation-3071300 subversion-1.7.9/sqlite-amalgamation
cd subversion-1.7.9
svn co http://svn.apache.org/repos/asf/apr/apr/branches/1.3.x apr
svn co http://svn.apache.org/repos/asf/apr/apr-util/branches/1.3.x apr-uti
cd apr/
./buildconf
./configure --prefix=/usr/local/apr --enable-threads
make
make install
cd ../apr-util
yum install expat-devel
./buildconf
./configure --prefix=/usr/local/apr --with-apr=/usr/local/apr
make
make install
yum install -y zlib-devel
yum install -y libxml2-devel
cd ..
wget http://www.webdav.org/neon/neon-0.29.6.tar.gz
tar xvfz neon-0.29.6.tar.gz
./configure --prefix=/usr/local/neon --with-libxml2 --with-expat
make
make install
vi /etc/ld.so.conf.d/neon.conf
/usr/local/neon/lib
ldconfig
yum install pcre-devel.x86_64
cd../
wget http://prdownloads.sourceforge.net/swig/swig-2.0.10.tar.gz
tar xvfz swig-2.0.10.tar.gz
cd swig-2.0.10
./configure --prefix=/usr/local/swig
make
make install
vi /etc/ld.so.conf.d/swig.conf
/usr/local/swig/lib
ldconfig
yum install -y gettext-devel
cd ../subversion-1.7.9
./configure --prefix=/usr/local/svn --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr --with-neon=/usr/local/neon --with-swig=/usr/local/swig --without-jdk --without-berkeley-db --with-ssl
make
# 動作確認
subversion/svn/svn log http://svn.apache.org/repos/asf/incubator/celix/trunk/ --limit 10
make install
# 動作確認
svn --version
mkdir -p /data/repository
cd /data/repository
svnadmin create --fs-type=fsfs projectA
vi projectA/hooks/pre-revprop-change
chmod +x projectA/hooks/pre-revprop-change
svnsync init file:///data/repository/projectA/ http://192.168.0.1/svn/projectA/
svnsync sync file:///data/repository/projectA/
# cron辺りでまわすなら このあたりのオプションをつける。
svnsync --non-interactive --quiet file:///data/repository/projectB/
svnadmin create --fs-type=fsfs projectB
vi projectB/hooks/pre-revprop-change
chmod +x projectB/hooks/pre-revprop-change
svnsync init file:///data/repository/projectB/ http://192.168.0.1/svn/projectB/
svnsync sync --non-interactive file:///data/repository/projectB/
# !/bin/sh
exit 0
svnsyncの自動実行
syslogdでのログ出力
# 下を追記
# svnsync
local6.* /var/log/svnsync
/etc/init.d/syslog restart
/data/repository下のリポジトリを全てsvnsyncするスクリプト。
ミラー先・ミラー元ともにリポジトリは全て同一ディレクトリにあるものとする。
# !/bin/sh
REPO_DIR=/data/repository
for REPO in `find $REPO_DIR -maxdepth 1 -mindepth 1 -type d`
do
REPO_BASE=`basename $REPO`
svnsync sync --non-interactive file://${REPO}/ | logger -t svnsync_${REPO_BASE} -i -p local6.info
SYNC_EXIT=${PIPESTATUS[0]}
if [ $SYNC_EXIT != 0 ]; then
logger -t svnsync_${REPO_BASE} -i -p local6.err " ***** SYNC FAILED ***** "
fi
done
クーロンで定期実行。
ただし、新しいリポジトリを作成するときに一時的に止めないと具合が悪いかも。
*/20 * * * * /data/script/sync_all.sh
ログの出力例
May 30 08:13:53 localhost svnsync_projectA[25995]: Committed revision 569.
May 30 08:13:53 localhost svnsync_projectA[25995]: Copied properties for revision 569.
May 30 08:13:53 localhost svnsync_projectA[25995]: Transmitting file data .
May 30 08:13:53 localhost svnsync_projectA[25995]: Committed revision 570.
May 30 08:13:53 localhost svnsync_projectA[25995]: Copied properties for revision 570.
May 30 08:13:53 localhost svnsync_projectB[26011]: Transmitting file data .
May 30 08:13:53 localhost svnsync_projectB[26011]: Committed revision 579.
May 30 08:13:53 localhost svnsync_projectB[26011]: Copied properties for revision 579.
May 30 08:13:53 localhost svnsync_projectB[26011]: Transmitting file data .
May 30 08:13:53 localhost svnsync_projectB[26011]: Committed revision 580.
May 30 08:13:53 localhost svnsync_projectB[26011]: Copied properties for revision 580.
ログのローテート(logrolated)
logrotatedの設定ファイルを作成する。
設定値は運用しながらつめる。
/var/log/svnsync {
monthly
rotate 3
compress
delaycompress
missingok
}
ログの監視
まだ。できればミラーリングの失敗ですぐに気づきたい。
local6.err以上で mailにパイプさせればよい?
設定と稼動状況がサーバの中に入り込んでしまうので、
その辺りを別の何か(Jenkinsとか)にシゴトしてもらってもいいかもしれない。
Subversion1.7って必死にビルドしなくても、CollabNetのものを使えば簡単だったのか?
http://www.collab.net/downloads/subversion#tab-1