CentOS6.8使用Rsync+Inotify-tools實現數據實時同步

說明:
linux

        操做系統:CentOS release 6.8 (Final) x86_64vim

        服務器IP:rsync_server(數據源) 10.15.43.100bash

                         rsync_client  (目標端)10.15.43.228服務器

       同步目錄: rsync_server       /app/rsync_serverapp

                         rsync_client        /app/rsync_client  socket


rsync_client  (目標端)10.15.43.228ide

一、安裝Rsync服務端
工具

[root@localhost src]# yum -y install rsync xinetd
[root@localhost src]# cp /etc/xinetd.d/rsync{,default}
[root@localhost src]# vim /etc/xinetd.d/rsync
service rsync
{
        disable = no            #修改成no
        flags           = IPv6
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon
        log_on_failure  += USERID
}
[root@localhost src]# /etc/init.d/xinetd start        #CentOS中是以xinetd來管理Rsync服務的
[root@localhost src]# vim /etc/rsyncd.conf    #建立配置文件
logfile = /var/log/rsyncd.log    #日誌文件位置,啓動rsync後自動產生這個文件,無需提早建立
pidfile = /var/run/rsyncd.pid    #pid文件的存放位置
lockfile = /var/run/rsync.lock    #支持max connections參數的鎖文件
secretsfile = /etc/rsync.pass    #用戶認證配置文件,裏面保存用戶名稱和密碼,後面會建立這個文件
motdfile = /etc/rsyncd.Motd    #rsync啓動時歡迎信息頁面文件位置(文件內容自定義)
[app_rsync_client]    #自定義名稱
path = /app/rsync_client/    #rsync服務端數據目錄路徑
comment = app_rsync_client    #模塊名稱與[app_rsync_client]自定義名稱相同
uid = root    #設置rsync運行權限爲root
gid = root    #設置rsync運行權限爲root
port =873
use chroot = no    #默認爲true,修改成no,增長對目錄文件軟鏈接的備份
read only = no    設置rsync服務端文件爲讀寫權限
list = no    #不顯示rsync服務端資源列表
mac connections = 200
timeout = 600
auth users = rsync    #執行數據同步的用戶名,能夠設置多個,用英文狀態下逗號隔開
hosts allow = 10.15.43.100    #容許進行數據同步的客戶端IP地址,能夠設置多個,用英文狀態下逗號隔開
hosts deny = 10.10.2.84    #禁止數據同步的客戶端IP地址,能夠設置多個,用英文狀態下逗號隔開
                                  #先容許後拒絕
[root@localhost src]# vim /etc/rsync.pass    #配置文件,添加如下內容
rsync:123456    #格式,用戶名:密碼,能夠設置多個,每行一個用戶名:密碼
[root@localhost src]# chmod 600 /etc/rsyncd.conf 
[root@localhost src]# chmod 600 /etc/rsync.pass 
[root@localhost src]# /etc/init.d/xinetd restart                 #/usr/bin/rsync --daemon --config=/etc/rsyncd.conf


rsync_server(數據源) 10.15.43.100測試

安裝Rsync客戶端ui

[root@localhost rsync_server]# whereis rsync    #查看系統是否已安裝rsync
rsync: /usr/bin/rsync /usr/share/man/man1/rsync.1.gz    #說明已經安裝
[root@localhost rsync_server]#

yum install  xinetd  #已安裝rsync只安裝xinetd便可,CentOS中是以xinetd來管理rsync服務的

yum install rsync xinetd #若是默認沒有rsync,運行此命令進行安裝rsync和xinetd

[root@localhost rsync_server]# vim /etc/xinetd.d/rsync
service rsync
{
        disable = no    #修改成no
        flags           = IPv6
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon
        log_on_failure  += USERID
}
[root@localhost rsync_server]# /etc/init.d/xinetd restart
[root@localhost rsync_server]# vim /etc/passwd.txt
123456
[root@localhost rsync_server]# chmod 600 /etc/passwd.txt


測試

在rsync_server的/app/rsync_server目錄下建立文件file,在rsync_server端運行同步命令同步數據:

rsync -avH --port=873 --progress --delete  /app/rsync_client/ rsync@10.15.43.228::app_rsync_client --password-file=/etc/passwd.txt


rsync_server(數據源) 10.15.43.100

[root@localhost src]# mkdir /app/rsync_client/test
[root@localhost src]# touch /app/rsync_client/test/file
[root@localhost rsync_server]# rsync -avH --port=873 --progress --delete  /app/rsync_server/ rsync@10.15.43.228::app_rsync_client --password-file=/etc/passwd.txt

sending incremental file list
./
file
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/2)

sent 81 bytes  received 30 bytes  222.00 bytes/sec
total size is 0  speedup is 0.00
[root@localhost rsync_server]#

/app/rsync_server/            數據源的目錄

