Ikeda->Weblog();

Ikedaの徒然雑記。

[メモ] lsyncd+rsync でミラーリング

| 0件のコメント

[メモ] + でミラーリング仕事先でサーバリプレイスを行うことになり、まずは最も単純構成である動画ストリーミングサーバから手をつけることにしました。

現状、サーバは各々2台ずつの冗長構成になっており、従って動画ファイルもそれぞれに配布する必要があります。以前から面倒だなーとは思っていたんですが、このリプレイスのタイミングで動画ファイルの格納ディレクトリを同期させてやることに^^)b

最初に思いついたのはDRBD+heartbeat。しかし、YouTubeのような動画アップロードサイトではありませんし、そこまで頻繁に動画ファイルの更新があるわけではありません。リアルタイム性もそこまで必要というわけではないし。。
そもそもDRBDはアクティブ-スタンバイ式なので、両サーバから同時に読み出しを行うにはさらにNFSかiSCSI+CLVMを組み合わせるしかなさそうです(間違い・勘違いでしたらご指摘下さいm(_ _)m)

で、ググっていたら lsyncd なるソフトウェアを発見。

うわ、これいいかも!
ということで、早速仮想環境にて試してみましたのでメモ。


まずは環境設定


では配布元と配布先のサーバそれぞれに設定を行っていきます。
便宜上、実際に動画ファイルの原本(?)を保持する側=配布元を「プライマリ」、配布を受ける側を「セカンダリ」としますね。

仮想環境の設定はこんな感じ。
  • プライマリサーバ – hostA: 192.168.254.1
  • セカンダリサーバ – hostB: 192.168.254.2
  • 動画ファイルの格納場所はいずれも  /home/streams ディレクトリ
  • ファイルのオーナー・グループは  stream/stream

インストーーーールッ


プライマリサーバ側


さて、このサーバに社内の各部署から動画ファイルがアップロードされることになります。また、公開終了となった動画ファイルは削除されます。ということで、こちら側に lsyncd をインストールします。

下記からTarballをダウンロード。

$ tar xvfz lsyncd-1.25.tar.gz
$ cd lsyncd-1.25
$ ./configure
$ make && sudo make install

以上。簡単ですねえ~~

セカンダリサーバ側


こちらが動画ファイルの更新を受け取る側。実際の更新には rsync が使われますので、こちらには rsync を入れておかなければ。CentOSなのでさくっとyumにて。

# yum install rsync

はい、終了。

動かしてみる


続いて設定&起動です。今度はセカンダリ側から設定していきます。
rsync を起動するには inetd を使う手がありますが、ここは単独でサービスとしてしまいましょう。–daemonオプションをつけて起動することでデーモン化してくれます。その際、必要なオプションはコマンドラインで指定することもできますが、今回は設定ファイル /etc/rsyncd.conf を使いましょう。こんな感じ。

uid = nobody
gid = nobody
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
use chroot = no
hosts allow = 192.168.254.0/24
hosts deny  = *

[streams]
uid = stream
gid = stream
path = /home/streams
read only = no

設定ファイルができたらrsync daemonを起動します。

# rsync –daemon
# ps `cat /var/run/rsyncd.pid`
PID TTY      STAT   TIME COMMAND
22290 ?        Ss     0:00 rsync –daemon

はい、起動しました。/var/log/rsyncd.log にログが出力されていますので、トラブルの際はこちらもチェックしましょう。

さて、受け口が開きましたのでプライマリサーバの設定ですね。
lsyncdに各オプションや監視するディレクトリとその配布先を指定する方法としては

  • コマンドライン
  • 設定ファイル(/etc/lsyncd.conf.xml)
という2種類があります。
とりあえずはテストということで、コマンドラインで実行してみましょう。

# lsyncd /home/streams hostB:/home/streams
# ps -aef | grep lsyncd
# ps -ae |grep lsyncd
2810 ?        00:00:00 lsyncd /home/streams hostB:/home/streams

お、起動成功^^

試しに、プライマリサーバの /home/streams 下へ何かファイルを作ってみましょう。

hostA $ touch /home/streams/this_is_test

そしておもむろにセカンダリサーバのディレクトリを確認。

hostB $ ls /home/streams
this_is_test

無事にファイルがミラーされていたら成功です!他のファイルを作ってみたり書き換えたり、削除してみてください^^)b

実運用に向けて


実際に運用で使うには、rsync daemonやlsyncdはOS起動時に自動実行して欲しいですよね。ディレクトリや配布先なんかも全部コマンドラインではなく、設定ファイル化しておきたいところです。

ということで、まずは lsyncd の設定ファイルを作りましょう。
  • /etc/lsyncd.conf.xml

<lsyncd version=”1.25″>
<settings>
<debug />
<logfile filename=”/var/log/lsyncd.log” />
<pidfile filename=”/var/run/lsyncd.pid” />

