https://download.samba.org/pub/rsync/rsync.htmlhtml
rsync是一款快速的、多功能的、開源的、而且能夠實現全量及增量,可實現遠程或本地數據複製的優秀工具linux
總結:算法
(1)rsync的核心做用是實現本地服務器和遠程服務器上的文件或目錄的複製傳輸(包括本地推到遠程,遠程拉到本地兩種同步方式);shell
(2)rsync也能夠實現本地不一樣路徑下文件的同步,但不能實現遠程路徑1到遠程路徑2之間的同步;windows
(3)rsync既能夠拷貝文件,也能夠拷貝目錄。安全
(4)rsync軟件適用於unix/linux/windows等多種操做系統平臺服務器
重要概念:網絡
本地:本機,本身手裏正在操做的這臺服務器;併發
遠程:非本機,除了本身手裏正在操做的這臺之外的全部服務器;ssh
全量:須要被操做的全部數據(數據第一次被操做的時候必定是全量);
增量:須要被操做的全部數據裏面,相對上一次操做後,發生了變化的數據(數據至少被操做了一次以後,纔會有增量這個概念);
推送:從本地往遠程複製傳輸數據(也就是由己及人叫作推),get、pull;
拉取:從遠程往本地複製傳輸數據(也就是由人及己叫作拉),put、push。
(1)支持拷貝普通文件與特殊文件,如連接文件(-l參數),設備(-D參數)等;
(2)能夠作到保持原文件或目錄的權限(-p參數)、時間(-t參數)、軟硬連接(-l參數)、屬主(-o參數)、屬組(-g參數)等全部屬性均不改變;
(3)能夠有排除指定文件或目錄同步的功能,至關於打包命令tar的排除功能;
# 做爲對比,給出tar命令的相關功能舉例
# 在打包全部的腳本時,排除掉test.sh文件;目錄同理
cd /server/scripts/;tar zcvf allShell_backup.tar.gz *.sh --exclude=test.sh
(4)可實現增量同步,既只同步發生變化的數據,所以數據傳輸效率很高(tar -N);
# 做爲對比,給出tar命令的相關功能舉例
# 備份/server/script目錄自2018-03-21以來修改過的文件
cd /server/scripts/;tar -N 2018-03-21 -zcvf /tmp/inc-backup_$(date +%F).tar.gz .
# 備份/server/script目錄自昨天以來修改過的文件
cd /server/scripts/;tar -N $(date -d yesterday "+%F") -zcvf /tmp/inc-backup_$(date +%F).tar.gz ./
# 添加文件到已經打包的文件內,即追加文件到已存在的打包文件內
cd /server/scripts/;tar -rf all.tar *.sh
# 說明:這條命令是將全部的sh文件增長到all.tar的包裏面去,-r是表示增長文件的意思
(5)rsync雖然自己不對數據加密,但可使用rcp,rsh,ssh等方式來配合進行隧道加密傳輸文件(-e參數);
(6)能夠經過socket(進程方式)傳輸文件和數據(服務端和客戶端)*****重點講解的部分;
(7)支持匿名的或認證(無需系統用戶)的進程模式傳輸,方便安全的拷貝傳輸數據。
(1)前提條件:
須要複製傳輸數據的多臺服務器之間的網絡鏈接要通暢;
(2)檢查模式(決定哪些文件須要複製傳輸):
檢查模式是指按照指定規則來檢查哪些文件須要被同步。
rsync有一個本身獨特的叫作「quick check」的算法,
這個算法默認會快速的比對源文件和目標文件(若是存在)的大小和修改時間是否一致,
若是兩端文件的大小或修改時間不一樣,則發送端會傳輸該文件,不然將忽略該文件,
這樣就能夠作到不是每次都整份複製傳輸,這也是rsync複製傳輸時速度至關快的緣由所在。
固然,也能夠經過在使用rsync時指定特定的選項來改變「quick check」算法的檢查項,達到比對更多內容的目的。
rsync支持很是多的選項,其中檢查模式的自定義性是很是有彈性的。
(3)同步模式:
同步模式是指在文件肯定要被複制傳輸後,在同步過程發生以前要作哪些額外工做。
例如
是否要先刪除源服務器上沒有但目標服務器上有的文件,
是否要先備份已存在的目標文件,
是否要追蹤連接文件等額外操做。
rsync也提供很是多的選項使得同步模式變得更具彈性。
總結:
由「quick check」算法,結合rsync的參數,能夠實現每次傳輸的時候,只傳輸有變化的部分,這樣就可以達成一個靈活傳輸數據的目的。
好比,
可以只傳輸A裏面屬主或屬組有變化的文件到B,
可以只傳輸A裏面權限有變化的文件到B,
可以只傳輸A裏面時間戳有變化的文件到B,
還可以只傳輸B裏面目錄內新增或改動的文件到A,
也可以將B裏面有而A裏面沒有的數據傳輸到A
(1)實現數據信息查看(VS ls及ls -d命令)
ls命令實現:
[root@backup ~]# ls -l /data/
[root@backup ~]# ls -ld /data/
rsync命令實現:
[root@backup ~]# rsync /data 《《==查看目錄信息
注意:請比較下面這條rsync命令的執行結果與上一條rsync命令的執行結果的差異。
[root@backup ~]# rsync /data/ 《《==查看目錄下文件信息
重要說明:
舉例詳細說明一下這一點:
rsync命令後面接的目錄信息:/data/# 表示被操做的對象的是/data/目錄下面的全部內容
rsync命令後面接的目錄信息:/data #表示被操做的對象的是/data/目錄自己以及/data/目錄下面的全部內容
(2)實現本地傳輸數據(local-only mode)(VS cp命令)
語法格式
rsync [OPTION…] SRC… [DEST]
程序命令複製傳輸時的參數選項 要複製傳輸的分區、文件 目的地,即把數據複製傳輸到哪裏
拷貝文件
[root@backup ~]# cp -a /etc/hosts /tmp/hosts_cp
[root@backup ~]# ls -l /tmp/hosts
rsync命令實現:
[root@backup ~]# rsync /etc/hosts /tmp/hosts_rsync 《《==把/etc/hosts拷貝到/tmp下,命名爲hosts_rsync
[root@backup ~]# ls -l /tmp/
拷貝目錄
cp命令實現:
[root@backup ~]# cp -ap /data /tmp/
[root@backup ~]# ls -l /tmp/
rsync命令實現:
[root@backup ~]# rsync -av /data /tmp/ 《《==-av參數,將/data目錄拷貝到/tmp下
(3)實現遠程傳輸數據(remote shell mode)(VS scp命令)
語法格式
推送(push)rsync [OPTION…] SRC… [USER@] HOST: [DEST]
拉取(pull) rsync [OPTION…] [USER@] HOST: SRC… [DEST]
命令 參數 傳輸時使用用戶 IP地址 數據把數據複製到本地服務器的位置
分別使用scp及rsync命令推送本地172.16.1.41的/etc/hosts文件到遠程172.16.1.31的/tmp/目錄內
scp命令實現:
[root@backup ~]# scp -rp /etc/hosts 172.16.1.31:/tmp/
[root@backup ~]# rsync 172.16.1.31:/tmp/ 《《==查看31服務器/tmp目錄下文件信息
[root@backup ~]# rsync 172.16.1.31:/tmp 《《==查看31服務器/tmp目錄信息
rsync命令實現:
[root@backup ~]# rm /tmp/* -rf
[root@backup ~]# rsync -avP /etc/hosts 172.16.1.31:/tmp 》》將本地hosts推送到31的/tmp下
分別使用scp及rsync命令拉取遠端172.16.1.31的/data/目錄到本地172.16.1.41的/tmp/目錄內
scp命令實現:
[root@backup ~]# scp -rp root@172.16.1.31:/data /tmp/
[root@backup ~]# ls -l /tmp/
rsync命令實現:
[root@backup ~]# rsync -vrtopglDP root@172.16.1.31:/data /tmp/ 《《==將31下的/data目錄拉到本地/tmp下
[root@backup ~]# ls -l /tmp/
(4)實現數據清空操做(VS rm命令)
刪除/tmp目錄的內容
rsync命令實現:
[root@backup ~]# touch /tmp/{1..10}.txt
[root@backup ~]# mkdir /null
[root@backup ~]# rsync -r --delete /null/ /tmp/ 《《==同步/null內容到/tmp內
總結:rsync命令能夠實現cp、scp、rm、ls(-l和-d參數)這4個命令的功能,而且某些點上rsync命令的功能還優於它們。
拉取 rsync [OPTION…] [USER@]HOST::SRC… [DEST]
推送 rsync [OPTION…] SRC… [USER@]HOST::[DEST]
語法說明
推送push語法格式說明:
rsync # 程序命令
[OPTION...] # 參數
SRC: # 本地要備份的數據信息
[USER@] # 認證用戶信息
HOST:: # 遠程主機IP地址或者域名信息
DEST # 模塊信息
拉取pull語法格式說明:
rsync # 程序命令
[OPTION...] # 參數
[USER@] # 認證用戶信息
HOST:: # 遠程主機IP地址或者域名信息
SRC # 模塊信息
[DEST] # 把備份的數據複製本地主機哪裏
rsync的守護進程模式分爲服務端與客戶端兩部分,rsync默認使用的端口是873
不管作什麼操做,都應該養成一個好的習慣,那就是先進行檢查,再上手操做。
因此第一步應該先檢查服務器上是否已經安裝了rsync軟件。
命令:rpm -qa rsync或rpm -qa | grep rsync
若是檢查結果是服務器上沒有安裝rsync軟件,那麼須要安裝一下,通常rsync軟件在裝機時就已安裝好了。
命令:yum install -y rsync
強調:rsyncd.conf這個配置文件裏面,每一行的後面都不能夠有任何的空格以及tab鍵存在,不然在使用時會報錯
# created by oldboy at 2018
#####rsyncd.conf start#####
# 設置rsync守護進程模式保存進程號的文件的位置及名字
pid file = /var/run/rsyncd.pid
# 設置鎖文件的位置及名字
lock file = /var/run/rsync.lock
# 設置日誌文件的位置及名字,能夠經過log format參數設置日誌格式
log file = /var/log/rsyncd.log
# 設置進行數據傳輸時所使用的linux系統的用戶或UID號
uid = rsync
# 設置進行數據傳輸時所使用的linux系統的用戶組或GID號
gid = rsync
# 這是一個與安全有關的參數。若是設置use chroot = yes,rsync會首先進行chroot設置,
# 將根映射到path參數路徑下,對客戶端而言,系統的根就是path參數所指定的路徑,但這樣作須要root權限,
# 而且在同步符號鏈接資料時僅會同步名稱,而內容將不會同步。
use chroot = no
# 設置併發鏈接數,0表明無限制。超出併發數後,若是依然有客戶端鏈接請求,則將會接收到稍後重試的提示消息。
max connections = 200
# 超時時間
timeout = 300
# 忽略一些I/O錯誤
ignore errors
# 是否容許客戶端傳輸數據到服務端,設置爲yes表示客戶端不可寫,也就是隻讀。
read only = false
# 客戶端請求顯示模塊列表時,是否予以顯示。設置爲true爲顯示,設置爲false爲不顯示。
list = false
# 設置容許哪些主機能夠同步數據,能夠是單個IP,也能夠是網段,多個IP和網段之間使用空格分隔。
hosts allow = 172.16.1.0/24 白名單
# 設置出hosts allow裏面設置的主機之外,要拒絕的IP或網段信息。
hosts deny = 0.0.0.0/32 黑名單
# 設置容許鏈接服務端的rsync服務的虛擬用戶,此用戶與linux系統中的用戶沒有關係。
auth users = rsync_backup
# 設置祕鑰認證文件,此文件要求權限爲制度,建議設爲600。
secrets file = /etc/rsync.password chmod 600 /etc/
# 模塊名稱,rsync守護進程模式經過模塊定義同步的目錄,模塊以[name]的形式定義。
[backup_test]
# 註釋說明,非必須項。
comment = "backup dir by oldboy"
# 同步目錄的真實路徑
path = /backup
#####rsyncd.conf end#####
命令:useradd rsync -s /sbin/nologin -M
檢查:id rsync
配置文件中指定的認證密鑰文件默認是不存在的,須要建立出來。
命令:echo "rsync_backup:oldboyedu" > /etc/rsync.password
檢查:cat /etc/rsync.password
涉及到密碼信息的文件,都應該格外注意安全性,因此儘可能將密鑰文件的權限將至最低,將安全性提到最高。
rsync的密鑰文件只須要root用戶本身可以讀寫便可,因此權限設置爲600便可。
命令:chmod 600 /etc/rsync.password
檢查:ls -l /etc/rsync.password
本地同步目錄必定要確保存在,不存在的話務必要事先建立,不然在應用時會出錯。
命令:mkdir -p /backup
檢查:ls -ld /backup/
因爲在配置文件中設定了uid和gid的信息,因此須要將本地同步目錄屬主和屬組爲相應的用戶。
命令:chown -R rsync.rsync /backup
檢查:ls -ld /backup/
rsync --daemon
命令:ps -ef | grep rsync | grep -v grep
或netstat -nltup | grep rsync
或lsof -i :873
想要讓rsync服務開機自動啓動,能夠將其添加至/etc/rc.local文件內。其中/etc/rc.local文件是
/etc/rc.d/rc/local文件的軟連接。
命令:
echo '# start rsync server when this machine opened.' >> /etc/rc.local
echo '/usr/bin/rsync --daemon' >> /etc/rc.local
可使用killall或者pkill命令殺掉rsync服務,也能夠查到端口號交給kill命令去直接殺掉。
命令:
killall rsync
或pkill rsync
或kill `cat /var/run/rsyncd.pid`
或ps aux |grep rsync |grep -v grep |awk '{print $2}' |xargs kill -9 && rm -f /var/run/rsyncd.pid
命令:rpm -qa rsync或rpm -qa | grep rsync
若是檢查結果是服務器上沒有安裝rsync軟件,那麼須要安裝一下,通常rsync軟件在裝機時就已安裝好了。
命令:yum install -y rsync
此處須要注意,與服務端不一樣的地方在於,客戶端的密鑰文件裏面只須要存放rsyncd.conf中auth users參數設定的用戶的密碼,不須要將用戶也一併存放進去。
也就是說,若是客戶端的密鑰文件裏面也寫成 user:password的形式,反卻是錯誤的寫法,在應用rsync的守護進程模式傳輸數據時,會致使傳輸失敗。
命令:
echo 'oldboyedu' > /etc/rsync.password
檢查:cat /etc/rsync.password
chmod 600 /etc/rsync.password
rsync -avzP /etc/hosts rsync_backup@172.16.1.41::backup_test
rsync -avzP /etc rsync_backup@172.16.1.41::backup_test --password-file=/etc/rsync.password
答: 這多是經過強制結束進程致使的,rsyncd.pid 是在啓動服務的時候建立的,當經過不恰當的方法結束 了進程會致使該文件存在,當再次啓動的時候生成此文件發現文件已存在就會報錯
解決辦法: rm -rf /var/run/rsyncd.pid
緣由:
服務器端的目錄不存在或無權限,建立目錄並修正權限可解決問題。
能夠嘗試修改所屬組 所屬主來解決此問題
緣由:
服務器端該模塊(tee)須要驗證用戶名密碼,但客戶端沒有提供正確的用戶名密碼,認證失敗。
提供正確的用戶名密碼解決此問題。
模塊錯誤,這個是常常出現的問題,解決辦法 檢查模塊是否寫錯。
rsync -auzv --progress --password-file=/etc/rsync.pasword root@192.168.133.128::backup /home/
rsync: could not open password file "/etc/rsync.password": No such file or directory (2)
Password:
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]
遇到這個問題:client端沒有設置/etc/rsync.password這個文件,而在使用rsync命令的時候,加了這個參
數 --password-file=/etc/rsync.pasword
遇到這個問題:client端已經設置/etc/rsync.pas這個文件,裏面也設置了密碼123456,和服務器一致,可是
服務器段設置有錯誤,服務器端應該設置/etc/rsync.password ,裏面內容rsync_backup:123456 ,這裏登錄 名不可缺乏
磁盤空間不夠,因此沒法操做。
能夠經過df /backup 來查看可用空間和已用空間
rsync: opendir "/kexue" (in dtsChannel) failed: Permission denied (13)
注意查看同步的目錄權限是否爲755
說明:此問題很明顯,是配置選項host allow的問題,初學者喜歡一個容許段作成一個配置,而後模塊又是同一個,導致致使
說明:致使此問題多半是服務端服務沒有被正常啓動,到服務器上去查查服務是否有啓動,而後查看下 /var/run/rsync.pid 文件是否存在,最乾脆的方法是殺死已經啓動了服務,而後再次啓動服務或者讓腳本加入系統啓動服務級別而後shutdown -r now服務器