1. RSYNC介紹
RSYNC是一款開源的,快速的,多功能的,可實現全量及增量的本地或遠程數據同步備份的優秀工具。Rsync軟件適用於unix/linux/windows等多種操作系統平台。
遠程數據備份工具,可以實現全備份及增量備份,也可以本地備份。
英文全稱是Remote synchronization.
具有以下三種功能:
- 遠程copy的功能:相當於ssh自帶的scp命令,但是又優於scp命令,scp每次都是全量拷貝。rsync高在增量拷貝,scp每次都是全量copy。
- 本地copy功能:相當於是cp命令,但是又優於cp命令,因為cp每次都是全量copy。
- rsync還可以實現刪除功能:相當於rm命令。
CentOS5.X中自帶的rsync版本都是2.6.x的版本,該版本存在的問題主要是性能方面的,比如,同步大量小文件時容易出現內存溢出或同步中斷等現象,這主要與其2.6版本采用先列文件列表,再進行同步的處理機制有關,在處理大文件同步時也市場發生同步文件不完整的現象.不過在CentOS6.x系列rsync版本都進行了升級,本篇文章使用的linux系統是CentOS6.7, 自帶的rsync的版本是3.0.6.
2. RSYNC的特性
下面的特性是從rsync官方網站上抄錄的:
- support for copying links, devices, owners, groups, and permissions
支持拷貝鏈接,設備,用戶,用戶組和屬性權限。 - exclude and exclude-from options similar to GNU tar
支持像tar一樣排除(或者從文件中排除)備份文件的特性 - a CVS exclude mode for ignoring the same files that CVS would ignore
支持CVS排除文件模式 - can use any transparent remote shell, including ssh or rsh
支持遠程shell(ssh,rsh等)數據傳輸 - does not require super-user privileges
不需要超級用戶的權限 - pipelining of file transfers to minimize latency costs
rsync3.x版本以后是一邊比較文件一邊進行傳輸,減少了文件傳輸的延遲 - support for anonymous or authenticated rsync daemons (ideal for mirroring)
支持匿名或需要驗證的rsync守護進程模式
3. 使用的工作場景
-
把所有客戶數據數據同步到備份服務器(可以配合定時任務,實現每天定時備份)
-
實時同步(解決存儲服務器的單點故障問題),rsync結合inotify的功能做實時數據同步。
4. RSYNC的工作方式
Rsync大致使用三種主要的傳輸數據的方式:
- 單個主機本地之間的數據傳輸(此時類似於cp命令的功能)[本地傳輸模式]
- 借助rcp,ssh等通道來傳輸數據(此時類似於scp命令的功能)[遠程shell傳輸模式]
- 以守護進程(socket)的方式傳輸數據(這個是rsync自身的重要的功能)[守護進程模式]
官方介紹:
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的一些基本理論介紹。看着比較枯燥,下面開始實戰之旅:
5. 實戰環境介紹
眾所周知,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
6. 實戰之本地傳輸模式
本地傳輸模式實現的是本地同步功能,相當於是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
7. 通過遠程shell進行數據傳輸(remote shell mode)
用於兩台機器之間數據的傳輸,比如把重要數據備份到服務器。這個模式相當於是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目錄及其里面的內容。
8. 實戰之使用RSYNC守護進程模式(重點)
可以說,前面講的都是鋪墊,這個才是重中之重。
工作原理:
RSYNC守護進程模式,包含服務器以及客戶機,服務器上啟動rsync的守護進程,客戶機配置對應的用戶名和密碼,實現客戶機到服務器的備份功能。RSYNC守護進程啟動的機器就是我們文章標題所說的備份服務器。 其他的機器作為客戶端,向這台機器推送數據,或從這台機器上拉取數據。
在本篇文章的實戰中服務器端的host那么是backup,所以我們簡稱這台服務器為backup, 客戶機端的hostname是nsf01,同理,我們簡稱這台客戶機為nfs01.
8.1 服務器端(bakup機器)配置
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
8.2 客戶端(nsf01機器)配置
a. 配置密碼文件
[root@nfs01 ~]# echo "grewan" > /etc/rsync.password
b. 修改密碼文件權限
[root@nfs01 ~]# chmod 600 /etc/rsync.password
8.3 示例測試
注意:這里的示例都是在客戶機端(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`
9. 多目錄共享
多目錄共享的意思是說客戶端可以向服務器端多個目錄下進行推送或拉取。這個實現起來很簡單,就是在配置文件中配置多個模塊,每個模塊可以指定不同的用戶名,密碼等等信息。如果所有推送的模塊基本信息都相同,就可以把配置信息放在多個模塊的上面,模塊只配置一個對應的路徑即可,像下面這個示例這樣:
[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