-password-file=/etc/passwd.txt            數據源的密碼文件

rsync@10.15.43.228::app_rsync_client        rsync目標端rsync服務端配置的用戶名,app_rsync_client目標端rsync服務端配置的模塊名稱


rsync_client

[root@localhost rsync_client]# ls
file
[root@localhost rsync_client]#


在rsync_server(數據源) 10.15.43.100上安裝Inotify-tools工具,實時觸發rsync進行同步

一、安裝Inotify-tools工

[root@localhost src]# ll /proc/sys/fs/inotify    #查看服務器內核是否支持inotify,出現下面的內容,說明服務器內核支持inotify
total 0
-rw-r--r-- 1 root root 0 Jul 27 10:32 max_queued_events
-rw-r--r-- 1 root root 0 Jul 27 10:32 max_user_instances
-rw-r--r-- 1 root root 0 Jul 27 10:32 max_user_watches
[root@localhost src]# uname -r        #Linux下支持inotify的內核最小爲2.6.13
2.6.32-642.el6.x86_64
[root@localhost src]# tar zxvf inotify-tools-3.14.tar.gz
[root@localhost src]# cd inotify-tools-3.14
[root@localhost inotify-tools-3.14]# ./configure --prefix=/app/inotify
[root@localhost inotify-tools-3.14]# make && make install
[root@localhost inotify-tools-3.14]# vim /etc/profile    #設置系統環境變量
export PATH=/app/inotify/bin:$PATH
[root@localhost inotify-tools-3.14]# source /etc/profile
[root@localhost inotify-tools-3.14]# echo " /app/inotify/lib" > /etc/ld.so.conf.d/inotify.conf
[root@localhost inotify-tools-3.14]# ln -s /app/inotify/include /usr/include/inotify
[root@localhost inotify-tools-3.14]# sysctl -a|egrep -i "max_queued_events|max_user_watches|max_user_instances"    #修改inotify默認參數(inotify默認內核參數值過小)
fs.inotify.max_user_instances = 128
fs.inotify.max_user_watches = 8192
fs.inotify.max_queued_events = 16384
fs.epoll.max_user_watches = 201420
[root@localhost inotify-tools-3.14]# vim /etc/sysctl.conf
fs.inotify.max_user_instances = 65535
fs.inotify.max_user_watches = 99999999
fs.inotify.max_queued_events = 99999999    
[root@localhost inotify-tools-3.14]# cat /proc/sys/fs/inotify/{max_user_instances,max_user_watches,max_queued_events}
65535
99999999
99999999
[root@localhost inotify-tools-3.14]#

max_queued_events:

            inotify隊列最大長度,若是值過小,會出現"** Event Queue Overflow **"錯誤,致使監控文件不許確

max_user_watches:

            要同步的文件包含多少目錄,能夠用:find /app/rsync_server/ -type d | wc -l 統計,必須保證max_user_watches值大於統計結果(這裏/app/rsync_server/爲同步文件目錄)

max_user_instances:

            每一個用戶建立inotify實例最大值


二、建立腳本,實時觸發rsync進行同步

[root@localhost inotify]# cat rsync.sh 
#!/bin/bash
src_dir="/app/rsync_server/"
dst_dir="app_rsync_client"
exclude_dir="/app/inotify/exclude.list"
rsync_user="rsync"
rsync_passwd="/etc/passwd.txt"
dst_ip="10.15.43.228 10.10.2.84"
rsync_command(){
                  rsync -avH --port=873 --progress --delete --exclude-from=$exclude_dir $src_dir $rsync_user@$ip::$dst_dir --password-file=$rsync_passwd
}
for ip in $dst_ip;do
     rsync_command     
done
    /app/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $src_dir \
| while read file;do
   for ip in $dst_ip;do
       rsync_command
       echo "${file} was rsynced" >> /tmp/rsync.log 2>&1
   done
 done        
[root@localhost inotify]# chmod +x rsync.sh
[root@localhost inotify]# touch /app/inotify/exclude.list
[root@localhost inotify]# vim /etc/rc.d/rc.local
nohup /bin/sh /app/inotify/rsync.sh &
[root@localhost inotify]# nohup /bin/sh /app/inotify/rsync.sh &

src_dir="/app/rsync_server/"    #源服務器同步目錄

dst_dir="app_rsync_client"    #目標服務器rsync同步目錄模塊名稱

exclude_dir="/app/inotify/exclude.list"    #不須要同步的目錄,若是有多個,每一行寫一個目錄,使用相對於同步模塊的路徑;

例如:不須要同步/app/rsync_server/"目錄下的a目錄和b目錄下面的b1目錄,exclude.list文件能夠這樣寫

a/

b/b1/


rsync_user="rsync"    #目標服務器rsync同步用戶名

rsync_passwd="/etc/passwd.txt"    #目標服務器rsync同步用戶的密碼在源服務器的存放路徑

