說明:
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 服務也會出現這種狀況。