Saba note

醜悪コード Ugly hacks ITものづくり

lsyncd + rsyncdでリアルタイム同期する CentOS6

fullsizerenderひっさびさに同期の設定したら全然できなくてかなり参ったので、もう基本からやり直しみたいな感じでの備忘録です。なんだかんだでCentOS7にする人もいないし専用サーバーもCentOS6だし今回もCentOS6でやりました。
これ初心者がやろうとしたら意味わからないんじゃないかなと思いつつも、自分でも相当に忘れてしまっていたのでざっと基本的な流れをおさらいします。
特に説明も何もないとは思いつつも複数のWEBサーバー何かの同期を取る際には結局リアルタイムでミラーリングすることになります。ロードバランサーによる振り分けなどでWEBサーバーの冗長化を伴うとずべてのWEBサーバーの内容は全く同じでなければなりません。やり方としてはすべてのWEBサーバーにNASなんかをマウントしちゃって…というの1番楽だったりするのですが、予算的にそれも合わない(し、NAS入れるほどコンテンツがないよって話もあって)などなど、どうにかこうにかして同期をはかる際にはlsyncd+rsyncdということになります。
rsyncの差分同期はすでに非常に優秀で便利で爆速で誰でも使っているものになりますが、リアルタイムで同期することができないものなのです。cronで1分おきに叩くとかダサい感じになります。なので、

  • lsyncdでファイル更新を検知して [マスター側]
  • rsyncdで同期処理の命令を送って [マスター側]
  • xinetdを通して [スレイブ側]
  • rsyncdで同期する [スレイブ側]

ということになります。
設定例は以下のような感じです。

サーバー 同期するディレクトリ IPアドレス ユーザー
マスター側: /home/master/www 192.168.1.2 master
スレイブ側: /home/slave/www 192.168.1.3 slave

ちなみになんですが、スレーブ側のファイルをいろいろやるとどうなるんですか?ということがあると思うのですが、かなりおかしなことになるし考えるのが面倒なので「触らない」ということにしておいてください。(すごくいろいろ考えたい人はGoogleさんへ)

CentOSのバージョンを確認

http://wiki.centos.org/AdditionalResources/Repositories/RPMForge

lsyncdのインストールは標準のyumで出来ないので、RPMForgeリポジトリから落としてきます。なのでRPMForgeをリポジトリをインストールしておきます。
リポジトリの追加が必要なのでOSのバージョンを確認します。

# cat /etc/redhat-release
CentOS release 6.6 (Final)

続いてCPUのビット数を確認します。(最近はもう64bitが殆ど)

# uname -i
x86_64

64bitの場合はこれ。32bitの場合はi386みたいな感じで出てきます。
RPMパッケージのインストール
この辺りの情報からRPMのパッケージのある場所を探します。
本家の公式サイトにURLが載っているので、探してみてください。私の場合は本家サイトに記載されているように、

http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

となります。
このパッケージをインストールするには、rpm -ivhを使うっぽいです。

# rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm ← インストール
# rpm -qa | grep rpmforge ← RPMパッケージのバージョン確認

rpmforge-release-0.5.3-1.el6.rf.x86_64がおちてきたっぽい。

# yum repolist rpmforge ← リポジトリの確認

ここまでくればOK。
RPMパッケージがインストールされた際に作成されたファイルの確認をしてみる。

# rpm -ql rpmforge-release

lsyncd + rsyncのインストール

マスター側には「lsyncd rsync」、スレイブ側には「rsync」を設定します。
一瞬戸惑うのがlsync(d)とrsync(なし)です。mysqlとmsqldとかデーモンになると語尾にdがついたりしますが、lsyncにはdがあってrsyncにはないというのが正しいようです。

[マスター側]
# yum -y install lsyncd
# yum -y install rsync

[スレイブ側]
# yum -y install xinetd
# yum -y install rsync

これでインストールは完了。(rsyncはデフォルトですでにインストールされている筈です。が一応書いておきました。)
lsyncdの設定をする [マスター側]
lsyncd.confを設定する
不親切なことに/etc/lsyncというようなものは作られていないのです。

# mkdir -m 755 /etc/lsyncd
# touch /etc/lsyncd/lsyncd.conf

というようなことをますはじめにやっておきます。それから以下のように設定しましょう。
(※後述の/etc/sysconfig/lsyncdは自動的に作られていたりするので、非常に不親切な感じ)

