自宅がiDC?

自宅がiDC?

自宅に普通のPCを置いてレンタルサーバ?いえ、iDCです。

自宅がiDC? RSS Feed
 
 
 
 

lsyncd + rsyncdを使用したサーバ間リアルタイム同期

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

やたら長いタイトルとなりましたが、今回はこれについての手順を。
正直8月号のSoftware Desginに掲載されていた内容を実際にやってみたって感じですがw

lsyncで何が出来るかって簡単に言いますと、rsyncをずっとリアルタイムに近づけた動作をします。
通常rsyncでファイルやディレクトリを同期するときは、手動でコマンドを叩くか
cronにセットするしかないですよね。

これをリアルタイムにかつ自動的に処理させるのがlsyncなんですね。
また、同期をされる側はrsyncが設定されていればいいだけなんです。
(同期元はlsyncdをインストール)

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.xmltarget pathタグを追加するだけでOKです。

lsyncを使えばLBを使った構成で、各Webサーバにログインしてコンテンツをデプロイ。。。
なんて煩わしい手間から解放されますね。
まぁアプリがperl/ruby/php/pythonならいいんですが、Javaだったりすると
tomcatの再起動必要なんで微妙な気もしますがw

リアルタイム、リアルタイムといってますが、実際に使ってみた感じだとやっぱりちょっとした遅延はあります。
ファイルのサイズとか数が多いと遅延はそれなりになっていく感じです。
まぁ当たり前なんですけどねw

Leave a Reply

Additional comments powered by BackType

TopHatenar

あわせて読みたいブログパーツ