lsyncd + rsyncdを使用したサーバ間リアルタイム同期 
やたら長いタイトルとなりましたが、今回はこれについての手順を。
正直8月号のSoftware Desginに掲載されていた内容を実際にやってみたって感じですがw
lsyncで何が出来るかって簡単に言いますと、rsyncをずっとリアルタイムに近づけた動作をします。
通常rsyncでファイルやディレクトリを同期するときは、手動でコマンドを叩くか
cronにセットするしかないですよね。
これをリアルタイムにかつ自動的に処理させるのがlsyncなんですね。
また、同期をされる側はrsyncが設定されていればいいだけなんです。
(同期元はlsyncdをインストール)
lsyncを使えばあるサーバから複数台のサーバに一括同期をとることができます。リアルタイムで。
手順はこんな感じです。
実際にはサーバA,Bの2台を用意してA→Bに同期をとる構成です。
同期をとるディレクトリは/var/tmp/syncとし、ネットワークは192.168.0.0/24とします。
全体の流れはこんな感じ。
1.) サーバBでrsyncの設定
2.) サーバBでxinetdの設定
3.) サーバAでlsyncdのインストール&設定
4.) サーバAの特定のディレクトリにファイルを作ってみて動作確認
1.) サーバBでrsyncの設定
# vi /etc/rsyncd.conf
1 2 3 4 5 6 7 8 9 | hosts allow=* use chroot=no max connections=5 [sync] path=/var/tmp/sync uid = root gid = root read only = false |
2.) サーバBでxinetdの設定
# vi /etc/xinetd.d/rsync
1 2 3 4 5 6 7 8 9 10 11 | service rsync
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon --config=/etc/rsyncd.conf
log_on_failure += USERID
} |
# /etc/init.d/xinetd start
# chkconfig xinetd on
# chkconfig rsyncd on
# chkconfig –list | grep -E ‘xinetd|rsync’
3.) サーバAでlsyncdのインストール&設定
# yum -y install libxml2-devel
# cd /usr/local/src
# mkdir /opt/lsyncd-1.26
# ln -s /opt/lsyncd-1.26 /opt/lsyncd
# wget http://lsyncd.googlecode.com/files/lsyncd-1.26.tar.gz
# tar zxvf lsyncd-1.26.tar.gz
# cd lsyncd-1.26
# ./configure –prefix=/opt/lsyncd && make && make install && echo $?
# vi /etc/logrotate.d/lsyncd ← lsyncdログローテーション設定ファイル作成
1 2 3 4 5 6 7 8 | /var/log/lsyncd {
missingok
notifempty
sharedscripts
postrotate
/etc/rc.d/init.d/lsyncd restart 2>&1 > /dev/null || true
endscript
} |
lsyncの設定ファイル作成
# vi /etc/sysconfig/lsyncd
1 2 3 | IGNORE_START_ERRORS="--stubborn" #SHORT_LOG="--scarce" #DEBUG="--debug" |
# vi /etc/lsyncd.conf.xml
1 2 3 4 5 6 7 8 9 10 11 | <lsyncd version="1"> <settings> <logfile filename="/var/log/lsyncd"/> <binary filename="/usr/bin/rsync"/> <pidfile filename="/var/run/lsyncd.pid"/> </settings> <directory> <source path="/var/tmp/sync"/> <target path="192.168.0.10::sync/"/> </directory> </lsyncd> |
lsyncdの起動スクリプトを作成。xinetdの起動スクリプトを流用
# cp -p /etc/init.d/xinetd /etc/init.d/lsyncd
# vi /etc/init.d/lsyncd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | #!/bin/bash # # lsyncd # # chkconfig: 345 56 50 # description: xinetd is a powerful replacement for inetd. \ # xinetd has access control mechanisms, extensive \ # logging capabilities, the ability to make services \ # available based on time, and can place \ # limits on the number of servers that can be started, \ # among other things. # # processname: /opt/lsyncd/binlsyncd #Source function library . /etc/rc.d/init.d/functions PATH=$PATH:/sbin:/bin:/usr/bin:/usr/sbin:/opt/lsyncd/bin # Soruce networking configuration [ -r /etc/sysconfig/lsync ] && . /etc/sysconfig/lsyncd option="$SHORT_LOG $IGNORE_START_ERRORS $DEBUG" RETVAL=0 prog="lsyncd" start(){ echo -n $"Starting $prog: " daemon $prog $option RETVAL=$? echo touch /var/lock/subsys/lsyncd return $RETVAL } stop(){ echo -n $"Stopping $prog: " killproc $prog RETVAL=$? echo rm -f /var/lock/subsys/lsyncd return $RETVAL } reload(){ echo -n $"Reloading configuration: " killproc $prog -HUP RETVAL=$? echo return $RETVAL } restart(){ stop start } condrestart(){ [ -e /var/lock/subsys/lsyncd ] && restart return 0 } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status $prog ;; restart) restart ;; reload) reload ;; condrestart) condrestart ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}" RETVAL=1 esac exit $RETVAL |
# chkconfig lsyncd on
# chkconfig –list | grep lsyncd
# /etc/init.d/lsyncd start
4.) サーバAの特定のディレクトリにファイルを作ってみて動作確認
サーバAで下記のコマンドを実行。
# touch aaaa.txt /var/tmp/sync
サーバB側にファイルが作成されていればOK。
lsyncdは基本的に同期先が見つからない場合はプロセスが自動的に停止されます。
これだと、同期先が復活した時に自動的に同期してくれません。
ってことで、/etc/sysconfig/lsyncdの中にIGNORE_START_ERRORS=”–stubborn”を
記述します。
そして、起動スクリプト内で上記のようにオプションとして付加しています。
設定が合っているはずなのになぜか起動しない!とか、同期されない!
って場合はログを確認しましょう。
上記の設定だと/var/log/lsyncdに出力されます。
もしも同期先のサーバが増えた場合はとても簡単で、rsyncdの設定を追加するサーバにした後に
/etc/lsyncd.conf.xmlのtarget pathタグを追加するだけでOKです。
lsyncを使えばLBを使った構成で、各Webサーバにログインしてコンテンツをデプロイ。。。
なんて煩わしい手間から解放されますね。
まぁアプリがperl/ruby/php/pythonならいいんですが、Javaだったりすると
tomcatの再起動必要なんで微妙な気もしますがw
リアルタイム、リアルタイムといってますが、実際に使ってみた感じだとやっぱりちょっとした遅延はあります。
ファイルのサイズとか数が多いと遅延はそれなりになっていく感じです。
まぁ当たり前なんですけどねw
