banner
十一

十一

Stay hungry, stay foolish.

rsync的兩位好友:`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 兩個參數#
  • 兩個參數都沒有 -- 所有用戶都可以任意訪問;
  • 只有 allow -- 僅僅允許白名單中的用戶訪問模塊;
  • 只有 deny -- 僅僅黑名單中的用戶禁止訪問模塊;
  • 兩個參數都存在 -- 優先檢查白名單
    • 如果匹配成功,則允許訪問;
    • 如果匹配失敗,則去檢查黑名單,如果匹配成功則禁止訪問;
    • 如果都沒有匹配成功,則允許訪問。
配置文件如下#

注意: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 開頭的文件則表示伺服器內核支持 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分鐘對失敗的log進行重新同步(可選配置,非必需)
<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

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。