一般咱們在服務器上使用rsync加上crontab來定時地完成一些同步、備份文件的任務。隨着業務和應用需求的不斷擴大、實時性要求愈來愈高。通常rsync是經過校驗全部文件後,進行差量同步,若是文件量十分龐大,那麼rsync進行校驗的過程也是十分耗時的。並且正在發生變化的每每是其中不多的一部分,這是很是低效的方式。其次,rsync不能實時的去監測、同步數據,雖然它能夠經過crontab方式進行觸 發同步,可是兩次觸發動做必定會有時間差,這樣就致使了服務端和客戶端數據可能出現不一致,沒法在應用故障時徹底的恢復數據。而Sersync+Rsync的組合可以較好地解決這種問題。php
服務端:172.16.57.26 centos6.7 rsync-server 接收文件linux
客戶端:172.16.57.25 centos6.7 sersync+rsync-client 發送文件c++
rpm -qa | grep rsync #查看rsync是否已經安裝,若是沒有安裝,yum install直接安裝便可
2. 使用xinetd方式啓動rsyncexpress
vim /etc/xinetd.d/rsync #修改disable = no,flags = IPv4
3. 修改rsync配置文件vim
mkdir /etc/rsyncd vim /etc/rsyncd/rsyncd.conf #修改配置文件以下
# GLOBAL OPTIONS motd file=/etc/motd port=873 pid file=/var/run/rsyncd.pid lock file = /var/lock/rsyncd log file=/var/log/rsyncd transfer logging = yes log format = [op]:%o [ip]:%a [module]:%m [path]:%P [file]:%f [size]:%l syslog facility=daemon max connections=100 [recv] comment = "recv data from 57.25" path = /opt/rsync_data/recv #這邊的目錄的宿主要改成apprun,在這裏同步過程當中使用的是普通帳戶apprun list = yes use chroot = yes uid = apprun gid = apprun read only = no write only = no exclude = include = auth users = rsync secrets file = /etc/rsyncd/rsyncd.secrets strict modes = yes hosts allow = 172.16.57.25 hosts deny = *
ln -s /etc/rsyncd/rsyncd.conf /etc/rsyncd.conf
4. 創建用戶認證文件centos
vim /etc/rsyncd/rsyncd.secrets test:111111 #格式 用戶名:口令 chmod 600 /etc/rsyncd/rsyncd.secrets #權限設爲600,不然啓動會報錯
5. 啓動rsyncbash
/etc/init.d/xinetd start netstat -tpln | grep 873 #查看873端口是否已經在監聽了
tar xzvf sersync2.5_64bit_binary_stable_final.tar.gz mv GNU-Linux-x86 /opt/programs/sersync #解壓並拷貝到安裝目錄
3. 配置sersync服務器
<?xml version="1.0" encoding="ISO-8859-1"?> <head version="2.5"> <host hostip="localhost" port="8008"></host> <debug start="false"/> <fileSystem xfs="false"/> <filter start="false"> <exclude expression="(.*)\.svn"></exclude> <exclude expression="(.*)\.gz"></exclude> <exclude expression="^info/*"></exclude> <exclude expression="^static/*"></exclude> </filter> <inotify> <delete start="true"/> <createFolder start="true"/> <createFile start="true"/> <closeWrite start="true"/> <moveFrom start="true"/> <moveTo start="true"/> <attrib start="true"/> <modify start="true"/> </inotify> <sersync> <localpath watch="/opt/rsync_data/send"> #監控目錄,一旦本地目錄有文件變化,將同步到服務端 <remote ip="172.16.57.26" name="recv"/>#服務端ip和同步模塊 </localpath> <rsync> <commonParams params="-artuz"/> #rsync同步參數 <auth start="true" users="rsync" passwordfile="/etc/rsync.pas"/> #服務端認證密碼 <userDefinedPort start="false" port="873"/> <timeout start="false" time="100"/><!-- timeout=100 --> <ssh start="false"/> </rsync> <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--> <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>
4. 服務端密碼認證 網絡
vim /etc/rsync.pas #在相應的目錄下配置身份驗證文件,裏面輸入服務端的密碼,並chmod 600 chmod 600 /etc/rsync.pas
5. 啓動sersync多線程
./sersync2 -d -o confxml.xml
在客戶端下監控目錄/opt/rsync_data/send下添加文件或者刪除,服務端的接受目錄都會實時地進行更新。
在此例中,服務器iptables和selinux均處於關閉狀態。
---------------------------------------------
2016.7.24更新
這種方法同步文件的時候,同步文件的數量若是不少,可能會有部分文件在同步過程當中缺失。查閱相關資料後,找到了以下的解決方案。因爲本例中,使用的是xinetd方式啓動的rsync服務,在xinetd的配置文件中,修改幾個參數以下:
vim /etc/xinetd.conf 修改幾個參數: cps = 500 30 instances = UNLIMITED per_source = UNLIMITED
具體的含義能夠本身man xinetd.conf查看一下。
目前尚未同步大文件的需求,可能同步大文件存在一些延遲,還有待解決。