Rsync是一款開源的、快速的、多功能的、可實現全量及增量的本地或遠程數據同步備份的優秀工具。Rstync軟件適用於unix/linux/windows等多種操做系統平臺。python
Rsync英文全稱爲Remotesynchronization,即遠程同步。從軟件的名稱就能夠看出來,Rsync具備可以使本地和遠程兩臺主機之間的數據快速複製同步鏡像、遠程備份的功能,這個功能相似ssh帶的scp命令,但又優於scp命令的功能,scp每次都是全量拷貝,而rsync能夠增量拷貝。固然,Rsync還能夠在本地主機的不通分區或目錄之間全量及增量的複製數據,這又相似cp命令,但一樣也優於cp命令,cp每次都是全量拷貝,而rsync能夠增量拷貝。此外,利用Rsync還能夠實現刪除文件和目錄功能,這又至關於rm命令。linux
一個rsync至關於scp,cp,rm,而且優於他們每個命令。算法
在同步備份數據時,默認狀況下,Rsync經過其獨特的」quick check」算法,它僅同步大小或者最後修改時間發生變化的文件或目錄,固然也能夠根據權限,屬主等屬性的變化同步,但須要制定相應的參數,甚至能夠實現只同步一個文件裏有變化的內容部分,因此,能夠實現快速的同步備份數據。shell
Rsync2.x和rsync3.x差別
windows
# CentOS5,rsync2.x對比方法,把全部的文件對比一遍,而後進行同步。 # CentOS6,rsync3.x對比方法,一邊對比差別,一邊對差別的部分進行同步。
# 支持拷貝特殊文件如連接文件,設備等。 # 能夠有排除指定文件或目錄同步的功能,至關於打包命令tar的排除功能。 # 能夠作到保持源文件或目錄的權限、時間、軟硬連接、屬主、組等全部屬性均不改變-p。 # 能夠實現增量同步,既只同步發生變化的數據,所以數據傳輸效率很高。 # 可使用rcp,rsh,ssh等方式來配合傳輸文件(rsync自己對數據不加密)。 # 能夠經過sockert(進程方式)傳輸文件和數據(服務端和客戶端)。 # 支持匿名或認證(無需系統用戶)的進程模式傳輸,可實現方便安全的進行數據備份及鏡像。 # 注意:須要注意拷貝的時候源目錄加「/」和不加「/」的區別(加「/」表示只拷貝該目錄之下的文件;不加「/」表示連該目錄一塊兒拷貝)
定時備份
安全
# 能夠經過crond + rsync 來實現
實時備份
服務器
# 能夠經過inotify(sersync)+ rsync來實現
做爲客戶端命令,經常使用參數以下
網絡
# -avz --多個參數的集合 # -v, --verbose 詳細模式輸出,傳輸時的進度等信息 # -z, --compress 傳輸時進行壓縮以提升傳輸效率,--compress-level=NUM可按級別壓縮。 # -a,--archive 歸檔模式,表示以遞歸方式傳輸文件,並保持全部文件屬性,等於-rtopgDl # -r,--recursive 對子目錄以遞歸模式,即目錄下全部目錄有一樣傳輸 # -t,--times,保持文件時間信息 # -o,--owner 保持文件屬主信息 # -p,--perms 保持文件權限 # -g,--group 保持文件屬組信息 # -P,--progress 顯示同步的過程及傳世時的進度等信息(大寫的P) # -D,devices 保持設備文件信息 # -l,--links 保持軟連接 # -e,--rsh=COMMAND 使用的信道協議,指替代rsh的shell程序。例如:ssh # -exclude=PATTERN指排斥不須要傳輸的文件模式 # --bwlimit=RATE 限速,默認是以kbit/s爲單位 # --delete --刪除(本地沒有,遠端也沒有),讓目標目錄SRC和源目錄數據DST一致,適用於兩個目錄徹底同樣
Rsync的本地模式,即將本地系統的文件或目錄從一個目錄移動到另一個目錄中,至關於一個系統命令來使用(不經常使用)。ssh
命令格式
socket
# rsync [OPTION...]SRC... [DEST]
Example
[root@jenkins data]# echo 1234 > test1.txt [root@jenkins data]# ls test1.txt [root@jenkins data]# rsync /data/test1.txt /data/test2.txt [root@jenkins data]# cat /data/test2.txt 1234
Rsync的遠程shell模式,即將本地系統文件或目錄從一臺服務器傳輸向另一臺服務器,相似於scp命令。既能夠推送數據到其餘服務器,也能夠下拉文件到本地。(該模式也不經常使用)
命令格式
# Pull: rsync[OPTION...] [USER@]HOST:SRC... [DEST] # Push: rsync[OPTION...] SRC... [USER@]HOST:DEST
Example: 將一個文件傳輸到另外一臺服務器
[root@client data]# rsync -avz /data/test1.txt root@39.108.140.0:/root/ root@39.108.140.0's password: sending incremental file list test1.txt sent 97 bytes received 35 bytes 37.71 bytes/sec total size is 5 speedup is 0.04 [root@server ~]# cat test1.txt 1234
Example: 將一臺主機的文件下載到本地
[root@client data]# rsync -avz 39.108.140.0:/root/test1.txt /data/test3.txt root@39.108.140.0's password: receiving incremental file list test1.txt sent 43 bytes received 97 bytes 56.00 bytes/sec total size is 5 speedup is 0.04 [root@client data]# cat test3.txt 1234
加密傳輸(隧道傳輸)
Rsync的傳輸協議默認是不加密的明文傳輸,若是有加密傳輸文件的需求,能夠自定義加密管道管道協議。使用參數:-e來指定相應的管道協議。
Example: 跨主機加密傳輸文件,指定ssh協議
[root@client data]# rsync -avz /etc/hosts -e 'ssh -p 22' root@39.108.140.0: root@39.108.140.0's password: sending incremental file list sent 43 bytes received 12 bytes 22.00 bytes/sec total size is 211 speedup is 3.84 # -e 指定加密協議以及協議端口號
限速傳輸
Rsync的傳輸默認是不限速的,傳輸時可能會佔用很大的網絡帶寬,影響業務正常使用。可使用參數:-bwlimit來限制傳輸時的網絡帶寬
Example: 傳輸時限速爲1M/s
[root@client data]# dd if=/dev/zero of=test bs=1M count=10 10+0 records in 10+0 records out 10485760 bytes (10 MB) copied, 0.00811283 s, 1.3 GB/s [root@client data]# seq 10 | xargs -i dd if=/dev/zero of={}.dat bs=1024 count=1 # 不限速 [root@client data]# rsync -avz /data/test -e 'ssh -p 22' root@39.108.140.0:/data root@39.108.140.0's password: sending incremental file list test sent 10,293 bytes received 35 bytes 2,950.86 bytes/sec total size is 10,485,760 speedup is 1,015.27 # 限速 [root@client data]# rsync -avz /data/test -e 'ssh -p 22' --bwlimit=1 root@39.108.140.0:/data root@39.108.140.0's password: sending incremental file list test sent 10,293 bytes received 35 bytes 826.24 bytes/sec total size is 10,485,760 speedup is 1,015.27 # bwlimit的參數默認爲1K bits/s
文件備份須要注意的事項
# 1. 備份須要考慮帶寬限速(rsync,scp,ftp都有限速功能) # 2. 備份須要選擇業務低谷
Daemon,即守護進程。該模式是在一臺rsync服務器上安裝並運行一個rsync的服務進程,其餘的客戶端經過rsync命令上傳文件到服務器中。該模式是rsync最經常使用的功能,用來作數據的定時或者實時備份,下面來具體安裝和介紹daemon模式。
節點名 | IP | 軟件版本 | 硬件 | 網絡 | 說明 |
---|---|---|---|---|---|
server | 39.108.140.0 | rsync-3.1.2 | 1C2G | 阿里雲 | 測試環境 |
Client | 47.95.119.205 | rsync-3.1.2 | 1C2G | 阿里雲 | 測試環境 |
[root@server data]# yum -y install rsync [root@server data]# rpm -qa |grep rsync rsync-3.1.2-10.el7.x86_64
修改/etc/rsyncd.conf
該配置文件時rsync服務器端默認的配置文件,該文件默認不存在,須要本身手動建立!填入內容以下:
cat rsyncd.conf uid = rsync # 配置用戶,遠端命令要使用rsync用戶訪問共享目錄(訪問目錄的權限) gid = rsync # 配置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 # 定義日誌文件 [backup] # 配置一個數據存儲的模塊 path = /data # 模塊備份數據路徑 ignore errors read only = false list = false hosts allow = 47.95.119.205,172.25.1.0/24 # 配置登陸權限,能夠多個IP網段用逗號隔開 #hosts deny = 0.0.0.0/32 auth users = rsync_backup # 配置匿名服務登陸用戶(訪問服務的權限) secrets file = /etc/rsync.password # 配置匿名用戶和密碼文件
# 建立用戶名爲rsync的用戶,只讓其運行程序,不給其登陸系統的權限以及家目錄 [root@server data]# useradd rsync -s /sbin/nologin -M [root@server data]# tail -1 /etc/passwd rsync:x:1001:1001::/home/rsync:/sbin/nologin
建立目錄/data,並將其所屬用戶和用戶組修改成rsync,由於程序須要用rsync用戶來訪問這個目錄,若是rsync沒有權限訪問該目錄,那麼客戶端也沒法上傳文件到備份數據目錄。命令以下:
[root@server data]# mkdir /data/ -p [root@server data]# chown rsync:rsync /data/ [root@server data]# ls -ld /data/ drwxr-xr-x 2 rsync rsync 4096 Jul 29 23:12 /data/
/etc/rsync.password
rsync有一個重要的特性,就是可使用一個虛擬的用戶(不是實際存在的用戶)來訪問系統服務。爲了使用這個功能,咱們須要建立一個虛擬的用戶文件,該文件已經在rsyncd.conf配置文件裏面的secrets file定義好了,是/etc/rsync.password文件
[root@server data]# echo "rsync_backup:youmen" > /etc/rsync.password [root@server data]# cat /etc/rsync.password rsync_backup:youmen [root@server data]# chmod 600 /etc/rsync.password # 文件建立完成以後,須要修改文件的權限屬性爲600,不然程序沒法正常運行
[root@server data]# echo '/usr/bin/rsync --daemon' >> /etc/rc.local [root@server data]# tail -1 /etc/rc.local /usr/bin/rsync --daemon
/etc/rsync.password
相對於服務器端來講,客戶端的配置很簡單,只須要建立一個密碼文件就好了。這個密碼文件也是默認不存在,須要手動建立。
[root@client data]# echo "youmen" > /etc/rsync.password [root@client data]# cat /etc/rsync.password youmen [root@client data]# chmod 600 /etc/rsync.password [root@client data]# ls -l /etc/rsync.password -rw------- 1 root root 7 Jul 29 23:29 /etc/rsync.password
[root@server data]# rsync --daemon [root@server data]# ss -atnlp |grep 873 LISTEN 0 5 *:873 *:* users:(("rsync",pid=25230,fd=3)) LISTEN 0 5 :::873 :::* users:(("rsync",pid=25230,fd=5)) # 重啓 [root@server data]# pkill rsync [root@server data]# rsync --daemon
命令格式
# 下載: rsync [OPTION...] [USER@]HOST::SRC... [DEST] # rsync [OPTION...]rsync://[USER@]HOST[:PORT]/SRC... [DEST] # 上傳: rsync [OPTION...] SRC... [USER@]HOST::DEST # rsync [OPTION...] SRC...rsync://[USER@]HOST[:PORT]/DEST
客戶端
[root@client data]# seq 10 | xargs -i dd if=/dev/zero of={}.dat bs=1024 count=1 [root@client data]# ls 10.dat 2.dat 4.dat 6.dat 8.dat 1.dat 3.dat 5.dat 7.dat 9.dat
服務端
[root@server data]# seq 2 | xargs -i dd if=/dev/zero of={}.dat bs=1024 count=1 1+0 records in 1+0 records out 1024 bytes (1.0 kB) copied, 0.000147976 s, 6.9 MB/s 1+0 records in 1+0 records out 1024 bytes (1.0 kB) copied, 9.5039e-05 s, 10.8 MB/s [root@server data]# ls 1.dat 2.dat
Example1: 服務端免密同步文件到客戶端
[root@client ~]# rsync -auv --password-file=/etc/rsync.password rsync_backup@39.108.140.0::backup /data receiving incremental file list ./ 1.dat 2.dat sent 69 bytes received 2,240 bytes 1,539.33 bytes/sec total size is 2,048 speedup is 0.89
Example: 客戶端文件同步到服務端
[root@client data]# rsync -avz --delete /data/ rsync_backup@39.108.140.0::backup --password-file=/etc/rsync.password sent 556 bytes received 921 bytes 2,954.00 bytes/sec total size is 10,240 speedup is 6.93 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1178) [sender=3.1.2]
# 一、支持數據增量備份,支持socket(daemon),集中備份(支持推拉,都是以客戶端爲參照物); # 二、遠程SHELL通道模式能夠加密(SSH)傳輸,socket(daemon)模式須要加密傳輸可使用×××服務或者ipsec服務;
# 一、大量小文件同步的時候,時間比較長,有的時候,rsync進程可能會中止; # 二、同步大文件,10G這樣的大文件有時也會有問題,中途可能會中斷。 # 三、未完整同步前,文件默認是隱藏的,能夠經過續傳等參數實現傳輸。 # 注意: # 一、模式2和模式3不能結合使用 # 二、注意源目錄後面加「/」與沒有的區別(有「/」表示只同步該目錄下的數據;沒有表示連整個目錄一塊兒同步)