rsync
を使用してリモートファイルのリアルタイム同期を行うには、実際にはrsync
のdaemon
デーモンプロセスモードを使用します。このモードでは、ソースサーバー側にアプリケーションをインストールする必要があります:rsync
+ inotify-tools
ツールまたはrsync
+ inotify-tools
ツール、ターゲットサーバー側にはrsync
をインストールするだけで済みます。
rsync
の設定手順#
サーバー情報#
- ターゲットサーバー:172.16.12.141
- ソースサーバー:172.16.12.142
ターゲットサーバーの設定(サーバー側の設定)#
設定ファイルの作成:/etc/rsync.conf
を変更し、デーモンプロセスモードで動作させる#
RedHat7
およびCentOS7
以下のデフォルトには存在しないため、自分で作成する必要があります。
設定ファイルの説明#
#rsyncd.conf設定ファイルの説明:
log file = /var/log/rsyncd.log # ログファイルの位置、rsyncを起動すると自動的にこのファイルが生成され、事前に作成する必要はありません
pidfile = /var/run/rsyncd.pid # pidファイルの保存場所
lock file = /var/run/rsync.lock # max connectionsパラメータをサポートするロックファイル
secrets file = /etc/rsync.pass # ユーザー認証設定ファイル、ユーザー名とパスワードを保存、手動でこのファイルを作成する必要があります
[etc_from_client] # カスタム同期名
path = /tmp/ # rsyncターゲットサーバーのデータ保存パス、ソースサーバーのデータがこのディレクトリに同期されます
comment = sync etc from client
uid = root # rsyncの実行権限をrootに設定
gid = root # rsyncの実行権限をrootに設定
port = 873 # デフォルトポート
ignore errors # エラーが発生した場合は無視する
use chroot = no # デフォルトはtrue、noに変更し、ディレクトリファイルのソフトリンクのバックアップを追加
read only = no # rsyncソースサーバーを読み書き権限に設定
list = no # rsyncソースサーバーのリソースリストを表示しない
max connections = 200 # 最大接続数
timeout = 600 # タイムアウト時間を設定
auth users = admin # データ同期を実行するユーザー名、複数設定可能、英語のカンマで区切る
hosts allow = 192.168.110.12 # データ同期を許可するソースサーバーのIPアドレス、複数設定可能、英語のカンマで区切る
hosts deny = 192.168.110.11 # データ同期を禁止するソースサーバーのIPアドレス、複数設定可能、英語のカンマで区切る
注意:host allow
と host deny
の 2 つのパラメータ#
- 2 つのパラメータがない場合 -- すべてのユーザーが自由にアクセス可能;
allow
のみ -- ホワイトリストにあるユーザーのみがモジュールにアクセス可能;deny
のみ -- ブラックリストにあるユーザーのみがモジュールへのアクセスを禁止;- 2 つのパラメータが存在する場合 -- ホワイトリストを優先的にチェック
- 一致が成功した場合、アクセスを許可;
- 一致が失敗した場合、ブラックリストをチェックし、一致が成功した場合はアクセスを禁止;
- どちらも一致しなかった場合、アクセスを許可。
設定ファイルは以下の通り#
注意:fake super = yes
このオプションは以前のバージョンには存在しませんでしたが、新しいバージョンではこのパラメータを追加しないと権限エラーが発生します:rsync:chgrp ".hosts.G6sZha” (in backup) failed: Operation not permitted (1)
#rsyncd.conf設定ファイル:
uid = rsync #ユーザー リモートコマンドがrsyncを使用して共有ディレクトリにアクセス
gid = rsync #ユーザーグループ
use chroot = no #セキュリティ関連
max connections = 200 #最大接続数
timeout = 300 #タイムアウト時間(バックアップを行わない場合の切断時間)
pid file = /var/run/rsyncd.pid #プロセスに対応するプロセス番号ファイル(サービス実行時のプロセスIDを保存)
lock file = /var/run/rsync.lock #ロックファイル
log file = /var/log/rsyncd.log #ログファイル、エラーメッセージを表示
fake super = yes #新しいバージョンでは必ず追加する
#モジュール情報:
[backup] # カスタムモジュール名
comment = "backup"
path = /backup/web #モジュールに対応する位置(パス)
ignore errors #エラーを無視するプログラム
read only = false #読み取り専用かどうか(ここでは偽、書き込み可能を示す)
list = false #リスト表示可能か*
hosts allow = 172.16.12.0/24 #rsyncサーバーのクライアント範囲へのアクセスを許可(ホワイトリスト)
#hosts deny = 0.0.0.0/32 #rsyncサーバーのクライアント範囲へのアクセスを禁止(ブラックリスト)
auth users = rsync_backup #存在しないユーザー、認証のためのみ使用
#接続認証のための秘密鍵ファイルを設定:
secrets file = /etc/rsync.password #認証時の秘密鍵ファイル
パスワードファイルを作成し、権限を600
に変更#
# パスワード内容をファイルに書き込む
echo "rsync_backup:123456" > /etc/rsync.password
# セキュリティのため、認証ユーザーのパスワードファイルの権限を600に変更
chmod 600 /etc/rsync.password
システムユーザーを作成#
# rsyncの仮想ユーザーを作成し、プログラムのみが使用
useradd rsync -s /sbin/nolgin -M
モジュールに対応するディレクトリを作成し、ディレクトリの所有者とグループをシステムユーザーに変更#
mkdir /backup/web
chown -R rsync.rsync /bakcup/
rsync
デーモンプロセスを起動し、起動しているか確認#
rsync --daemon # デーモンプロセスを起動
ps -ef | grep rsync。# プロセスが起動しているか確認
netstat -lntup | grep rsync # 873ポートがリッスンしているか確認
# 正常に起動し、873ポートをリッスンしているか確認
[root@fzfcdb ~]# ps -ef | grep rsync
root 19489 1 0 09:42 ? 00:00:00 rsync --daemon
root 27296 27115 0 15:09 pts/6 00:00:00 grep --color=auto rsync
[root@fzfcdb ~]# netstat -lntup | grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 19489/rsync
tcp6 0 0 :::873 :::* LISTEN 19489/rsync
[root@fzfcdb ~]#
ソースサーバーの設定#
rsync
ソフトウェアをインストールするだけで、起動や設定は不要#
yum -y install rsync
# rsyncがインストールされているか確認
rpm -qa | grep rsync
rsync-3.1.2-10.el7.x86_64
パスワードファイルを作成#
クライアントのパスワードファイルには、パスワードのみが必要で、パスワードファイルの権限は600
です
echo "123456" > /etc/rsync.password
# ファイル所有者に読み取り、書き込み権限を与える
chmod 600 /etc/rsync.password
転送テスト、関連パラメータはサーバー側の設定ファイルに設定されている#
ソースサーバーからサーバー側にアップロードテスト#
/www/
はローカルのwww
フォルダー内のすべてのファイルをサーバー側にアップロードします。/www
の場合は、www
フォルダー全体をバックアップします;rsync_backup
はサーバー側の設定ファイルのauth users
パラメータです;::backup
は今後のモジュールパラメータおよび設定ファイルの[backup]
で、後に設定ファイルのパスワードファイルのパスが続き、インタラクションなしでパスワードを入力せずに転送できます。
rsync -avz /www/ [email protected]::backup --password-file=/etc/rsync.password
ソースサーバーからのダウンロードテスト#
サーバー側のbackup
モジュール設定のpath
パスのファイルをローカルのwww
ディレクトリにダウンロードします。
rsync -avz [email protected]::backup --password-file=/etc/rsync.password /www
これで、rsync
の設定が完了しました。
inotify-tools
を使用してリアルタイム同期を行う#
inotify-tools
ツールをインストールし、リアルタイムでrsync
をトリガーして同期#
# サーバーのカーネルがinotifyをサポートしているか確認
# maxで始まるこの3つのファイルがあれば、サーバーのカーネルがinotifyをサポートしていることを示します
[root@localhost ~]# ll /proc/sys/fs/inotify/
total 0
-rw-r--r--. 1 root root 0 May 11 16:15 max_queued_events
-rw-r--r--. 1 root root 0 May 11 16:15 max_user_instances
-rw-r--r--. 1 root root 0 May 11 16:15 max_user_watches
# inotify-toolsをインストール
yum -y install inotify-tools
# インストールされているか確認
rpm -qa | grep inotify-tools
inotify-tools-3.21.9.6-1.16.el7.x86_64
同期スクリプトを書く#
[root@localhost ~]# mkdir /scripts
[root@localhost ~]# touch /scripts/inotify.sh
[root@localhost ~]# chmod 755 /scripts/inotify.sh
[root@localhost ~]# ll /scripts/inotify.sh
-rwxr-xr-x 1 root root 0 Aug 10 13:02 /scripts/inotify.sh
[root@localhost ~]# vim /scripts/inotify.sh
host=172.16.2.4 # ターゲットサーバーのIP(バックアップサーバー)
src=/www # ソースサーバーで監視するバックアップディレクトリ(ここはカスタマイズ可能ですが、存在することを確認する必要があります)
des=backup # カスタムモジュール名、ターゲットサーバーで定義された同期名と一致する必要があります
password=/etc/rsync.password # データ同期を実行するパスワードファイル
user=rsync # データ同期を実行するユーザー名
inotifywait=/usr/bin/inotifywait
$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files;do
rsync -avzP --delete --timeout=100 --password-file=${password} $src $user@$host::$des
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done
スクリプトを起動#
# & はバックグラウンドで実行することを示します
nohup bash /scripts/inotify.sh &
テスト:ソースサーバー上で新しいファイルを生成#
inotify
が生成したログを確認#
rsync+sersync
を使用してリアルタイム同期を行う#
sersync
の紹介#
sersync
はinotify
に基づいて開発された、inotify-tools
に似たツールです。したがって、同様にカーネルが最初にinotify
をサポートしている必要があります。
sersync
は、監視ディレクトリ内で発生した変更(追加、削除、変更)を具体的に記録し、rsync
で同期する際に変更があったファイルやディレクトリのみを同期します。
inotify-tools
に比べて、より高速に走査でき、大量のデータを同期する際により有利で、セットアップも迅速で、追加のスクリプトを書く必要がありません。
sersync
のインストール#
sersync
は国内の優れた開発者によって開発されており、yum
でインストールすることはできません。直接github
またはgoogle code
で探して、自分でインストールする必要があります。
google code のアドレス:https://code.google.com/archive/p/sersync/
github のアドレス:https://github.com/wsgzao/sersync
ソースサーバーの設定#
sersync
をダウンロード#
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz
解凍してフォルダーを得て、移動して名前を変更#
tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
# /usr/localに移動し、sersyncと名前を変更
mv GUN-Linux-x86 /usr/local/sersync
ディレクトリに入り、xml
設定ファイルを変更#
cd /usr/local/sersync # sersyncインストールディレクトリに入る
cp confxml.xml confxml.xml-bak # 元のファイルをバックアップ
vim confxml.xml # 編集し、以下のコードを変更
設定内容をいくつかの場所で変更します:関連情報は自分のrsync
サーバーの設定ファイル/etc/rsyncd.con
で確認できます。
元の設定ファイル:
#サーバーip、ファイルパスおよびモジュール名の設定
<localpath watch="/opt/tongbu">
#ここにnfsストレージサーバー(ソースサーバー)で同期するフォルダーのパスを記入します。
<remote ip="127.0.0.1" name="tongbu1"/>
#ここにrsyncバックアップサーバー(ターゲットサーバー)のIPアドレスとモジュール名を記入します。複数のサーバーを設定できます
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
#認証部分(rsyncパスワード認証)
<rsync>
<auth start="false" users="root" passwordfile="/etc/rsync.pas"/>
#パスワード認証を有効にし、auth users+パスワードファイルのパスを設定します。rsyncバックアップサーバーの認証情報。
</rsync>
#同期失敗ログの位置を変更し、60分ごとに失敗したログを再同期(オプション設定、必須ではありません)
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
変更後の設定ファイル:
<sersync>
<localpath watch="/www">
<remote ip="172.16.12.141" name="backup"/>
</localpath>
<rsync>
<!--<commonParams params="-artuz"/> -->
<!--元のファイルをバックアップする必要がある場合は、b suffixを追加する必要があります:元のファイルバックアップのサフィックスを設定し、backup-dir:元の要素のバックアップディレクトリ -->
<commonParams params="-artucb --suffix=_bak_`date +%Y%m%d%H%M%S --backup-dir=`date +%Y%m%d`"/>
<auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<failLog path="/var/log/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
注意:サービス側でソース側で削除されたファイルを保持する必要がある場合は、以下の設定を変更する必要があります。
<inotify>
<!--<delete start="true"/> trueをfalseに変更-->
<delete start="false"/>
<createFolder start="true"/>
<createFile start="false"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="false"/>
<modify start="false"/>
</inotify>
sersync
デーモンプロセスを起動してデータを同期し、プログラムをテスト#
sersync
デーモンプロセスを起動#
/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml
sersync
のパラメータの使い方#
-d
:デーモンプロセスを有効にする-r
:監視前に、監視ディレクトリをリモートホストにrsync
コマンドでプッシュする-n
:デーモンスレッドの数を指定、デフォルトは 10 個-0
:設定ファイルを指定、デフォルトはconfxml.xml
ファイルを使用
成功した場合、失敗するとハングする#
[root@localhost sersync]# /usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
option: -d run as a daemon
option: -r rsync all the local files to the remote servers before the sersync work
option: -o config xml name: /usr/local/sersync/confxml.xml
daemon thread num: 10
parse xml config file
host ip : localhost host port: 8008
will ignore the inotify delete event
daemon start,sersync run behind the console
use rsync password-file :
user is rsync_backup
passwordfile is /etc/rsync.password
config xml parse success
please set /etc/rsyncd.conf max connections=0 Manually
sersync working thread 12 = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads)
Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads)
please according your cpu ,use -n param to adjust the cpu rate
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /root/rsync_test/log && rsync -artuzb --suffix=._bak_`date +%Y%m%d%H%M%S` --backup-dir=`date +%Y%m%d` -R ./ [email protected]::log_backup --password-file=/etc/rsync.password >/dev/null 2>&1
run the sersync:
watch path is: /root/rsync_test/log