Lsyncd(Live Syncing Daemon)で複数サーバをリアルタイム同期する方法!

tetsu


Lsyncd(Live Syncing Daemon)で複数サーバをリアルタイム同期する方法!

Lsyncd (Live Syncing Daemon)でリアルタイム同期!

こんにちはtetsuです。

今回の「社内なんでも屋」tetsuによるお題は「Lsyncdによるリアルタイム同期」です。

Lsyncd (Live Syncing Daemon)とは

名前の意味通り、リアルタイムでサーバ間のディレクトリのミラーリングをしてくれます。
今回はロードバランサーを導入した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でした。

tetsu
この記事を書いた人
tetsu

管理部

関連記事