2. FreeBSD 10.4 RELEASE - subversion - バックアップ

 
2.1 能書き
2.2 バックアップリポジトリの作成
2.3 WEBアクセス設定
2.4 初期化
2.5 同期
2.6 定期的なバックアップ

2.1 能書き

 ここで説明するバックアップというのは、テープ装置にバックアップをとるというような話でなく。  別にバックアップ用のサーバをたてて、定期的にバックアップをとる方法の説明です。  バックアップサーバがもう一台あって、定期的なバックアップをとっていれば、もし不幸にもマスタの Subversion サーバが故障しても、リポジトリの向く先をバックアップサーバに切り替えれば、少なくとも最後にバックアップした時点までは、戻せるし。  差分がなければ、クライアント側では何事もなかったかのように作業が続けられるわけです。

2.2 バックアップリポジトリの作成

 バックアップサーバは、同じ OS でなくてもよいし、極端に違うのでなければ、Subversion サーバアプリケーションのバージョンが違っていてもかまいません。  サーバのバージョンが違う場合、マスタサーバの方が新しいほうがよいようです。  前ページで作成したリポジトリのバックアップを行うとすれば「11.1.2 リポジトリの作成」までの手順はバックアップサーバ側も同様です。

2.3 WEBアクセス設定

 WEB経由でアクセスできるように設定します。  /usr/local/etc/apache24/httpd.conf の設定は前ページと同様です。  /usr/local/etc/apache24/Includessvn.conf は、シェルスクリプトで定期的にバックアップをとることと、バックアップのみの間は、マスタサーバからしかアクセスさせないようにするので少し変えておきます。

<Directory "/usr/local/www/svn/">
    Options Followsymlinks
    AllowOverride All

    <RequireAll>
        <RequireAny>
            Require ip  ← マスタサーバの IP アドレスを記述
        </RequireAny>
    </RequireAll>
</Directory>

<Location /svn>
    <IfModule dav_module>
	DAV svn
	SVNParentPath 	/usr/local/www/svn
    </IfModule>

    SSLRenegBufferSize 100000000

    <RequireAll>
        <RequireAny>
            Require ip  ← マスタサーバの IP アドレスを記述
        </RequireAny>
    </RequireAll>
</Location>
 定義ファイルの記述に誤りがないか確認をして apache を再起動します。

> /usr/local/etc/rc.d/apache22 configtest
> /usr/local/etc/rc.d/apache22 restart

2.4 初期化

 マスタサーバ側でバックアップサーバ側のリポジトリを初期化します。

> svnsync init https://バックアップ側のリポジトリのURL  file://マスタサーバ側のリポジトリのディレクトリ
 マスタサーバ側は file:// から始まりますので、ディレクトリを相対パスで記述する場合は、スラッシュが3つ重なりますので注意が必要です。  記述や設定に誤りがなければ

> リビジョン 0 の属性をコピーしました。
 てな出力があります。設定によって日本語だったり英語だったりするかとは思いますが

2.5 同期

 前項までの状態で、同期させる準備は万端です。  下記のコマンドで同期させます。

> svnsync sync https://"バックアップ側のリポジトリのURL
 初期化時と違って、バックアップ先の URL しか記述しませんのでご注意ください。  下記のようなメッセージが出力されます。

リビジョン 1 をコミットしました。
リビジョン 1 の属性をコピーしました。
リビジョン 2 をコミットしました。
リビジョン 2 の属性をコピーしました。
リビジョン 3 をコミットしました。
リビジョン 3 の属性をコピーしました。
ファイルのデータを送信しています .......................................
リビジョン 4 をコミットしました。
リビジョン 4 の属性をコピーしました。
 リビジョンの中で更新情報が多いものは、上記の例ですとリビジョン 3 のように「...」を出力します。大量にあればドットの数が、何画面にもわたって出力されることもあります。  完全に同期が終わるまでにどれくらいかかえるかは、リビジョンの多さに左右されます。数時間で終わる場合もあるでしょうし、数週間にわたることもあります。

2.6 定期的なバックアップ

 定期的にバックアップするシェルスクリプトを作成します。

#!/bin/sh
#
echo "start"
date
svnsync sync http://バックアップ側のリポジトリのURL
#
svnadmin lslocks マスタサーバ側のリポジトリのディレクトリ
echo "end"
 svnadmin lslocks はロック中のファイルがある場合、出力するようにしています。  svnsync sync の際、同期しようとするファイルがロックされていると失敗する場合がありますので・・・  このシェルスクリプトを crontab に登録します。

0  0  *   *   *   root    [シェルスクリプトを絶対パスで記述] >> /var/log/svnsync.log 2>&1
 上記の例だと毎日 00:00 に動きますが、00:00 はマシンが忙しい場合もあるでしょうし、周期をもっと短くするなど、そのあたりは工夫が必要です。  また、上記の例では、実行時のログを /var/log/svnsync.log に出力しますので、/etc/newsyslog.conf を編集して、ログをローテーションさせるようにします。

/var/log/svnsync.log                   640  30    *    @T00  B
 てな感じでしょうか?  こちらも量的にローテーションさせるのか定期的にローテーションさせるかは Subversion への更新頻度を考慮して工夫します。