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 <pre>[code] 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はWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。