LinuxはSersync + Rsyncを使用してリアルタイムのファイル同期を実現します

参考記事:
https//blog.51cto.com/liubao0312/1677586
https://github.com/wsgzao/sersync


1.はじめに

1.1Sersyncの概要

(1)Sersyncは、inotify-toolsと同様に、inotifyに基づいて開発されています

(2)Sersyncは変更された(追加、削除、変更を含む)特定のファイルまたはディレクトリの名前を監視対象ディレクトリ記録できます。rsyncを使用して同期する場合、変更されたファイルまたはディレクトリのみが同期されます。


1.2、rsync + inotify-toolsとrsync + sersyncアーキテクチャの違い

(1)rsync + inotify-tools

a。Inotifyは、監視対象ディレクトリの変更(追加、削除、変更)のみを記録でき特定のファイルまたはディレクトリの変更は記録しません

b。rsyncが同期しているとき、どのファイルまたはディレクトリが変更されたかわからないため、ディレクトリ全体が毎回同期されます。データ量が多い場合、ディレクトリ全体の同期には非常に時間がかかります(rsyncはDirectoryを実行する必要があります)比較ファイルを見つけるためのトラバーサル)、したがって効率は非常に低いです。



(2)rsync + sersync

a。Sersyncは、変更された(追加、削除、変更)特定のファイルまたはディレクトリの名前を監視対象ディレクトリに記録できます。

b。同期中、rsyncは変更されたファイルまたはディレクトリのみを同期します(毎回変更されるデータは同期ディレクトリデータ全体と比較して小さく、rsyncは比較ファイルを見つけるためにトラバースするときに非常に高速です)。すごく高い。


総括する:

    同期されたディレクトリデータの量が多くない場合は、rsync + inotifyを使用することをお勧めします

    同期されたディレクトリデータの量が非常に多い場合(数百Gまたは1Tを超える場合)、rsync + sersyncを使用することをお勧めします


2.原理の説明

主な手順:

  1. マスターサーバー(マスター)でsersyncサービスを開始します。sersyncは、構成パス内のファイルのリアルタイムの変更を監視します(ユーザーはこのサーバーでファイルを作成、変更、および削除します)。

  2. マスターでrsyncコマンドを呼び出して、更新されたファイルをターゲットサーバー(Slave1およびSlave2)にプッシュ(プッシュ)します。

  3. メインサーバーでsersyncを構成し、ターゲットサーバーでrsyncを構成する必要があります


原理を図に示します。
ここに画像の説明を挿入


3、構成

環境の説明:
システム:Ubuntu 18.04
マスター:192.168.43.166
スレーブ:192.168.43.97


3.1、ターゲットサーバースレーブのRsyncを設定します

3.1.1、起動時にrsyncサービスを開始します

Ubuntu 18.04はデフォルトでrsyncをインストールしますが、rsyncサービスはデフォルトでは開始されません。ファイルを変更する必要がありますsudo vi /etc/default/rsync

RSYNC_ENABLE=true   #将false改true

3.1.2、構成ファイルを変更します

簡単に変更できるように、最初に構成ファイルをetcディレクトリにコピーします

sudo cp /usr/share/doc/rsync/examples/rsyncd.conf /etc

構成ファイルを変更します

sudo vi /etc/rsyncd.conf

次の情報を修正します。
ここに画像の説明を挿入

注:パス同期ディレクトリが存在しない場合は、自分で作成する必要があります


3.1.3、パスワードファイルを作成します

パスワードsudo vi /etc/rsyncd.secretsファイルを内容は以下の通りです。

hadoop:123456 #格式必须要为 用户名:密码

注:ここでのユーザー名とパスワードはマスターのユーザー名とパスワードです。間違いありません。

パスワードファイルに0600のアクセス許可を割り当てます。sudo chmod 0600 /etc/rsyncd.secrets


3.1.4、再同期を開始します

sudo /etc/init.d/rsync start

この時点で、スレーブのRsync構成は完了です。


3.1.5、テスト

マスターでスレーブのRsyncをテストしてみましょう:

マスターにパスワードファイルを作成しますsudo vi /etc/rsyncd.secrets内容は以下の通りです。

123456    #写入客户端密码即可

