項目實戰:Rsync + Sersync 實現文件實時同步
客戶端中數據發生變化,同步到server端(備份服務器)。
Rsync:負責數據同步,部署在server端。
Sersync:負責監控數據目錄變化,并調用rsync進行同步,*部署在client端。
部署 Rsync 服務
安裝軟件包
[root@server ~]# yum install -y rsync-daemon
配置 rsync
本次實驗使用驗證用戶同步。
#web服務器的數據變化,同步給 backup# 準備同步目錄,該目錄任何用戶都可以讀寫。
[root@server ~]# mkdir -m 777 /backup# 配置rsync,不驗證用戶,直接同步
[root@server ~]# vim /etc/rsyncd.conf
......
# 添加如下配置
[backup]
# 描述信息
comment = backup# 備份路徑
path = /backup# 設置可寫
read only = no# 指定用戶名
auth users = rsync# 指定用戶密碼文件
secrets file = /etc/rsyncd.secrets# 創建用戶憑據文件
[root@server ~]# echo 'rsync:123' > /etc/rsyncd.secrets
[root@server ~]# chmod 400 /etc/rsyncd.secrets# 啟用并啟動rsyncd服務
[root@server ~]# systemctl enable rsyncd --now# 配置防火墻
[root@server ~]# firewall-cmd --add-service=rsyncd
[root@server ~]# firewall-cmd --add-service=rsyncd --permanent
更多 rsyncd.conf 配置參考 rsyncd.conf(5)
。
客戶端配置和測試
# 準備密碼文件
[root@client ~]# echo 123 > rsyncd.secrets
#只讀權限(僅編輯用戶擁有)
[root@client ~]# chmod 400 rsyncd.secrets# 傳輸測試
#關閉 SELinux
[root@server baoshenghui]# setenforce 0[root@client ~]# rsync -av /etc/hostname rsync@server::backup
Password:
sending incremental file list
hostnamesent 114 bytes received 35 bytes 59.60 bytes/sec
total size is 20 speedup is 0.13# 驗證結果
[root@server ~]# ls /backup/
hostname
部署 Sersync 服務
Sersync 服務介紹
sersync 使用c++編寫,類似于inotify,同樣用于監控,但它克服了inotify的缺點。
inotify 最大的不足是會產生重復事件,或者同一個目錄下多個文件的操作會產生多個事件,例如,當監控目錄中有5個文件時,刪除目錄時會產生6個監控事件,從而導致重復調用rsync命令。比如:vim文件時,inotify會監控到臨時文件的事件,但這些事件相對于rsync來說是不應該被監控的。
sersync 優點:
- sersync 同步效率更高,它會對linux系統文件系統產生的臨時文件和重復的文件操作進行過濾,節省了運行時耗和網絡資源。
- sersync配置很簡單,其中提供了靜態編譯好的二進制文件和xml配置文件,直接使用即可。
- sersync使用多線程進行同步,尤其在同步較大文件時,能夠保證多個服務器實時保持同步狀態。
- sersync有出錯處理機制,通過失敗隊列對出錯的文件重新同步,如果仍舊失敗,則按設定時長對同步失敗的文件重新同步。
- sersync自帶crontab功能,只需在xml配置文件中開啟,按要求隔一段時間整體同步一次。
- sersync 可以二次開發。
sersync項目地址:https://code.google.com/archive/p/sersync/
sersync下載地址:https://code.google.com/archive/p/sersync/downloads
安裝軟件包
# 下載軟件
[root@client ~]# wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz# 解壓文件
[root@client ~]# tar -xf sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@client ~]# ls GNU-Linux-x86/
confxml.xml sersync2
文件說明:
- sersync2,是二進制程序。
- confxml.xml,是sersync2程序的配置文件。
配置 Sersync
配置文件說明
[root@client ~]# cat GNU-Linux-x86/confxml.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5"><!-- hostip與port是針對插件的保留字段,對于同步功能沒有任何作用,保留默認即可。 --><host hostip="localhost" port="8008"></host><!-- 是否開啟debug模式 --><debug start="false"/><!-- 如果是xfs文件系統,則需要設置為true才能同步,rehat/REEL/CentOS/Fedora新版本默認都是xfs文件系統,可使用df -Th命令查看 --><fileSystem xfs="true"/><!-- 過濾器,設置為true則會對里面的exclude對應的正則匹配到的文件進行過濾,即不同步 --><filter start="true"><!-- <exclude expression="(.*)\.svn"></exclude> --><!-- <exclude expression="(.*)\.gz"></exclude> --><!-- <exclude expression="^info/*"></exclude> --><!-- <exclude expression="^static/*"></exclude> --><exclude expression="^cache/*"></exclude></filter><!-- inotify是linux的內核功能,這里用于設置創建/刪除/修改/移動文件時,是否視為文件改變(進而進行同步) --><inotify><!-- 刪除一個文件是否視為文件改變(很明顯我們要設置為true) --><delete start="false"/><!-- 創建一個文件夾是否視為文件改變(很明顯我們要設置為true) --><createFolder start="true"/><!-- 創建一個文件是否觸發文件改變事件(這里要設置false,因為創建一個文件除了有createFile事件還會有closeWrite事件,我們只要把closeWrite事件設置為true即可監控到創建 一個文件) --><createFile start="false"/><!-- 創建文件或修改文件后再關閉會觸發該事件,比如vim打開一個文件,修改后用(:wq)保存,則會觸發該事件,當然創建新文件一樣會觸發 --><closeWrite start="true"/><!-- 從別的地方移到被監控目錄是否視為文件改變,毫無疑問要設置為true --><moveFrom start="true"/><!-- 被監控目錄中的某個文件被移動到其他地方算不算文件改變?毫無疑問要設置為true --><moveTo start="true"/><!-- 文件屬性改變了,是否視為文件改變?這個我們可以認為文件沒有改,所以設置false --><attrib start="false"/><!-- 文件內容被修改了是否視為文件改變?感覺文件改變肯定要設置為true,但其實不用,因為這個改變有可能是vim(:w)保存,還沒有關閉文件,所以保存的時候沒必要同步,而關閉的時候會觸發closeWrite,所以修改的文件也是通過closeWrite來同步的 --><modify start="false"/></inotify><!-- servsync的模塊 --><sersync><!-- 指定要監控(即同步)的本地目錄 --><localpath watch="/data"><!-- ip指定同步到遠程的哪個服務器,name填寫遠程服務器中rsync配置文件中的自定義模塊名稱(即中括號括起來的那個名稱) --><remote ip="10.1.8.10" name="laoma"/><!-- 如果你要同步到多臺服務器,繼續填寫即可,每個服務器一個remote標簽 --><!--<remote ip="192.168.8.40" name="tongbu"/>--></localpath><!-- rsync模塊配置 --><rsync><!-- 公共參數,即我們手動執行rsync的時候要帶的選項就填在這里,servsync會自動組裝 --><commonParams params="-azP"/><!-- 密碼文件及指定用戶名(用戶名就是rsync服務器端配置文件中的"auth user =" 指定的用戶名) --><auth start="true" users="rsync" passwordfile="/etc/rsyncd.secrets"/><!-- 如果你rsync服務器不是默認端口873,那么就要在這里指定具體的端口,當然是默認的你也可以指定一下 --><userDefinedPort start="false" port="873"/><!-- rsync超時時間 --><timeout start="false" time="100"/><!-- timeout=100 --><!-- 是否使用ssh方式傳輸 --><ssh start="false"/></rsync><!-- 對于失敗的傳輸,會進行重新傳送,再次失敗就會寫入rsync_fail_log,然后每隔一段時間(timeToExecute進行設置,單位sec)執行該腳本再次重新傳送,然后清空該腳本。可以 通過path來設置日志路徑。 --><failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--><!-- 定期整體同步功能,schedule表示crontab執行間隔,單位是min --><crontab start="false" schedule="600"><!--600mins--><!-- 同步過濾器,要開啟請把start設置為true,用于 整體同步時,排除一些文件或目錄,比如緩存目錄可以不需要同步 --><crontabfilter start="false"><exclude expression="*.php"></exclude><exclude expression="info/*"></exclude></crontabfilter></crontab><!-- 同步完成后,執行一個插件,name表示執行哪些插件,而這個插件必須在后邊用plugin標簽定義 --><plugin start="false" name="command"/></sersync><!-- 定義一個command插件(command插件類型的一種,另外的類型有socket,refreshCDN,http(目前由于兼容性問題,http插件暫時不能用)) --><plugin name="command"><!-- command插件其實就是“.sh”結尾的shell腳本文件,prefix和subffix用于拼成一條執行shell命令的命令 --><param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /data/wwwroot/mmm.sh suffix--><!-- 該腳本做操作時要過濾的文件正則 --><filter start="false"><include expression="(.*)\.php"/><include expression="(.*)\.sh"/></filter></plugin><!-- 定義一個socket插件,注意插件定義了但沒有調用的話,是不會被執行的 --><plugin name="socket"><localpath watch="/data"><deshost ip="192.168.138.20" port="8009"/></localpath></plugin><!-- 定義一個refreshCDN插件,主要用于同步數據到cdn --><plugin name="refreshCDN"><localpath watch="/data0/htdocs/cms.xoyo.com/site/"><cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/><sendurl base="http://pic.xoyo.com/cms"/><regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/></localpath></plugin>
</head>
配置文件示例
本次實驗使用的示例文件。
[root@client ~]# vim confxml.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5"><host hostip="localhost" port="8008"></host><debug start="false"/><fileSystem xfs="true"/><filter start="true"><exclude expression="^cache/*"></exclude></filter><inotify><delete start="true"/><createFolder start="true"/><createFile start="false"/><closeWrite start="true"/><moveFrom start="true"/><moveTo start="true"/><attrib start="false"/><modify start="false"/></inotify><sersync><localpath watch="/app_data"><remote ip="10.1.8.10" name="backup"/></localpath><rsync><commonParams params="-azP"/><auth start="true" users="rsync" passwordfile="/root/rsyncd.secrets"/><userDefinedPort start="false" port="873"/><timeout start="false" time="100"/><ssh start="false"/></rsync><failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><crontab start="false" schedule="600"><!--600mins--><crontabfilter start="false"><exclude expression="*.php"></exclude><exclude expression="info/*"></exclude></crontabfilter></crontab><plugin start="false" name="command"/></sersync><plugin name="command"><param prefix="/bin/sh" suffix="" ignoreError="true"/><filter start="false"><include expression="(.*)\.php"/><include expression="(.*)\.sh"/></filter></plugin>
</head>
運行 Sersync
# 準備同步目錄
[root@client ~]# mkdir /app_data# 復制程序到$PATH中
[root@client ~]# cp GNU-Linux-x86/sersync2 /usr/local/bin/[root@client ~]# sersync2 -h
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
_______________________________________________________
參數-d:啟用守護進程模式
參數-r:在監控前,將監控目錄與遠程主機用rsync命令推送一遍
參數-n: 指定開啟守護線程的數量,默認為10個
參數-o:指定配置文件,默認使用confxml.xml文件
參數-m:單獨啟用其他模塊,使用 -m refreshCDN 開啟刷新CDN模塊
參數-m:單獨啟用其他模塊,使用 -m socket 開啟socket模塊
參數-m:單獨啟用其他模塊,使用 -m http 開啟http模塊
不加-m參數,則默認執行同步程序________________________________________________________________# 運行 Sersync
[root@client ~]# sersync2 -o confxml.xml -d
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: -o config xml name: confxml.xml
option: -d run as a daemon
daemon thread num: 10
parse xml config file
host ip : localhost host port: 8008
now the filter work ,if you set the crontab,you have to set crontab filter
WARNING XFS FILE SYSTEM WORK
daemon start,sersync run behind the console
use rsync password-file :
user is rsync
passwordfile is /root/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
run the sersync:
watch path is: /app_data
測試
# server 端監控目錄 /backup
[root@server ~]# watch -n 1 ls /backup# 客戶端創建文件和目錄
[root@client ~]# echo hello world > /app_data/welcome.txt
[root@client ~]# mkdir /app_data/dbdata# 客戶端刪除文件
[root@client ~]# rm -fr /app_data/*
監控運行效果如下:(創建welcome.txt–>刪除welcome.txt)
配置 systemd 管理 Sersync
[root@client ~]# cp confxml.xml /etc/sersyncd.conf
[root@client ~]# vim /etc/systemd/system/sersyncd.service
[Unit]
Description=SerSync server daemon[Service]
Type=forking
ExecStart=/usr/local/bin/sersync2 -o /etc/sersyncd.conf -d[Install]
WantedBy=multi-user.target[root@client ~]# systemctl daemon-reload
[root@client ~]# systemctl enable sersyncd.service
oot@client ~]# cp confxml.xml /etc/sersyncd.conf
[root@client ~]# vim /etc/systemd/system/sersyncd.service
[Unit]
Description=SerSync server daemon
[Service]
Type=forking
ExecStart=/usr/local/bin/sersync2 -o /etc/sersyncd.conf -d
[Install]
WantedBy=multi-user.target
[root@client ~]# systemctl daemon-reload
[root@client ~]# systemctl enable sersyncd.service