# master server /etc/lsyncd/lsyncd.conf
settings{
    logfile = “/var/log/lsyncd.log”,
    statusFile = “/tmp/lsyncd.stat”,
    statusInterval = 1,
}
sync{
    default.rsync,
    source=”/home/master/www/”,
    target=”slave@192.168.1.3::sync”,
    rsync = {
        archive = true,
        links = true,
        update = true,
        verbose = false
    }
}

ちょこっと解説しておくと、logとかstatusは適当に設定して、syncという項目の中で、同期元ディレクトリ(source)と同期先(target)を設定しておきます。同期先のtargetには::以降にsyncとありますが、ここは何でもいいです。というのもここはrsyncdのモジュール名ということでrsyncd側に設定する文字列と同じであればよいといった感じです。rsyncの中にはarchiveとlinksとupdateとverboseを設定しておけばだいたいいいんじゃないかといったところです。英語ですがオプションなんかをかなり詳しく解説してくれている人もおります。
除外するファイルやディレクトリ
Gitでもrsyncでもそうですが完全同期っていうのはなかなかなくて同期の除外をするファイルやディレクトリってのが必ずあります。以下のようにlsyncd.confのsync内にsourceやtargetと並べて設定します。

sync{
    source .....
    target .....
    excludeFrom = "/home/master/sync_exclude_list",
    .....
}

sync_exclude_listファイルの中身なのですが、sourceで設定したパス以下のパスを書くことになるのでご注意です。(基本rsyncのexcludeファイルの書き方と同じですね。)
lsyncdファイルのパスをあわせる、バグ修正

# vi /etc/sysconfig/lsyncd

23行目付近
#OPTIONS="-pidfile /var/run/lsyncd.pid /etc/lsyncd.conf"
↓
OPTIONS="-pidfile /var/run/lsyncd.pid /etc/lsyncd/lsyncd.conf"

32行目付近
[ -f /etc/lsyncd.conf ] || exit 6
↓
[ -f /etc/lsyncd/lsyncd.conf ] || exit 6

この段階で一応lsyncdは起動できるようになっています。
自動起動の設定をして、

# chkconfig lsyncd on

lsyncdを起動。(その他の諸々設定をしてないので、ここでは起動しないですね。すみません。後で起動してください。)

# /etc/rc.d/init.d/lsyncd start

rsyncの設定をする [スレイブ側]
スレイブ側の設定は、最初の図に示した通り、xinetdの設定とrsyncの設定になります。
xinetdの設定がファイルを変更

# vi /etc/xinetd.d/rsync

userはrootじゃない方がいいかもしれないんですが、rootでも動くのでこれでいいです。そもそもこのconfigファイルはxinetdで/usr/bin/rsyncを叩いてますよっていう意味の設定ファイルなので、それが満たされていれば充分といった内容になっています。

service rsync
{
    disable = no
    flags = IPv6
    socket_type = stream
    wait = no
    user = root
    server = /usr/bin/rsync
    server_args = --daemon
    log_on_failure += USERID
}

で当然自動起動設定もしておいて、起動、というところです。(起動は後の方がいいか。本当は)

# chkconfig xinetd on
# service xinetd start

rsyncd.confの設定

このファイルはスレーブ側のrsyncdの設定をします。(xinetdに叩かれるものになります。)ログとかユーザーとかそこら辺りは適当でOKということで、肝は[sync]です。これがリアルタイムで同期をする際のモジュールみたいなものになります。lsyncで設定したtargetの部分がここになります。この[sync]の中身が実行されます。同期先のディレクトリ、許可するホストなどなど設定します。
その他、portが873っていうのと、hostをallowしておくことぐらいでしょうか。その他はコピペで大丈夫そうです。

# slave server
uid = slave
gid = slave
read only = no
log file = /home/slave/logs/rsyncd.log
pid file = /home/slave/logs/rsyncd.pid
port = 873
[sync]
path = /home/slave/www/
hosts allow = localhost 192.168.1.2
read only = false

ここまでできたら、だいたい完成です。xinetdを起動してrsyncdを動かせるようにしておきます。lsyncが差分検知してrsyncd(マスター側)が送信して、xinetdがそれを受けてrsyncd (スレイブ側)が起動します。いろんなエラーが出て困った場合は、最低限の設定にしてみてください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です