dst_ip="10.15.43.228 10.10.2.84"    #目標服務器ip,多個ip用空格分開


inotify參數

            -m 是保持一直監聽

            -r 是遞歸查看目錄

            -q 是打印出事件

            -e create,move,delete,modify,attrib 是指監聽「建立 移動 刪除 寫入 權限」 事件

rsync參數

            -v, --verbose 詳細模式輸出

            -a, --archive 歸檔模式,表示以遞歸方式傳輸文件,並保持全部文件屬性,等於-rlptgoD

            -H, --hard-links 保留硬鏈結

            

三、測試

在rsync_server(數據源) 10.15.43.100的/app/rsync_server建立文件

[root@localhost rsync_server]# touch test{1..9}
[root@localhost rsync_server]# touch test{a..j}
[root@localhost rsync_server]# ls
test1  test2  test3  test4  test5  test6  test7  test8  test9  testa  testb  testc  testd  teste  testf  testg  testh  testi  testj
[root@localhost rsync_server]# pwd
/app/rsync_server
[root@localhost rsync_server]#

在rsync_client  (目標端)10.15.43.22八、10.10.2.84上查看已經同步

[root@localhost rsync_client]# ls
test1  test2  test3  test4  test5  test6  test7  test8  test9  testa  testb  testc  testd  teste  testf  testg  testh  testi  testj
[root@localhost rsync_client]# pwd
/app/rsync_client
[root@localhost rsync_client]#

若是以上測試都經過,說明inotify實時觸發rsync同步腳本運行正常。

至此,Linux下Rsync+Inotify-tools實現數據實時同步完成。若是要雙向同步能夠把以上反過來部署次。


報錯:

錯誤一:

rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1039) [sender=3.0.6]

檢查服務器端的目錄(備份目錄)是否存在,並檢查其權限。建立目錄並修正權限可解決問題。

我這裏這個報錯是由於selinux開啓致使的,setenforce 0或者直接disabled便可


錯誤二:

rsync error: error starting client-server protocol (code 5) at main.c(1522) [sender=3.0.5]

解決辦法:

(1) 檢查服務、客戶端密碼文件是否正確:服務端密碼文件(這裏爲/etc/rsync.pass) 的格式爲 用戶:密碼; 客戶端密碼文件爲:密碼(沒有用戶名)

(2)檢查密碼文件的權限是否正確


錯誤三:

password file must not be other-accessible

continuing without password file

Password:

解決辦法:

檢查服務端和客戶端上的密碼配置文件權限是否爲600(只能爲600),若不是能夠經過命令 chmod 600 rsync.pass 修改便可


錯誤四:

password file must not be other-accessible

continuing without password file

這是由於/etc/rsync.pass /etc/passwd.txt的權限不對,應該設置爲600。如:chmod 600 /etc/passwd.txt


錯誤五:

@ERROR: access denied to www from unknown (192.168.1.123)

rsync: connection unexpectedly closed (0 bytes received so far) [receiver]

rsync error: error in rsync protocol data stream (code 12) at io.c(359)

配置選項host allow的問題


錯誤六:

rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(244) [generator=2.6.9]

rsync error: received SIGUSR1 (code 19) at main.c(1182) [receiver=2.6.9]

致使此問題多半是服務端服務沒有被正常啓動,到服務器上去查查服務是否有啓動,而後查看下 /var/run/rsync.pid 文件是否存在,最乾脆的方法是殺死已經啓動了服務,而後再次啓動服務或者讓腳本加入系統啓動服務級別而後shutdown -r now服務器


錯誤七:

rsync: read error: Connection reset by peer (104)

rsync error: error in rsync protocol data stream (code 12) at io.c(604) [sender=2.6.9]

原數據目錄裏沒有數據存在


錯誤八: 

@ERROR: chroot failed 

rsync: connection unexpectedly closed (75 bytes read so far) 

rsync error: error in rsync protocol data stream (code 12) at io.c(150) 

這是由於你在 rsync.conf 中設置的 path 路徑不存在,要新建目錄才能開啓同步


錯誤九: 

rsync: failed to connect to %IP%: No route to host (113) 

rsync error: error in socket IO (code 10) at clientserver.c(104) [receiver=2.6.9] 

防火牆問題致使,這個最好先完全關閉防火牆,排錯的基本法就是這樣,不管是S仍是C,還有ignore errors選項問題也會致使


錯誤十: 

@ERROR: auth failed on module xxxxx 

rsync: connection unexpectedly closed (90 bytes read so far) 

rsync error: error in rsync protocol data stream (code 12) at io.c(150) 

這是由於密碼設置錯了,沒法登入成功,檢查一下/etc/rsync.pass /etc/passwd.txt。還有服務器端沒啓動rsync 服務也會出現這種狀況。

相關文章
相關標籤/搜索