svnsyncを使ったリポジトリミラーの作成（未了）

# 作りたいもの
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のビルド 

```bash:subversionのビルド（その1）

#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
```

```apache:neon.conf
/usr/local/neon/lib
```

```bash:subversionのビルド（その2）

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
```

```apache:swig.conf

/usr/local/swig/lib

```

```bash:subversionのビルド（その3）

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
```

```bash:ミラー先のリポジトリを作成

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/ 

```

```bash:pre-revprop-change
#!/bin/sh
exit 0
```

# svnsyncの自動実行

## syslogdでのログ出力
```bash:/etc/syslog.conf
# 下を追記
# svnsync
local6.*     /var/log/svnsync
```

```bash:/etc/syslog.conf変更の反映
/etc/init.d/syslog restart
```

/data/repository下のリポジトリを全てsvnsyncするスクリプト。
ミラー先・ミラー元ともにリポジトリは全て同一ディレクトリにあるものとする。

```bash:/data/script/sync_all.sh
#!/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

```

クーロンで定期実行。
ただし、新しいリポジトリを作成するときに一時的に止めないと具合が悪いかも。

```text:crontab
*/20 * * * * /data/script/sync_all.sh 
```


ログの出力例

```text:/var/log/svnsync
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の設定ファイルを作成する。
設定値は運用しながらつめる。

```text:/etc/logrotate.d/svnsync
/var/log/svnsync {
monthly
rotate 3
compress
delaycompress
missingok
}
```
## ログの監視

まだ。できればミラーリングの失敗ですぐに気づきたい。
local6.err以上で mailにパイプさせればよい？

設定と稼動状況がサーバの中に入り込んでしまうので、
その辺りを別の何か(Jenkinsとか)にシゴトしてもらってもいいかもしれない。

-------------------
Subversion1.7って必死にビルドしなくても、CollabNetのものを使えば簡単だったのか？
http://www.collab.net/downloads/subversion#tab-1