RSYNC是一款開源的,快速的,多功能的,可實現全量及增量的本地或遠程數據同步備份的優秀工具。Rsync軟件適用於unix/linux/windows等多種操做系統平臺。html
遠程數據備份工具,能夠實現全備份及增量備份,也能夠本地備份。linux
英文全稱是Remote synchronization.
具備如下三種功能:shell
CentOS5.X中自帶的rsync版本都是2.6.x的版本,該版本存在的問題主要是性能方面的,好比,同步大量小文件時容易出現內存溢出或同步中斷等現象,這主要與其2.6版本採用先列文件列表,再進行同步的處理機制有關,在處理大文件同步時也市場發生同步文件不完整的現象.不過在CentOS6.x系列rsync版本都進行了升級,本篇文章使用的linux系統是CentOS6.7, 自帶的rsync的版本是3.0.6.windows
下面的特性是從rsync官方網站上抄錄的:安全
把全部客戶數據數據同步到備份服務器(能夠配合定時任務,實現天天定時備份)
服務器
實時同步(解決存儲服務器的單點故障問題),rsync結合inotify的功能作實時數據同步。
ssh
Rsync大體使用三種主要的傳輸數據的方式:socket
官方介紹:ide
1. Local: rsync [OPTION...] SRC... [DEST] 2. Access via remote shell: Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST:DEST 3. Access via rsync daemon: Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST::DEST rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
以上這些就是關於rsync的一些基本理論介紹。看着比較枯燥,下面開始實戰之旅:工具
衆所周知,linux有不一樣的發行商,內核也有不一樣的版本,下面是本篇文章的實驗版本:
[root@backup ~]# cat /etc/redhat-release CentOS release 6.7 (Final) [root@backup ~]# uname -a Linux backup 2.6.32-573.26.1.el6.x86_64 #1 SMP Wed May 4 00:57:44 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux [root@backup ~]#
Rsync的版本:
[root@backup ~]# rsync --version rsync version 3.0.6 protocol version 30
首先確認Rsync是否已經安裝:
[root@backup ~]# rpm -qa rsync rsync-3.0.6-12.el6.x86_64 [root@backup ~]# 出現了這個信息說明已經安裝,若是系統上沒有安裝rsync可使用下面的命令進行安裝: yum install rsync -y
本地傳輸模式實現的是本地同步功能,至關因而cp,rm等命令,說的簡單一點就是在同一臺機器上把數據從一個地方拷貝到另外一個地方或者刪除數據,rsync比cp命令高級的地方在於,rsync拷貝時使用的是增量拷貝,即只會把不一樣的內容拷貝過去,這樣就大大提高了性能。
語法格式
rsync [OPTION...] SRC... [DEST]
語法說明:
1. rsync爲同步的命令 2. [option]爲同步時須要的參數 3. SRC爲源,即待拷貝的分區,文件或目錄 4. [DEST]爲目的分區,文件或目錄
示例:
本地拷貝命令 [root@backup ~]# cp /etc/hosts /tmp #使用cp命令拷貝文件 [root@backup ~]# rsync /etc/hosts /opt #使用rsync命令拷貝文件 [root@backup ~]# ls /opt/hosts /opt/hosts [root@backup ~]# 本地刪除命令:(這個功能比較危險,通常不建議用) [root@backup ~]# mkdir /null -p #建立一個不包含任何文件的空目錄,名稱隨意 [root@backup ~]# ls /tmp/ a.txt hosts today_backup_file.txt [root@backup ~]# rsync -avz --delete /null/ /tmp #而後把這個空目錄拷貝到要刪除的目錄,加--delete參數就實現了rsync的刪除功能, 這裏須要注意/null/這個目錄後面必定要加/,不能寫成/null這樣,寫成這樣的話,就會把/null這個目錄(包含目錄名)拷貝到/tmp目錄下,就實現不了刪除的功能了。 sending incremental file list ./ deleting .ICE-unix/ deleting today_backup_file.txt deleting hosts deleting a.txt deleting .pwd.lock sent 29 bytes received 15 bytes 88.00 bytes/sec total size is 0 speedup is 0.00 [root@backup ~]#
重要參數介紹
-r --recursive 遞歸模式,子目錄下的全部目錄都一樣傳輸 -t --times 保持文件時間信息 -o --owner 保持文件屬主信息 -p –perms 保持文件權限 -g --group保持文件屬性 -P --progress 顯示同步的過程及傳輸時的進度等信息 -D --devices 保持設備文件信息 -l --links 保留軟鏈接 -e --rsh=command 使用的通道協議,指定替代rsh的shell程序,例如ssh等 --exclude=PATTERN 指定排除不須要傳輸的文件模式 --exclude-from=file (文件名所在的目錄文件) --bwlimit=RATE 限制傳輸的速度 更多參數,請參照: http://www.samba.org/ftp/rsync/rsync.html
三個經常使用參數:
-v –verbose 詳細輸出模式,傳輸時的進度等信息 -z –compress 傳輸時進行壓縮以提升傳輸效率, --compress-level=NUM可按級別壓縮 -a --archive 歸檔模式,表示以遞歸方式傳輸文件,並保持全部文件屬性,等於-rtopgDl
用於兩臺機器之間數據的傳輸,好比把重要數據備份到服務器。這個模式至關因而scp命令實現的功能,不過rsync仍是能夠實現增量的拷貝,並且支持目錄的拷貝,這個是比rsync好用的地方。
經過遠程shell(rcp,ssh等)傳輸能夠分爲兩種狀況,其語法分別爲:
拉: rsync [OPTION...] [USER@]HOST:SRC... [DEST] 推: rsync [OPTION...] SRC... [USER@]HOST:DEST
語法說明:
1. rsync 爲同步的命令 2. [OPTION...]爲同步時的參數選項 3. [USER@]HOST:SRC...爲同步的遠程的連接用戶和主機地址 4. SRC爲源,即待copy的分區,文件或目錄等,和HOST之間用一個冒號鏈接 5. [DEST]爲目的分區,文件或目錄等
拉取表示從遠端主機把數據同步到執行命令的本地主機相應的目錄;
推送表示從本地主機執行命令把本地的數據同步到遠端主機指定目錄下。
拉取的語法示例:
rsync -avz -e 'ssh -p 22' root@172.16.1.41:/opt/ /tmp/
推送的語法示例:
rsync -avz -e 'ssh -p 22' /etc/ root@172.16.1.41:/tmp/
特別提示:
注意一下兩個命令的區別:
rsync –avz /opt/ /tmp/ rsync -avz /opt /tmp/
/opt/表示推送或拉取/opt目錄下的內容,/opt表示推送或拉取/opt目錄及其裏面的內容。
能夠說,前面講的都是鋪墊,這個纔是重中之重。
工做原理:
RSYNC守護進程模式,包含服務器以及客戶機,服務器上啓動rsync的守護進程,客戶機配置對應的用戶名和密碼,實現客戶機到服務器的備份功能。RSYNC守護進程啓動的機器就是咱們文章標題所說的備份服務器。 其餘的機器做爲客戶端,向這臺機器推送數據,或從這臺機器上拉取數據。
在本篇文章的實戰中服務器端的host那麼是backup,因此咱們簡稱這臺服務器爲backup, 客戶機端的hostname是nsf01,同理,咱們簡稱這臺客戶機爲nfs01.
a. 首先確認軟件是否安裝:
[root@backup ~]# rpm -aq rsync rsync-3.0.6-12.el6.x86_64 [root@backup ~]#
b. 建立用戶
[root@backup ~]# useradd rsync -s /sbin/nologin -M #這個是rsync進程使用的用戶 [root@backup ~]# id rsync uid=501(rsync) gid=501(rsync) 組=501(rsync) [root@backup ~]# 客戶端連到服務器用rsync用戶訪問權限訪問數據
c. 建立服務器端的配置文件(rsyncd.conf)
#rsync_config_______________start #created by grewan 07::23 2016-05-28 #Email:wangqj541@163.com blog: http://www.cnblogs.com/greta/ ##rsyncd.conf start## uid = rsync gid = rsync use chroot = no max connections = 200 timeout = 300 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log #這個是rsync的log文件,比較有用 [backup] path = /backup/ ignore errors read only = false list = false hosts allow = 172.16.1.0/24 hosts deny = 0.0.0.0/32 auth users = rsync_backup secrets file = /etc/rsync.password #rsync_config_______________end
配置文件說明:
參數 | 說明 |
---|---|
uid=rsync | rsync使用的用戶ID。缺省uid爲-2,一般爲nobody |
gid=rsync | rsync使用的組(用戶所在的組)。缺省gid爲-2,一般爲nobody |
use chroot=no | 若是爲true,daemon會在給客戶端傳輸文件前「chroot to the path」。這是rsync安全的一個配置,由於咱們大多數都是在內網使用rsync,因此不用配置也能夠 |
max connections=200 | 設置最大鏈接數,默認爲0,意思爲無限制,負值爲關閉這個模塊 |
timeout=300 | 默認爲0,意思爲no timeout,建議爲300-500(s) |
pid file=/var/run/rsyncd.pid | rsync daemon啓動後將其進程PID寫入此文件。若是這個文件已經存在,rsync進程不會覆蓋該文件,而是會終止 |
lock file=/var/run/rysncd.lock | 指定loc文件用來支撐max connections的參數,使得總鏈接數不會超過限制,默認爲/var/run/rsyncd.lock |
log file = /var/log/rsyncd.log | rsync的日誌文件 |
ignore errors | 忽略IO錯誤 |
read only = false | 指定客戶端是否能夠上傳文件,默認對全部模塊都爲true |
list = false | 是否容許客戶端能夠查看可用模塊列表(相似ls),默認爲true |
hosts allow = 172.16.1.0/24 | 指定能夠聯繫的客戶端主機名或者ip地址或者地址段,默認狀況沒有此參數,即均可以鏈接 |
hosts deny = 0.0.0.0/32 | 指定不可聯繫的客戶端主機名或IP地址或地址段,禁止他們鏈接。默認狀況沒有此參數,即均可以鏈接 |
auth users = rsync_backup | 指定以空格或逗號分隔的用戶可使用哪些模塊,用戶不須要在本地系統中存在,默認全部用戶無密碼的訪問 |
secrets file = /etc/rsync.password | 指定用戶名和密碼存放的文件。格式:用戶名:密碼, 密碼不超過8位 |
[backup] | 模塊名稱,須要用中括號括起來,起名沒有特殊要求,但最好是有意義的名稱,便於之後維護 |
path = /backup/ | 在這個模塊中,daemon使用的文件系統或目錄,目錄的權限要注意和配置文件中的權限一致,不然會遇到讀寫問題。 |
d. 建立備份目錄
[root@backup ~]# mkdir /backup [root@backup ~]# chown -R rsync.rsync /backup/ #必定記得修改文件的用戶和用戶組 [root@backup ~]# ls -ld /backup/ drwxr-xr-x 2 rsync rsync 4096 5月 22 15:05 /backup/ [root@backup ~]#
e. 建立密碼文件(根據配置文件生生成)
[root@backup ~]# echo "rsync_backup:grewan" > /etc/rsync.password [root@backup ~]# chmod 600 /etc/rsync.password
f. 啓動服務
[root@backup ~]# rsync --daemon [root@backup ~]# lsof -i :873 #rsync的端口是873, 使用這個命令檢查rsync服務是否啓動成功 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsync 3894 root 4u IPv4 15807 0t0 TCP *:rsync (LISTEN) rsync 3894 root 5u IPv6 15808 0t0 TCP *:rsync (LISTEN) 更多信息參考:[root@backup ~]# man rsyncd.conf
a. 配置密碼文件
[root@nfs01 ~]# echo "grewan" > /etc/rsync.password
b. 修改密碼文件權限
[root@nfs01 ~]# chmod 600 /etc/rsync.password
注意:這裏的示例都是在客戶機端(nsf01)上進行操做的,通常的使用場景都是從客戶機備份數據到服務器。
語法格式:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] #推數據到服務器,這種方式比較經常使用 rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST::DEST #從服務器拉數據,這種方式比較經常使用 rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
1.在客戶端(nfs01)上建立/backup目錄,及測試文件
[root@grewan backup]# mkdir /backup -p #建立目錄 [root@grewan backup]# touch {1..10} #建立10個測試文件 [root@grewan backup]# ls 1 10 2 3 4 5 6 7 8 9
2.把客戶端/backup目錄中的內容,備份到備份服務器:
[root@nfs01 backup]# rsync -avz /backup/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password sending incremental file list ./ 1 10 2 3 4 5 6 7 8 9 sent 450 bytes received 201 bytes 1302.00 bytes/sec total size is 0 speedup is 0.00 [root@nfs01 backup]# 命令說明: rsync -avz這個是命令和對應的參數 /backup/: 把backup目錄下的內容推送到服務器 rsync_backup@172.16.1.41::backup : 這個是服務器的信息,rsync_backup是配置文件/etc/rsyncd.conf中配置的用戶名, 172.16.1.41是服務器的ip地址,backup是/etc/rsyncd.conf中配置的模塊名,這個地方必定不要弄錯, 能夠再回去看看配置文件,加深印象 --password-file:指定密碼文件,不加這個參數的狀況下,要手動輸入密碼。
3.在備份服務器端(backup機器)查看備份的結果
[root@backup ~]# cd /backup/ [root@backup backup]# ls 1 10 2 3 4 5 6 7 8 9 [root@backup backup]#
4.第二種推送的方式
使用rsync協議的方式進行推送
[root@nfs01 backup]# rsync -avz /backup/ rsync://rsync_backup@172.16.1.41/backup --password-file=/etc/rsync.password sending incremental file list ./ 1 2 3 4 5 sent 239 bytes received 106 bytes 690.00 bytes/sec total size is 0 speedup is 0.00 [root@nfs01 backup]#
5.從備份服務器拉取內容
[root@nfs01 backup]# rsync -avz rsync_backup@172.16.1.41::backup /backup/ --password-file=/etc/rsync.password receiving incremental file list ./ 1 2 3 4 5 sent 162 bytes received 326 bytes 325.33 bytes/sec total size is 0 speedup is 0.00 [root@nfs01 backup]# ls 1 2 3 4 5 [root@nfs01 backup]#
6.第二種拉取的方式
[root@nfs01 backup]# rm -f * [root@nfs01 backup]# rsync -avz rsync://rsync_backup@172.16.1.41/backup /backup/ --password-file=/etc/rsync.password receiving incremental file list ./ 1 2 3 4 5 sent 162 bytes received 326 bytes 976.00 bytes/sec total size is 0 speedup is 0.00 [root@nfs01 backup]#
7.刪除rsync同步進程
kill `cat /var/run/rsyncd.pid` kill `/var/run/rsyncd.pid`
多目錄共享的意思是說客戶端能夠向服務器端多個目錄下進行推送或拉取。這個實現起來很簡單,就是在配置文件中配置多個模塊,每一個模塊能夠指定不一樣的用戶名,密碼等等信息。若是全部推送的模塊基本信息都相同,就能夠把配置信息放在多個模塊的上面,模塊只配置一個對應的路徑便可,像下面這個示例這樣:
[root@backup backup]# cat /etc/rsyncd.conf #rsync_config_______________start #created by grewan 07::23 2016-05-28 #Email:wangqj541@163.com blog: http://www.cnblogs.com/greta/ ##rsyncd.conf start## uid = rsync gid = rsync use chroot = no max connections = 200 timeout = 300 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log ignore errors read only = false list = false hosts allow = 172.16.1.0/24 hosts deny = 0.0.0.0/32 auth users = rsync_backup secrets file = /etc/rsync.password [backup] #這裏配置多個模塊,共同的配置項目,移動到模塊的上面 path = /backup/ [test] path = /test/ #rsync_config_______________end