コンテンツ同期の設定


本ガイドはサポート対象外の説明を含む内容となります。
参考情報としてお読みいただき、お客様のご判断でご利用ください。
※尚、ご自身での設定が難しいという方に、有料にて設定の代行を承っております。
こちらをご参照ください。 設定代行メニュー

STEP 1構成確認

1-1 構成例

lsync-rsync本ガイドで紹介するコンテンツ同期はファイル送信元のサーバ(マスターサーバ)で、lsyncdを起動し、送信先サーバ(スレーブサーバ)でrsync(inetd経由で起動)することで、送信元でのファイル更新が即時に別サーバにも反映されるようにする設定です。
この設定では設定ファイルや起動スクリプト等の準備は必要となりますが、cronでの同期用設定等は必要ありません。

1-2 チェック事項

あらかじめ以下は確認しておいてください。

  • マスターサーバ
    • IPアドレス
    • コンテンツ複製元ディレクトリ
  • スレーブサーバ
    • IPアドレス
    • コンテンツ複製先ディレクトリ
    • 複製先ディレクトリ以下で、複製したくないディレクトリ/ファイルの有無

本例では

  • 対象となる各サーバはローカルネットワーク 10.XX.XX.0/24 で結線されていて
      マスターサーバ:10.XX.XX.10
      スレーブサーバ:10.XX.XX.11
      (複数ある場合は、スレーブサーバ2: 10.XX.XX.12 …)
  • マスターサーバ側とスレーブサーバ側のディレクトリ、ユーザ構成が同じで
      同期対象ディレクトリ:(マスター、スレーブともに)
      /var/www/html/
      (※Plesk導入の場合 /var/www/vhosts/example.org/httpdocs/になります)
      同期対象はCGI、PHP、HTML、画像ファイル等のウェブコンテンツ

として、説明を進めます。

STEP 2各スレーブサーバでのrsync設定

各スレーブサーバ(コピー先サーバ)では以下を設定します。

2-1 rsyncインストール

Pleskを導入されている方はrsyncが既定でインストールされています。(パスは /usr/bin/rsyncとなります。)
Pleskを導入されていない方で且つrsyncコマンドがインストールされていない方は 以下の手順でインストール作業をお願いいたします。

# which rsync
 /usr/bin/which: no rsync in (/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin:)

 # yum -y install rsync

 # which rsync
 /usr/bin/rsync

2-2 設定ファイル作成(rsyncd.conf rsyncd.exclude)

# vi /etc/rsyncd.conf
▼以下ファイルの中身 (13行)▼ 
 hosts allow = 10.XX.XX.0/24
 hosts deny = *
 use chroot = no
 max connections = 5
 dont compress = *.gz *.tgz *.zip *.pdf *.sit *.sitx *.lzh *.bz2 *.jpg *.gif *.png
 log file = /var/log/rsyncd/rsyncd.log

 [sync01] 
 path = /var/www/html/
 uid = root
 gid = root
 read only = false
 exclude from = /etc/rsyncd.exclude.01.txt

※上記はhosts allowとして、ネットワーク『10.XX.XX.0/24』で指定していますが、マスターサーバの
IPアドレス『10.XX.XX.10』で指定してもかまいません。

『sync01』はグループ名で、任意の半角英数文字で指定いただけます。後述しますが同期先ディレクトリが複数ある場合、複数のグループ名を設定します。

『path』は 同期ディレクトリパスです。
例は /var/www/html/で設定していますが、Plesk導入の場合 /var/www/vhosts/example.org/httpdocs/等になります。
『exclude from 』については必ずしも設定する必要はありませんが、この設定でサーバ固有のデータファイルの同期を防ぐことが可能ですので設定例として掲載します。