パスワードファイルに0600のアクセス許可を割り当てます。sudo chmod 0600 /etc/rsyncd.secrets

cd ~ 				#返回到桌面
sudo vi hello.txt 	#创建一个hello.txt,里面随便写一些内容
rsync -avzP hello.txt  [email protected]::data --password-file=/etc/rsyncd.secrets

説明:このマシンのhello.txtファイルをスレーブのデータモジュールで指定されたパスにアップロードします。ここではパスワードファイルが使用されており、秘密なしでアップロードできます。gitpushに似ています


特別な注意:これは成功する必要があります。そうでない場合、次の構成は成功しません。


3.2、マスターサーバーマスターのSersyncを構成します

3.2.1、Sersyncをダウンロード

ダウンロードリンク:https//github.com/wsgzao/sersync
ここに画像の説明を挿入



解凍:

tar -zxf sersync2.5.4_64bit_binary_stable_final.tar.gz -C /usr/local/
cd /usr/local/
mv GNU-Linux-x86 sersync

3.2.2、Sersyncを構成します

cd /usr/local/sersync
cp confxml.xml confxml.xml-bak
sudo vi confxml.xml

次のように修正されました。
ここに画像の説明を挿入

3.2.3、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
sh: 1: cannot create /proc/sys/fs/inotify/max_user_watches: Permission denied
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
sh: 1: cannot create /proc/sys/fs/inotify/max_queued_events: Permission denied
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
daemon start,sersync run behind the console 
use rsync password-file :
user is	hadoop
passwordfile is 	/etc/rsyncd.secrets
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 /home/hadoop/hub && rsync -artuz -R --delete ./  --timeout=100 [email protected]::data --password-file=/etc/rsyncd.secrets >/dev/null 2>&1 
run the sersync: 
watch path is: /home/hadoop/hub


この時点で、sersync + rsyncが構成されています。同期ディレクトリでファイルを作成、削除、および変更する限り、リアルタイムでスレーブに同期できます。

/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xmlrc.localに書き込んで、起動時にマスターにファイル同期を開始させることもできます



付録:
1。パラメータの説明

パラメータ 説明
./sersync -r リアルタイム監視を有効にする前に、メインサーバーのディレクトリとリモートターゲットマシンのディレクトリの間で全体的な同期を実行します。
./sersync -o xx.xml -oパラメーターを指定しないでください。sersyncはsersync実行可能ファイルディレクトリのデフォルトの構成ファイルconfxml.xmlを使用し
て-oパラメーターを指定します。複数の異なる構成ファイルを指定して、複数のプロセスとsersyncの複数のインスタンス間のデータ同期を実現できます。
./sersync -n num デフォルトのスレッドプール内のスレッドの総数を指定します。
次に例を示します。./sersync-n5は、スレッドの総数が5であることを指定します。指定しない場合、開始するスレッドプールのデフォルト数は10です。CPUの使用量が多すぎる場合は、このパラメーターを調整できます。マシン構成が高い場合は、デフォルト値を調整できます。同期効率を向上させるためのスレッドの総数。
./sersync -d バックグラウンドサービス。通常、-rパラメーターを使用してローカルをリモート全体に同期し、次にこのパラメーターをバックグラウンドで実行してデーモンのリアルタイム同期を開始します。最初の全体的な同期では、-dパラメーターと-rパラメーターが組み合わせて使用​​されることがよくあります。
./sersync -m 同期せず、プラグインのみを実行します。
例:./ sersync -mコマンド、イベントが監視された後、リモートターゲットサーバーは同期されませんが、コマンドプラグインは直接実行されます

