世界一即戦力な男、菊池良が株式会社LIGに入社する事になりました。
35922694483
1
Lsyncd (Live Syncing Daemon)でリアルタイム同期!
こんにちはtetsuです。
今回の「社内なんでも屋」tetsuによるお題は「Lsyncdによるリアルタイム同期」です。
名前の意味通り、リアルタイムでサーバ間のディレクトリのミラーリングをしてくれます。
今回はロードバランサーを導入したWebサーバ3台、DBサーバ1台構成のWordPress環境を例に解説します。
ロードバランサーによって負荷分散することができますが、WordPressからアップロードした画像などはWebサーバ3台のうち、いづれかのサーバにしかアップロードできず、他のWebサーバにはアップロードしたファイルは存在していません。
そこでLsyncdを利用することで、アップロード後に他のサーバに対して同期処理をさせることができ、どのWebサーバでもファイルが存在するようにできます。
前述した通りのサーバ構成の詳細は以下の通りになります。
○Webサーバ1
名前:web1
IPアドレス:192.168.0.101
○Webサーバ2
名前:web2
IPアドレス:192.168.0.102
○Webサーバ3
名前:web3
IPアドレス:192.168.0.103
この構成で解説していきます。
まずは必要なものを3台のWebサーバにインストールしましょう。
○必要なアプリケーション
・lsyncd
・rsync
・xinetd
■「rsync」のインストール
CentOSでは、すでにインストールされているので、インストール作業が不要ですが
まれにインストールされていないケースもあるので一度確認をします。
実行コマンド)
which rsync
結果)
/usr/bin/rsync
上記のようにインストールディレクトリが表示されればインストールされています。
インストールされてない場合は、yumからインストールを行ってください。
yum install rsync
■「xinetd」のインストール
スーパーサーバと呼ばれるポート監視用デーモンプログラムをインストールします。
サーバがスーパーになってくれて、あるポートに対してアクセスがあった際に、
設定ファイルを元に対応したサービス(ここでは「rsync」)を起動させるアプリケーションです。
以下のコマンドでインストールができます。
実行コマンド)
yum install xinetd
■「lsyncd」のインストール
今回の同期を実行するアプリケーションです。
ここでは「lsyncd」のバージョン1系での説明ですが、
インストール時には「libxml2-devel」も必要になりますので、
先に「libxml2-devel」をインストールしてから「lsyncd」をインストールします。
実行コマンド)
yum install libxml2-devel
「libxml2-devel」をインストールしたら続いて以下のコマンドを実行していき
「lsyncd」をインストールします。
※インストールはyumからではなく、パッケージをダウンロードしてmakeコマンドでインストールします。
実行コマンド)
cd /usr/local/src/ wget http://lsyncd.googlecode.com/files/lsyncd-1.42.tar.gz tar zxvf lsyncd-1.42.tar.gz cd lsyncd-1.42 ./configure make make all
ここまでの手順で必要なアプリケーションのインストールが完了です。
続いて、それぞれのWebサーバの同期先を設定します。
「rsyncd.conf」設定ファイルを作成して設定します。
実行コマンド)
vi /etc/rsyncd.conf
記述内容)
uid = root
gid = root
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
[upload]
comment = rsync server
path = /var/www/html/wordpress/wp-content/uploads/
read only = false
[plugins]
comment = rsync server
path = /var/www/html/wordpress/wp-content/plugins/
read only = false
「[]」は同期先名で複数のディレクトリに対して設定することができます。
上記の場合はWordPressの「uploads」と「plugins」ディレクトリを同期先と設定した例です。
続いて設定した「rsyncd」を「xinetd」で実行するように設定します。
実行コマンド)
vi /etc/xinetd.d/rsync
# default: off
# description: The rsync server is a good addition to an ftp server, as it
# allows crc checksumming etc.
service rsync
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
すでに上記のように記述されている中で、
「disable」が「yes」となっているので、「no」と設定します。
以上で同期先の設定は完了です。
続いて同期元であるそれぞれのWebサーバの設定を行います。
「lsyncd」をインストールした場所に「lsyncd.conf.xml 」がありますので、
「/etc」ディレクトリにコピーします。
cp /usr/local/src/lsyncd.conf.xml /etc/
コピー後、内容を修正します。
vi /etc/lsyncd.conf.xml
Web1での修正例)
<lsyncd version="1">
<settings>
<logfile filename="/var/log/lsyncd.log" />
<pidfile filename="/var/run/lsyncd.pid" />
<delay value="30"/>
<callopts>
<option text="-avz"/>
<option text="--delete"/>
<source />
<destination />
</callopts>
</settings>
<directory>
<source path="/var/www/html/wordpress/wp-content/uploads/" />
<target path="192.168.0.102::uploads" />
</directory>
<directory>
<source path="/var/www/html/wordpress/wp-content/plugins/" />
<target path="192.168.0.102::plugins" />
</directory>
<directory>
<source path="/var/www/html/wordpress/wp-content/uploads/" />
<target path="192.168.0.103::uploads" />
</directory>
<directory>
<source path="/var/www/html/wordpress/wp-content/plugins/" />
<target path="192.168.0.103::plugins" />
</directory>
</lsyncd>
「directory」の「source」部に同期元のディレクトリをパスを記述し、
「target」に同期先のIPアドレスと「rsyncd.conf」に設定した「同期先名」を記述します。
上記では「Web1」サーバで同期先の「Web2」と「Web3」のIPアドレスを指定しています。
「Web2」であれば「Web1」と「Web3」を、「Web3」は「Web1」と「Web2」のIPアドレスを記述します。
「lsyncd」は起動スクリプトが存在しないので、スクリプトを作成します。
実行コマンド)
vi /etc/init.d/lsyncd
記述スクリプト
#!/bin/bash
# chkconfig: - 85 15
# description: lsyncd
RETVAL=0
prog="/usr/local/bin/lsyncd"
pidfile="/var/run/lsyncd.pid"
. /etc/rc.d/init.d/functions
start() {
echo -n "Starting $prog:"
daemon $prog
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch $pidfile
return $RETVAL
}
stop() {
echo -n "Stopping $prog:"
killproc $prog
RETVAL=$?
echo
rm -f $pidfile
return $RETVAL
}
case $1 in
start ) start ;;
stop ) stop ;;
restart) stop && start ;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
最後に以下のコマンドを各Webサーバで実行してサービスを開始します。
実行コマンド)
/etc/init.d/xinetd start chkconfig xinetd on /etc/init.d/rsync start chkconfig rsync on chmod a+x /etc/init.d/lsyncd chkconfig --add lsyncd chkconfig lsyncd on
今回はどのWebサーバでもWordPressでアップロードした画像などを同期する前提での解説ですが、Wordpress以外のアプリケーションでも設定を変更することにより、様々な使い方ができます。
同期ができるだけで、ワクワクが止まらないtetsuでした。
手塚です。LIGの土台を支えています。インフラからプログラミング、果ては経理、会計までと、広い守備範囲でみんなをサポートしています。
まいどおおきに。俺の名前は大田ひろゆき。LIGの広報担当や。FacebookとかTwitterとかメルマガで、皆にメッセージを届けさせてもらうで。ほんまに。 あと俺の発信する情報はLIGからの公式メッセージやと思ってもらってかまへんから。ってか公式のメッセージやわな。下にある「いいね!」を押すか、twitterをフォローして俺の情報を逃さんようにしてな。 メールマガジンの登録もめっちゃ簡単やから、おすすめやで~
9月になったので背景が変わりました。