複数台のサーバをリアルタイムに同期する方法


はじめまして。林と申します( ´ ▽ ` )ノ

lsyncd と rsyncd を使って、複数台のサーバをリアルタイムに同期する方法をご紹介します。

同期元ディレクトリ内のファイルやディレクトリに更新があると、同期先のディレクトリと同期します。

イメージとしてはこんな感じです。

cronでもできますが、即時性が求められる場合はこちらがいいと思います。
ほぼリアルタイムで同期できます。

lsyncd はファイルシステムの更新をリアルタイムに監視し、更新があると rsync コマンドで同期します。

同期先のサーバで rsyncd を動かし、同期元のサーバで lsyncd を動かすことになります。

設定手順は以下のようになります。

同期先サーバの設定(rsyncdの設定)

rsyncd.confを作成します。
[root@web1 ~]# vi /etc/rsyncd.conf

uid = root
gid = root
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid

[videos]
        comment = rsync server
        path = /home/videos
        read only = false

[backup]
        comment = rsync server
        path = /home/backup
        read only = false

[videos] と [backup] が同期先の情報です。
path が同期先のディレクトリになります。
上記のように複数設定することもできます。

※ lsyncd で同期先を指定するときにここで指定した名前([ ]の中)を使います

xinetdが起動しているか確認します。
[root@web1 ~]# /etc/init.d/xinetd status
xinetd (pid 1622) を実行中…
起動していました。

rsyncを使えるようにします。
[root@web1 ~]# 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
        flags           = IPv6
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon
        log_on_failure  += USERID
}

disable を yes から no に変更します。

xinetd をリロードします。
[root@web1 ~]# /etc/init.d/xinetd reload

chkconfig に追加しておきます。
[root@web1 ~]# chkconfig –list | grep rsync
rsync: off
[root@web1 ~]# chkconfig rsync on

これで同期先の設定は終わりです。
同期先が複数台ある場合は同じ設定を全部にやります。

同期元サーバの設定(lsyncdの設定)

lsyncdをインストールします。
lsyncd は、バージョン 1系 と 2系 で設定ファイルの記述方法が異なります。
バージョン1系は xml で記述し、バージョン2系は lua で記述します。
2系統は lua への依存があるので、簡単なほうの1系統をインストールしました。

[root@db~]# cd /usr/local/src/
[root@db~]# wget http://lsyncd.googlecode.com/files/lsyncd-1.42.tar.gz
[root@db~]# tar zxvf lsyncd-1.42.tar.gz
[root@db~]# cd lsyncd-1.42
[root@db~]# ./configure
[root@db~]# make
[root@db~]# make install

同期の設定を書きます。
インストールディレクトリにlsyncd.conf.xmlがあるので、/etc/ にコピーします。
[root@db~]# cp lsyncd.conf.xml /etc/
内容を修正します。
[root@db~]# vi /etc/lsyncd.conf.xml

<lsyncd version="1">
  <settings>
    <logfile filename="/var/log/lsyncd.log" />
    <pidfile filename="/var/run/lsyncd.pid" />
    <delay value="30"/>
    <callopts>
      <option text="-aur4" />
      <option text="--block-size=16384" />
      <source />
      <destination />
    </callopts>
  </settings>
  <directory>
    <source path="/var/videos/" />
    <target path="192.168.0.101::videos" />
    <target path="192.168.0.101::backup" />
    <target path="192.168.0.102::videos" />
    <target path="192.168.0.102::backup" />
  </directory>
</lsyncd>

source に同期元ディレクトリを書きます。
target に同期先サーバのIPアドレスと、rsyncd.conf に書いた同期先情報の名前を書きます。

リアルタイムに更新を監視するには lsyncd をデーモンで動作させないといけないので、以下の設定をします。

自動起動スクリプトを作成します。
[root@db~]# 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

chkconfigに追加しておきます。
[root@db~]# chmod a+x /etc/init.d/lsyncd
[root@db~]# chkconfig –add lsyncd
[root@db~]# chkconfig lsyncd on

lsyncd を起動すると同期が始まります。
[root@db~]# /etc/init.d/lsyncd start

lsyncd + rsyncd で同期しておくと、うっかりファイルやディレクトリを消してしまったときも安心ですね。

この前私がやらかしてしまって、今までみんながうっかり消してきたものの告白大会になったのですが、一番傑作だったのは /usr/bin を削除してしまった社長の告白でした。

それではまた( ´ ▽ ` )ノ

Yoshiko Hayashi

福岡で働いています。
お酒と屋台とラーメンが大好きです♡

Facebook Twitter