ひっさびさに同期の設定したら全然できなくてかなり参ったので、もう基本からやり直しみたいな感じでの備忘録です。なんだかんだで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 |
CentOSのバージョンを確認
http://wiki.centos.org/AdditionalResources/Repositories/RPMForgelsyncdのインストールは標準のyumで出来ないので、RPMForgeリポジトリから落としてきます。なのでRPMForgeをリポジトリをインストールしておきます。
リポジトリの追加が必要なのでOSのバージョンを確認します。
# cat /etc/redhat-release CentOS release 6.6 (Final)
続いてCPUのビット数を確認します。(最近はもう64bitが殆ど)
# uname -i x86_6464bitの場合はこれ。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 (
スレイブ側)が起動します。いろんなエラーが出て困った場合は、最低限の設定にしてみてください。