運維必備!Linux 遠程數(shù)據(jù)同步工具詳解
一、簡介
1 認識
Rsync(remote synchronize)是一個遠程數(shù)據(jù)同步工具,可通過LAN/WAN快速同步多臺主機間的文件。Rsync使用所謂的“Rsync算法”來使本地和遠 程兩個主機之間的文件達到同步,這個算法只傳送兩個文件的不同部分,而不是每次都整份傳送,因此速度相當快;
Rsync支持大多數(shù)的類Unix系統(tǒng),無論是Linux、Solaris還是BSD上都經(jīng)過了良好的測試;
此外,它在windows平臺下也有相應的版本,如cwRsync和Sync2NAS等工具
2 原理
Rsync本來是用于替代rcp的一個工具,目前由rsync.samba.org維護,所以rsync.conf文件的格式類似于samba的主配 置文件;
Rsync可以通過rsh或ssh使用,也能以daemon模式去運行
在以daemon方式運行時Rsync server會打開一個873 端口,等待客戶端去連接。
連接時,Rsync server會檢查口令是否相符,若通過口令查核,則可以開始進行文件傳輸。第一次連通完成時,會把整份文件傳輸一次,以后則就只需進行增量備份。
3 特點
- 可以鏡像保存整個目錄樹和文件系統(tǒng);
- 可以很容易做到保持原來文件的權限、時間、軟硬鏈接等;
- 無須特殊權限即可安裝;
- 優(yōu)化的流程,文件傳輸效率高;
- 可以使用rsh、ssh等方式來傳輸文件,當然也可以通過直接的socket連接;
- 支持匿名傳輸
二、ssh模式
1 本地間同步
環(huán)境:172.16.22.12
#?mkdir?src
#?touch?src/{1,2,3,4}
#?mkdir?dest
#?rsync?-av?src/?dest/?--將?src?目錄里的所有的文件同步至?dest?目錄(不包含src本身)
#?rsync?-av?src?dest/?--將?src?目錄包括自己整個同步至?dest?目錄
#?rsync?-avR?src/?dest/?--即使?src?后面接有?/?,效果同上
2、局域網(wǎng)間同步
環(huán)境:172.16.22.11
#?mkdir?src
#?touch?src/{a,b,c,d}
#?mkdir?dest
#?rsync?-av?172.16.22.12:/data/test/src/?dest/?--遠程同步至本地,需輸入root密碼
#?rsync?-av?src/?172.16.22.12:/data/test/dest/?--本地文件同步至遠程
#?rsync?-av?src?172.16.22.12:/data/test/dest/?--整個目錄同步過去
#?rm?-rf?src/d?--刪除一個文件?d
#?rsync?-av?--delete?src/?172.16.22.12:/data/test/dest/?--delete,從目標目錄里面刪除無關的文件
3、局域網(wǎng)指定用戶同步
172.16.22.12
#?useradd?george
#?passwd?george
#?mkdir?/home/george/test
#?touch?/home/george/test/g{1,2,3,4}
172.16.22.11
#?rsync?-av?src?'-e?ssh?-l?george'?172.16.22.12:/home/george?--本地同步至遠程
#?rsync?-av?172.16.22.12:/home/george/test/g*?'-e?ssh?-l?george?-p?22'?dest/
三、daemon模式
環(huán)境:192.168.22.11
1、服務啟動方式
1.1、對于負荷較重的 rsync 服務器應該使用獨立運行方式
#?yum?install?rsync?xinetd?--服務安裝
#?/usr/bin/rsync?--daemon
1.2、對于負荷較輕的 rsync 服務器可以使用 xinetd 運行方式
#?yum?install?rsync?xinetd?--服務安裝
#?vim?/etc/xinetd.d/rsync?--配置托管服務,將下項改為?no
disable?=?no
#?/etc/init.d/xinetd?start?--啟動托管服務?xinetd
#?chkconfig?rsync?on
#?netstat?-ntpl?|?grep?873?--查看服務是否啟動
2、配置詳解
兩種 rsync 服務運行方式都需要配置 rsyncd.conf,其格式類似于 samba 的主配置文件
全局參數(shù)
- 在全局參數(shù)部分也可以定義模塊參數(shù),這時該參數(shù)的值就是所有模塊的默認值
- address —在獨立運行時,用于指定的服務器運行的 IP 地址;由 xinetd 運行時將忽略此參數(shù),使用命令行上的 –address 選項替代。默認本地所有IP
- port —指定 rsync 守護進程監(jiān)聽的端口號。由 xinetd 運行時將忽略此參數(shù),使用命令行上的 –port 選項替代。默認 873
- motd file —指定一個消息文件,當客戶連接服務器時該文件的內(nèi)容顯示給客戶
- pid file —rsync 的守護進程將其 PID 寫入指定的文件
- log file —指定 rsync 守護進程的日志文件,而不將日志發(fā)送給 syslog
- syslog facility —指定 rsync 發(fā)送日志消息給 syslog 時的消息級別
- socket options —指定自定義 TCP 選項
- lockfile —指定rsync的鎖文件存放路徑
- timeout = 600 —超時時間
模塊參數(shù)
模塊參數(shù)主要用于定義 rsync 服務器哪個目錄要被同步。模塊聲明的格式必須為 [module] 形式,這個名字就是在 rsync 客戶端看到的名字,類似于 Samba 服務器提供的共享名。而服務器真正同步的數(shù)據(jù)是通過 path 來指定的
基本模塊參數(shù)
- path —指定當前模塊在 rsync 服務器上的同步路徑,該參數(shù)是必須指定的
- comment —給模塊指定一個描述,該描述連同模塊名在客戶連接得到模塊列表時顯示給客戶
模塊控制參數(shù)
- use chroot = —默認為 true,在傳輸文件之前首先 chroot 到 path 參數(shù)所指定的目錄下;優(yōu)點,安全;缺點,需要 root 權限,不能備份指向 path 外部的符號連接所指向的目錄文件
- uid = —指定該模塊以指定的 UID 傳輸文件;默認nobody
- gid = —指定該模塊以指定的 GID 傳輸文件;默認nobody
- max connections —最大并發(fā)連接數(shù),0為不限制
- lock file —指定支持 max connections 參數(shù)的鎖文件。默認 /var/run/rsyncd.lock
- list —指定當客戶請求列出可以使用的模塊列表時,該模塊是否應該被列出。默認為 true,顯示
- read only = —只讀選擇,也就是說,不讓客戶端上傳文件到服務器上。默認true
- write only = —只寫選擇,也就是說,不讓客戶端從服務器上下載文件。默認false
- ignore errors —忽略IO錯誤。默認true
- ignore nonreadable —指定 rysnc服務器完全忽略那些用戶沒有訪問權限的文件。這對于在需要備份的目錄中有些不應該被備份者獲得的文件時是有意義的。false
- timeout = —該選項可以覆蓋客戶指定的 IP 超時時間。從而確保 rsync 服務器不會永遠等待一個崩潰的客戶端。對于匿名 rsync 服務器來說,理想的數(shù)字是 600(單位為秒)。0 (未限制)
- dont compress —用來指定那些在傳輸之前不進行壓縮處理的文件。該選項可以定義一些不允許客戶對該模塊使用的命令選項列表。必須使用選項全名,而不能是簡稱。當發(fā)生拒絕某個選項的情況時,服務器將報告錯誤信息然后退出。例如,要防止使用壓縮,應該是:”dont compress = ”。.gz .tgz .zip .z .rpm .deb .iso .bz2 .tbz
模塊文件篩選參數(shù)
- exclude —指定多個由空格隔開的多個文件或目錄(相對路徑),并將其添加到 exclude 列表中。這等同于在客戶端命令中使用 –exclude 來指定模式
- exclude from —指定一個包含 exclude 規(guī)則定義的文件名,服務器從該文件中讀取 exclude 列表定義
- include —指定多個由空格隔開的多個文件或目錄(相對路徑),并將其添加到 include 列表中。這等同于在客戶端命令中使用 –include 來指定模式
- include from —指定一個包含 include 規(guī)則定義的文件名,服務器從該文件中讀取 include 列表定義
模塊用戶認證參數(shù)
- auth users —指定由空格或逗號分隔的用戶名列表,只有這些用戶才允許連接該模塊(和系統(tǒng)用戶沒有任何關系)。用戶名和口令以明文方式存放在 secrets file 參數(shù)指定的文件中。默認為匿名方式
- secrets file —指定一個 rsync 認證口令文件。只有在 auth users 被定義時,該文件才起作用。文件權限必須是 600
- strict modes —指定是否監(jiān)測口令文件的權限。為 true 則口令文件只能被 rsync 服務器運行身份的用戶訪問,其他任何用戶不可以訪問該文件。默認為true
模塊訪問控制參數(shù)
- hosts allow —用一個主機列表指定哪些主機客戶允許連接該模塊。不匹配主機列表的主機將被拒絕。默認值為 *
- hosts deny —用一個主機列表指定哪些主機客戶不允許連接該模塊
模塊日志參數(shù)
- transfer logging —使 rsync 服務器將傳輸操作記錄到傳輸日志文件。默認值為false
- log format —指定傳輸日志文件的字段。默認為:”%o %h [%a] %m (%u) %f %l”
設置了”log file”參數(shù)時,在日志每行的開始會添加”%t [%p]“;
可以使用的日志格式定義符如下所示:
%o —操作類型:”send” 或 “recv”
%h —遠程主機名
%a —遠程IP地址
%m —模塊名
%u —證的用戶名(匿名時是 null)
%f —文件名
%l —文件長度字符數(shù)
%p —該次 rsync 會話的 PID
%P —模塊路徑
%t —當前時間
%b —實際傳輸?shù)淖止?jié)數(shù)
%c —當發(fā)送文件時,記錄該文件的校驗碼
3、服務端配置
#?vim?/etc/rsyncd.conf?--為?rsyncd?服務編輯配置文件,默認沒有,需自己編輯
- uid = root —rsync運行權限為root
- gid = root —rsync運行權限為root
- use chroot = no —是否讓進程離開工作目錄
- max connections = 5 —最大并發(fā)連接數(shù),0為不限制
- timeout = 600 —超時時間
- pid file = /var/run/rsyncd.pid —指定rsync的pid存放路徑
- lockfile = /var/run/rsyncd.lock —指定rsync的鎖文件存放路徑
- log file = /var/log/rsyncd.log —指定rsync的日志存放路徑
- [web1] —模塊名稱
path = /data/test/src —該模塊存放文件的基礎路徑
ignore errors = yes —忽略一些無關的I/O錯誤
read only = no —客戶端可以上傳
write only = no —客戶端可以下載
hosts allow = 192.168.22.12 —允許連接的客戶端主機ip
hosts deny = —黑名單,表示任何主機
list = yes
auth users = web —認證此模塊的用戶名
secrets file = /etc/web.passwd —指定存放“用戶名:密碼”格式的文件
#?mkdir?/data/test/src?--創(chuàng)建基礎目錄
#?mkdir?/data/test/src/george?--再創(chuàng)建一個目錄
#?touch?/data/test/src/{1,2,3}
#?echo?"web:123"?>?/etc/web.passwd?--創(chuàng)建密碼文件
#?chmod?600?/etc/web.passwd
#?service?xinetd?restart
四、測試
1、客戶端
環(huán)境:192.168.22.12
#?yum?-y?install?rsync
#?mkdir?/data/test
2、小試參數(shù)
#[email protected]::web1?/data/test/?--輸入密碼 123;將服務器 web1 模塊里的文件同步至?/data/test,參數(shù)說明:
- -a —參數(shù),相當于-rlptgoD
- -r —是遞歸
- -l —是鏈接文件,意思是拷貝鏈接文件
- -i —列出 rsync 服務器中的文件
- -p —表示保持文件原有權限
- -t —保持文件原有時間
- -g —保持文件原有用戶組
- -o —保持文件原有屬主
- -D —相當于塊設備文件
- -z —傳輸時壓縮
- -P —傳輸進度
- -v —傳輸時的進度等信息,和-P有點關系
#[email protected]::web1?/data/test/?--讓客戶端與服務器保持完全一致,?--delete
#?rsync?-avzP?--delete?/data/test/[email protected]::web1?--上傳客戶端文件至服務端
#?rsync?-avzP?--delete?/data/test/[email protected]::web1/george?--上傳客戶端文件至服務端的?george?目錄
#?rsync?-ir?--password-file=/tmp/[email protected]::web1?--遞歸列出服務端?web1?模塊的文件
#?rsync?-avzP?--exclude="*3*"?--password-file=/tmp/[email protected]::web1?/data/test/?--同步除了路徑以及文件名中包含?“3”?*的所有文件
3、通過密碼文件同步
#?echo?"123">?/tmp/rsync.password
#?chmod?600?/tmp/rsync.password
#?rsync?-avzP?--delete?--password-file=/tmp/[email protected]::web1?/data/test/?--調(diào)用密碼文件
4、客戶端自動同步
#?crontab?-e
10 0 * rsync -avzP —delete —password-file=/tmp/rsync.password [email protected]::web1 /data/test/
#?crontab?-l
五、數(shù)據(jù)實時同步
環(huán)境:Rsync + Inotify-tools
1、inotify-tools
是為linux下 inotify文件監(jiān)控工具提供的一套c的開發(fā)接口庫函數(shù),同時還提供了一系列的命令行工具,這些工具可以用來監(jiān)控文件系統(tǒng)的事件
inotify-tools是用c編寫的,除了要求內(nèi)核支持 inotify 外,不依賴于其他
inotify-tools提供兩種工具:一是inotifywait,它是用來監(jiān)控文件或目錄的變化,二是inotifywatch,它是用來統(tǒng)計文件系統(tǒng)訪問的次數(shù)
2、安裝inotify-tools
下載地址:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
#?yum?install?–y?gcc?--安裝依賴
#?mkdir?/usr/local/inotify
#?tar?-xf?inotify-tools-3.14.tar.gz
#?cd?inotify-tools-3.14
#?./configure?--prefix=/usr/local/inotify/
#?make?&&?make?install
3、設置環(huán)境變量
#?vim?/root/.bash_profile
export PATH=/usr/local/inotify/bin/:$PATH
#?source?/root/.bash_profile
#?echo?'/usr/local/inotify/lib'?>>?/etc/ld.so.conf?--加載庫文件
#?ldconfig
#?ln?-s?/usr/local/inotify/include?/usr/include/inotify
4、常用參數(shù)
- -m —始終保持監(jiān)聽狀態(tài),默認觸發(fā)事件即退出
- -r —遞歸查詢目錄
- -q —打印出監(jiān)控事件
- -e —定義監(jiān)控的事件,可用參數(shù):
- access —訪問文件
- modify —修改文件
- attrib —屬性變更
- open —打開文件
- delete —刪除文件
- create —新建文件
- move —文件移動
- —fromfile —從文件讀取需要監(jiān)視的文件或者排除的文件,一個文件一行,排除的文件以@開頭
- —timefmt —時間格式
- —format —輸出格式
- —exclude —正則匹配需要排除的文件,大小寫敏感
- —excludei —正則匹配需要排除的文件,忽略大小寫
- %y%m%d %H%M —年月日時鐘
- %T%w%f%e —時間路徑文件名狀態(tài)
5、測試一
檢測源目錄中是否有如下動作:modify,create,move,delete,attrib;
一旦發(fā)生則發(fā)布至目標機器;
方式為 ssh
src: 192.168.22.11(Rsync + Inotify-tools) dest: 192.168.22.12
兩臺機器需要做好 ssh 免密登錄
#?mdkir?/data/test/dest/?--dest機器
#?mdkir?/data/test/src/?--src機器
#?rsync?-av?--delete?/data/test/src/?192.168.22.12:/data/test/dest?--測試下命令
#?vim?/data/test/test.sh
#!/bin/bash
/usr/local/inotify/bin/inotifywait?-mrq?-e?modify,create,move,delete,attrib?/data/test/src?|?while?read?events
do
rsync?-a?--delete?/data/test/src/?192.168.22.12:/data/test/dest
echo?"`date +'%F %T'`?出現(xiàn)事件:$events"?>>?/tmp/rsync.log?2>&1
done
#?chmod?755?/data/test/test.sh
#?/data/test/test.sh?&
#?echo?'/data/test/test.sh?&'?>>?/etc/rc.local?--設置開機自啟
我們可以在目標機上也寫一個這樣的腳本:
rsync?-a?—delete?/data/test/dest/?192.168.22.11:/data/test/src?;
這樣可以實現(xiàn)雙向同步
作者:一個小運維
來源:https://www.cnblogs.com/george-guo/p/7718515.html