banner
十一

十一

Stay hungry, stay foolish.

rsyncの2つの友達:`rsync+inotify-tools` & `rsync+sersync`

rsyncを使用してリモートファイルのリアルタイム同期を行うには、実際にはrsyncdaemonデーモンプロセスモードを使用します。このモードでは、ソースサーバー側にアプリケーションをインストールする必要があります: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 allowhost 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の紹介#

sersyncinotifyに基づいて開発された、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

ファイルテスト#

image

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。