# vi /etc/rsyncd.exclude.01.txt
▼以下ファイルの中身 (『-』と『パス名』の間には半角スペースがはいります)▼ 
 - data/secret
 - data/secret/*

rsync.confファイルでは
1)rsync全体のアクセス設定を設定し、
2)rsync用のグループ名「sync01」について、同期対象となるパス、除外対象設定ファイルを指定
しています。

除外対象設定ファイル(上述の例では/etc/rsyncd.exclude.01.txt)では
「rsync01 グループ内で指定された path以下の特定パス」
を記述しています。

上述の「rsyncd.exclude.01.txt」の例の2行ですが
「あるディレクトリと直下の全ファイルは同期させたくない」という場合の一般的な記述です。
この設定例を具体的なパスであらわすと
●/var/www/html/以下は同期する
●ただし/var/www/html/data/secretというファイル
/var/www/html/data/secret/というディレクトリ直下のファイルとディレクトリは除く
という意味合いになります。
※/var/www/html/data/secret/というディレクトリは作られても、フォルダ以下のファイルは転送されれません。

★[参考] 同期先のパスが複数ある場合は…

rsyncd.confはグループごとに設定します。別のグループ名の行を同様に追記します。
以下、該当箇所の抜粋の例示:

[sync01] # rsyncグループ名その1
 path = /var/www/html/
 uid = root
 gid = root
 read only = false
 exclude from = /etc/rsyncd.exclude.01.txt

 [sync02] # rsyncグループ名その2
 path = /var/www/html2/
 uid = root
 gid = root
 read only = false
 exclude from = /etc/rsyncd.exclude.02.txt

除外リストファイル(exclude from で指定しているファイル)が増える場合は、 それも別途準備ください。

2-3 ログ出力用設定

# vi /etc/logrotate.d/rsyncd
▼以下ファイルの中身(9行)▼ 
 /var/log/rsyncd/rsyncd.log {
     daily
     missingok
     rotate 30
     compress
     delaycompress
     dateext
     notifempty
 }

# mkdir -p /var/log/rsyncd
 # logrotate -d /etc/logrotate.conf

STEP 3各スレーブサーバでのinetd以下でのrsync起動設定

各スレーブサーバで起動スクリプトを設置します。以下はinetdで起動する設定例です。

# vi /etc/xinetd.d/rsync
▼以下ファイルの中身:既存内容を以下で置き換えます(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 restart

STEP 4マスターサーバでのlsyncdインストールと設定

4-1 rsync、lsyncインストール

マスターサーバ側では「lsyncd」をデーモン起動しますが、rsyncコマンドも呼び出すので、rsyncも必要です。Pleskを導入されている方はrsyncが既定でインストールされています。(パスは /usr/bin/rsyncとなります。)
Pleskを導入されていない方で且つrsyncコマンドがインストールされていない方は 以下の手順でインストール作業をお願いいたします。

# which rsync
 /usr/bin/which: no rsync in (/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin:)

 # yum -y install rsync

lsyncもインストールします。

# yum -y install libxml2-devel
    中  略
Updated: libxml2-devel.i386 0:2.6.26-2.1.2.8.el5_5.1
 Complete!    アップデート成功

# cd /usr/local/src/
 # wget http://lsyncd.googlecode.com/files/lsyncd-1.42.tar.gz
 # ls
 lsyncd-1.42.tar.gz    ダウンロード確認

# tar zxvf lsyncd-1.42.tar.gz
 # cd lsyncd-1.42
 # ./configure && make && make install

4-2 ログ出力用の設定

# vi /etc/logrotate.d/lsyncd
▼以下ファイルの中身 (9行)▼ 
 /var/log/lsyncd/lsyncd.log {
      missingok
      notifempty
      sharedscripts
      postrotate
      /etc/rc.d/init.d/lsyncd restart 2>&1 > /dev/null || true
      endscript
 }

# mkdir -p /var/log/lsyncd
 # /usr/sbin/logrotate -d /etc/logrotate.conf

4-3 設定ファイルlsyncd.conf.xml作成

# vi /etc/lsyncd.conf.xml
▼以下ファイルの中身 (86行) 10.XX.XX.11はスレーブサーバのIPです。▼ 
 < lsyncd version="1">
 < settings>
      < logfile filename="/var/log/lsyncd/lsyncd.log"/>
      < binary filename="/usr/bin/rsync"/>
      < pidfile filename="/var/run/lsyncd.pid"/>
      < stubborn/>
      < callopts>
          < option text="-ptgrouvz"/>
          < option text="--delete"/>
          < exclude-file/>
          < source/>
          < destination/>
     < /callopts>
 < /settings>
 < directory>
      < source path="/var/www/html/"/> 
      < target path="10.XX.XX.11::sync01/"/>
 < /directory>
 < /lsyncd>

★[参考] lsyncd.conf.xmlのディレクトリ記述パターン
lsyncd.conf.xmlでは、ソースディレクトリごとに1セットで記述します。

』から『』で閉じる行の間には…
– 『』 は1行のみ
– 『』は同期先の数 記入します。

もし、コピー元ディレクトリが複数あるのなら、
事前にスレーブ側各サーバで、rsyncグループ名を整備しておいた上で、
』から『』のセットを複数記述しておく 必要があります。
以下、該当箇所の抜粋の例示:

< directory>
 < source path="/var/www/html/"/> 
      < target path="10.XX.XX.11::sync01/"/>
      < target path="10.XX.XX.12::sync01/"/>
 < /directory>
 < directory>
 < source path="/var/www/html2/"/> 
      < target path="10.●.●.11::sync02/"/>
      < target path="10.●.●.12::sync02/"/>
 < /directory> 

★[参考] lsyncd.conf.xmlのグローバルオプション記述

STEP 5起動スクリプトの確認と起動

# vi /etc/init.d/lsyncd
▼以下ファイルの中身▼ 
 #!/bin/sh
 ### BEGIN INIT INFO
 # Provides:     lsyncd
 # Required-Start:     $local_fs $remote_fs $network $syslog
 # Required-Stop:      $local_fs $remote_fs $network $syslog
 # Should-Start:       $named
 # Default-Start:      2  3  4  5
 # Default-Stop:       0  1  6
 # Short-Description:  fast  remote  file  copy  program  daemon
 # Description:        start  and  stop  lsyncd
 ### END  INIT  INFO

 # Source  function  library.
 . /etc/rc.d/init.d/functions

 PATH=$PATH:/sbin:/bin:/usr/bin:/usr/sbin:/usr/local/bin

 #  Source  networking  configuration.
 [  -r  /etc/lsyncd  ]  &&  .  /etc/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/lsyncd
     return $RETVAL
 }

 stop(){
     echo -n $"Stopping $prog: "
     killproc $prog
     RETVAL=$?
     echo
     rm -f /var/lock/lsyncd
     return $RETVAL
 }

 reload(){
     echo -n $"Reloading configuration: "
     killproc $prog -HUP
     RETVAL=$?
     echo
     return $RETVAL
 }

 restart(){
     stop
     start
 }

 condrestart(){
     [ -e /var/lock/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

 # chmod +x /etc/init.d/lsyncd
 # chkconfig lsyncd on
 # chkconfig --list | grep lsyncd
 lsyncd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
 # /etc/init.d/lsyncd start

STEP 6動作確認

マスターサーバ側でファイルを作ってテストします。
除外設定の反映も確認ください。
各設定ファイルのパスの記述の仕方が少し違うだけで、想定の挙動と違う挙動をすることがあるので、確認作業は必ず行ってください。

# touch /var/www/html/test0.txt
# touch /var/www/html/.test1.txt

上記は転送される本例での転送されるファイルの例です。下記は、除外リストファイルでの制御により、ディレクトリ直下のファイルが転送されないことの試験です。

# mkdir -p /var/www/html/data/secret
# touch /var/www/html/data/secret/test0.txt
# touch /var/www/html/data/secret/.test1.txt

スレーブサーバへの反映されているかも確認してください。マスターサーバ側のログ 「/var/log/lsyncd/lsyncd.log」でも確認が可能です。

STEP 7サーバ構成の変更にあたって

スレーブサーバが追加された場合などは
●新スレーブサーバ側で:STEP2,STEP3を他のサーバ同様に設定後、
●マスターサーバ側でlsyncd.conf.xmlの記述(target path)を追加してください。

同期対象ディレクトリが追加された場合などは
●各スレーブサーバ側で、rsync.confのグループ設定を追加後
●マスターサーバ側でlsyncd.conf.xmlの記述を追加してください。

各スレーブサーバのrsyncd(inetd)プロセスは、rsyncd.confの修正や変更があった場合は再起動を行ってください。

付録

利用ポートについて

スレーブサーバ側はマスターサーバからのTCP 873 番ポートのアクセスを許可している 必要があります。上述のrsnycd.confでの設定以外にも、iptablesやinetd(hosts.allow,hosts.deny)等で制限をかけている場合、接続許可されていることを確認してください。

出力ログと確認

サービスの確認ですが
●マスターサーバ側では lsyncプロセスの有無
●マスターサーバ側のログ(/var/log/lsyncd/lsyncd.log)で「rsync error:」が出ていないか
で確認が行えます。

プロセスの確認例

# ps ax| grep lsync | grep -v grep
XXXX ? Ss 0:00 lsyncd

マスターサーバ側の「lsyncd.log」ログは随時ご確認ください。

# cat /var/log/lsyncd/lsyncd.log

★[参考] lsyncd.logの出力例
以下はlsyncd.logの同期エラーを中心とした出力例です。
ある特定のファイル転送がなんらかの原因で失敗した場合、マスターサーバ側のディレクトリに変更を確認しない限り新しいアクションはおこりません。

同期のエラーを確認した時は
1.修正箇所を確認してください。
2.マスターサーバ側に別ファイルをアップロードしなおしてください。
次回の転送成功時には前回転送を失敗したファイルも一緒に転送されます。
スレーブのファイルの日付が、マスター側より新しいと更新されませんので、常にマスター側を更新するようにしてください。

例1)マスターサーバの指定場所(/usr/bin/rsync)にコマンドが入っていない場合のエラー

Sun Jan 1 hh:mm:ss 20XX: ERROR: Failed executing [/usr/bin/rsync]
exit!ERROR: Failed executing [/usr/bin/rsync]

例2)スレーブサーバのrsyncグループ名指定が間違っている場合のエラー

Sun Jan 1 hh:mm:ss 20XX: /usr/bin/rsync /var/www/html/ --> 10.XX.XX.11::sync01/ [XXXXXX]
@ERROR: Unknown module 'sync01'
rsync error: error starting client-server protocol (code 5) at main.c(1296) [sender=2.6.8]
Sun Jan 1 hh:mm:ss 20XX: Forked binary process returned non-zero return code: 5 

例3)スレーブサーバのrsyncポートに疎通できない場合のエラー

Sun Jan 1 hh:mm:ss 20XX: /usr/bin/rsync /var/www/html/ --> 10.XX.XX.11::sync01/ [XXXXXX]
rsync: failed to connect to 10.XX.XX.11: Connection refused (111)
rsync error: error in socket IO (code 10) at clientserver.c(107) [sender=2.6.8]
Sun Jan 1 hh:mm:ss 20XX: Forked binary process returned non-zero return code: 10

アクセス制御の有無、スレーブサーバ側のrsyncdのポートの起動等ご確認ください。