2.構成ファイルの説明
デフォルトの構成ファイルは次のとおりです。

     1 <?xml version="1.0" encoding="ISO-8859-1"?>
     2 <head version="2.5">
     3     <host hostip="localhost" port="8008"></host>
     4     <debug start="false"/>
     5     <fileSystem xfs="false"/>
     6     <filter start="false">
     7         <exclude expression="(.*)\.svn"></exclude>
     8         <exclude expression="(.*)\.gz"></exclude>
     9         <exclude expression="^info/*"></exclude>
    10         <exclude expression="^static/*"></exclude>
    11     </filter>
    12     <inotify>
    13         <delete start="true"/>
    14         <createFolder start="true"/>
    15         <createFile start="false"/>
    16         <closeWrite start="true"/>
    17         <moveFrom start="true"/>
    18         <moveTo start="true"/>
    19         <attrib start="false"/>
    20         <modify start="false"/>
    21     </inotify>
    22
    23     <sersync>
    24         <localpath watch="/opt/tongbu">
    25              <remoteip="127.0.0.1" name="tongbu1"/>
    26              <!--<remoteip="192.168.8.39" name="tongbu"/>-->
    27              <!--<remoteip="192.168.8.40" name="tongbu"/>-->
    28         </localpath>
    29         <rsync>
    30              <commonParamsparams="-artuz"/>
    31              <auth start="false"users="root" passwordfile="/etc/rsync.pas"/>
    32              <userDefinedPortstart="false" port="874"/><!-- port=874 -->
    33              <timeoutstart="false" time="100"/><!-- timeout=100 -->
    34              <sshstart="false"/>
    35         </rsync>
    36         <failLog path="/tmp/rsync_fail_log.sh"timeToExecute="60"/><!--default every 60mins execute once-->
    37         <crontab start="false"schedule="600"><!--600mins-->
    38              <crontabfilterstart="false">
    39                  <excludeexpression="*.php"></exclude>
    40                  <excludeexpression="info/*"></exclude>
    41              </crontabfilter>
    42         </crontab>
    43         <plugin start="false" name="command"/>
    44     </sersync>
    45
    46     <plugin name="command">
    47         <param prefix="/bin/sh" suffix=""ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix-->
    48         <filter start="false">
    49              <includeexpression="(.*)\.php"/>
    50              <includeexpression="(.*)\.sh"/>
    51         </filter>
    52     </plugin>
    53
    54      <plugin name="socket">
    55         <localpath watch="/opt/tongbu">
    56              <deshostip="192.168.138.20" port="8009"/>
    57         </localpath>
    58     </plugin>
    59     <plugin name="refreshCDN">
    60         <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
    61              <cdninfodomainname="ccms.chinacache.com" port="80"username="xxxx" passwd="xxxx"/>
    62              <sendurlbase="http://pic.xoyo.com/cms"/>
    63              <regexurlregex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/p_w_picpaths"/>
    64         </localpath>
    65     </plugin>
    66 </head>

2.1、デバッグがオンになっている

     4     <debug start="false"/>

trueに設定すると、デバッグモードがオンになり、inotifytimeコマンドとrsync同期コマンドがsersyncが実行されているコンソールに出力されます。


2.2、XFSファイルシステムスイッチ

     5     <fileSystem xfs="false"/>

xfsファイルシステムのユーザーの場合、sersyncを使用して正常に機能するには、このオプションを有効にする必要があります。


2.3、フィルターファイルフィルタリング機能

     6     <filter start="false">
     7         <exclude expression="(.*)\.svn"></exclude>
     8         <exclude expression="(.*)\.gz"></exclude>
     9         <exclude expression="^info/*"></exclude>
    10         <exclude expression="^static/*"></exclude>
    11     </filter>

ほとんどのアプリケーションでは、createFile(ファイルイベントの監視オプション)をfalseに設定して、パフォーマンスを向上させ、rsync通信を減らすことができます。監視対象ディレクトリにファイルをコピーするとcreateイベントとclose_writeイベントが生成されるため、createイベントをオフにすると、ファイルコピーの最後のclose_writeのみが監視され、完全なファイル同期も実現できます。

注:creatFolderをtrueのままにするように強制します。createFolderがfalseに設定されている場合、生成されたディレクトリは監視されず、このディレクトリの下のサブファイルとサブディレクトリは監視されません。したがって、特別なニーズがない限り、有効にしてください。デフォルトでは、ファイルの作成(ディレクトリ)イベントとファイルの削除(ディレクトリ)イベントの両方が監視されます。リモートターゲットサーバーのファイル(ディレクトリ)をプロジェクトで削除する必要がない場合、削除パラメータは次のようになります。 falseに設定すると、削除イベントは実行されません。

おすすめ

転載: blog.csdn.net/lendsomething/article/details/109134734