使用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
兩個參數#
- 兩個參數都沒有 -- 所有用戶都可以任意訪問;
- 只有
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