<callopts>
<option text=”-auzr4″ />
<option text=”–delete” />
<source />
<destination />
</callopts>
</settings>

<directory>
<source path=”/home/streams” />
<target path=”192.168.254.2::streams” />
</directory>
</lsyncd>

<settings> 内に lsyncd のオプションを記述します。これがデフォルト値となります。
1つ1つの詳細は然るべきドキュメントをご覧いただくとして、気になる設定値をいくつか。

<callopts> は、lsyncd が rsync を起動するコマンドラインの、”組立方”を指定するブロックです。基本的に上から順番にコマンドラインへ付加されるイメージですね。上記の場合だと

rsync -auzr4 –delete  <配布元> <配布先>

というコマンドラインになります。 <option>タグがコマンドラインオプションに、<source><destination>がそれぞれ配布元サーバ/ディレクトリと配布先のそれに置き換わるわけですね。

<directory> ブロックは、監視するディレクトリ(ソース)と、変更の通知先を指定します。要するにこれが source と destination になるわけです。このブロックは必要なだけ作ることができるようですし、<settings>ブロックで指定したオプションの中で、いくつかは上書きすることも可能のようです。

ここで1点、注目したい箇所が。
<directory>ブロックの<target>をよく見てください。先程コマンドラインで lsyncd を起動した際は

192.168.254.2:/home/streams

と、<ホスト>:<パス>の形式でしたが、こちらは”<ホスト>::streams“になっています。

これはlsyncdの機能というより rsync の機能で、シングルコロンではなくダブルコロンで指定すると、右辺をパスではなく「モジュール」が指定された、と認識してくれるのです。このモジュールはどこで設定するんでしょう。
。。。。ちょっとページの上のほうに戻ってみてください。。。ありましたか?

そう、rsync daemon に設定してあるんです!
/etc/rsyncd.confの

[streams]
uid = stream
gid = stream
path = /home/streams
read only = no

この部分ですね!
この[]で囲まれた部分が「モジュール名」で、以降、そのモジュールに対する詳細設定項目、となります。
もちろんモジュールは複数指定可能です!

こうしておくことで、配布先のディレクトリ構造が変わったとしてもlsyncdの設定を変えることなく対応できるわけです。詳しくは rsync や rsyncd.conf のマニュアルをご覧下さい^^)b

さてさて、一通り起動するようになり、実際にミラーリングも稼動するようになりました。
あとは自動実行ファイルを作っておくだけですね^^

簡素ですが、こんな感じでinitファイルを作ってみました。

  • /etc/init.d/lsyncd

#!/bin/bash
#
# lsyncd
#
# chkconfig: 345 99 20
# description: lsyncd auto start script

LSYNCD=/usr/local/bin/lsyncd
CONFIG=/etc/lsyncd.conf.xml
PID=/var/run/lsyncd.pid

. /etc/init.d/functions

start() {
daemon $LSYNCD –conf $CONFIG
}

stop() {
killproc -p $PID
}

checkproc() {
if [ -e $PID ]; then
echo “lsyncd is already running…”
exit 1
fi
}

case “$1” in
start)
checkproc
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
if [ -e $PID ]; then
echo “lsyncd is running…”
else
echo “lsyncd is not running.”
fi
;;
*)
echo “Usage: lsyncd {start|stop|restart|status}”
exit 1
esac

exit $?

  • /etc/init.d/rsyncd

#!/bin/bash
#
# rsyncd
#
# chkconfig: 345 99 20
# description: rsyncd auto start script

RSYNCD=/usr/bin/rsync
CONFIG=/etc/rsyncd.conf
PID=/var/run/rsyncd.pid

. /etc/init.d/functions

start() {
daemon $RSYNCD -4 –daemon
}

stop() {
killproc -p $PID
}

checkproc() {
if [ -e $PID ]; then
echo “rsyncd is already running…”
exit 1
fi
}

case “$1” in
start)
checkproc
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
if [ -e $PID ]; then
echo “rsyncd is running…”
else
echo “rsyncd is not running.”
fi
;;
*)
echo “Usage: rsyncd {start|stop|restart|status}”
exit 1
esac

exit $?

これをそれぞれ /etc/init.d に置き、

# chmod 755 ?syncd
# chkconfig –add ?syncd

としてやればOKなはずです!(CentOS 5.3で確認)

最後に一つ、大ハマりメモ。


起動テスト中、何度やってもいくらやっても rsync が

“No route to host”

というエラーでhostBに接続できない、という現象が発生しました。でも”ping hostB”は通りますし、”ssh hostB”もOK。
なんだこりゃああああと思っていたんですが、、、

iptables でした(大汗

単にREJECTだけなら “Connection refused” なはずですが、「–reject-with icmp-host-prohibited」という設定になっていたのが原因でした。

基本的なミスですが、一度ハマるとしばらくハマりますのでご注意を(って俺だけか)

コメントを残す