Linux實戰教學筆記21:Rsync數據同步工具


第二十一節 Rsync數據同步工具

標簽(空格分隔): Linux實戰教學筆記-陳思齊

---本教學筆記是本人學習和工作生涯中的摘記整理而成,此為初稿(尚有諸多不完善之處),為原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章原始出處,作者信息和本聲明。否則將追究法律責任。http://www.cnblogs.com/chensiqiqi/

目錄

1.1 Rsync介紹

1.1.1 什么是Rsync?

Rsync是一款開源的,快速的,多功能的,可實現全量及增量的本地或遠程數據同步備份的優秀工具。Rsync軟件適用於unix/linux/windows等多種操作系統平台。

1.1.2 Rsync簡介

  • Rsync英文全稱Remote synchronization,從軟件的名稱就可以看出來,Rsync具有可使本地和遠程兩台主機之間的數據快速復制同步鏡像,遠程備份的功能,這個功能類似ssh帶的scp命令,但又優於scp命令的功能,scp每次都是全量拷貝,而rsync可以增量拷貝。當然,Rsync還可以在本地主機的不同分區或目錄之間全量及增量的復制數據,這又類似cp命令,但同樣也優於cp命令,cp每次都是全量拷貝,而rsync可以增量拷貝。

小提示:利用Rsync還可以實現刪除文件何目錄的功能,這又相當於rm命令!

  • 一個rsync相當於scp,cp,rm,但是還優於他們每一個命令。

  • 在同步備份數據時,默認情況下,Rsync通過其獨特的“quick check”算法,它僅同步大小或者最后修改時間發生變化的文件或目錄,當然也可根據權限,屬主等屬性的變化同步,但需要指定相應的參數,甚至可以實現只同步一個文件里有變化的內容部分,所以,可以實現快速的同步備份數據。

提示:傳統的cp,scp工具拷貝每次均為完整的拷貝,而rsync除了可以完整拷貝外,還具備增量拷貝的功能,因此,從同步數據的性能及效率上,Rsync工具更勝一籌。

  • CentOS5,rsync2.x比對方法,把所有的文件比對一遍,然后進行同步。

  • CentOS6,rsync3.x比對方法,一邊比對差異,一邊對差異的部分進行同步。

1.3 Rsync的特性

Rsync的特性如下:

  • 支持拷貝特殊文件如鏈接文件,設備等
  • 可以有排除(tar?find?)指定文件或目錄同步的功能,相當於打包命令tar的排除功能
  • 可以做到保持原文件或目錄的權限,時間,軟硬鏈接,屬主,組等屬性均不改變-p
  • 可以實現增量同步,既只同步發生變化的數據,因此數據傳輸效率很高(tar-N)
  • 可以使用rcp,rsh,ssh等方式來配合傳輸文件(rsync本身不對數據加密)
  • 可以通過socket(進程方式)傳輸文件和數據(服務端和客戶端)
  • 支持匿名的或認證(無需系統用戶)的進程模式傳輸,可實現方便安全的進行數據備份及鏡像

1.1.4 Rsync的企業工作場景說明

1.1.4.1 兩台服務器之間數據同步(定時任務+備份數據)即crond+rsync

生產場景集群架構服務器備份方案項目

借助crond+rsync把所有客戶服務器數據同步到備份服務器

簡歷項目經驗:
全網服務器數據備份解決方案提出及負責實施200x.03 - 200x.09

1)針對公司重要數據備份混亂狀況和領導提出備份全網數據的解決方案
2)通過本地打包備份,然后rsync結合inotify應用把全網數據統一備份到一個固定存儲服務器,然后在存儲服務器上通過腳本檢查並報警管理員備份結果
3)定期將IDC機房的數據備份到公司的內部服務器,防止機房地震及火災問題導致數據丟失。

1.1.4.2 實時同步(解決存儲服務器等的單點問題)

利用rsync結合inotify的功能做實時的數據同步,根據存儲服務器上目錄的變化,把變化的數據通過inotify或sersync結合rsync命令實時同步到備份服務器,還可以通過drbd方案以及雙寫的方案實現雙機數據同步。

1.2 Rsync的工作方式

為了方便同學學習,我從實際的使用功能上進行了一下划分。一般來說,Rsync大致使用三種主要的傳輸數據的方式。分別為:

  • 單個主機本地之間的數據傳輸(此時類似於cp命令的功能)
  • 借助rcp,ssh等通道來傳輸數據(此時類似於scp命令的功能)
  • 以守護進程(socket)的方式傳輸數據(這個是rsync自身的重要功能)

以上的幾種rsync的工作方式,我們可以通過man rsync幫助或查看官方的手冊獲得:

NAME
       rsync -- a fast, versatile, remote (and local) file-copying tool

SYNOPSIS
       Local:  rsync [OPTION...] SRC... [DEST]

       Access via remote shell:
         Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
         Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

       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

       Usages with just one SRC arg and no DEST arg will list the source files
       instead of copying.

1.2.1 本地數據傳輸模式(local-only mode)

Rsync本地傳輸模式的語法為:
rsync [OPTION...] SRC...[DEST]
語法說明:
1)Rsync為同步的命令;
2)[OPTION]為同步時的參數選項
3)SRC為源,即待拷的分區,文件或目錄等;
4)[DEST]為目的分區,文件或目錄等;

直接本地同步:相當於cp
rsync /etc/hosts /tmp/

示例1-1 實例1:把系統的hosts文件同步到/opt目錄

[root@chen ~]# rsync /etc/hosts /opt
[root@chen ~]# cat /opt/hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.14.200 mirrors.aliyum.com
192.168.197.133 www.test.com

實例1-2 實例2:把opt目錄拷貝到/mnt下

[root@chen ~]# rsync -avz /opt /mnt #相當於cp -ap /opt /mnt
sending incremental file list
opt/
opt/hosts
opt/rh/

sent 224 bytes  received 39 bytes  526.00 bytes/sec
total size is 221  speedup is 0.84
[root@chen ~]# ll /mnt
total 8
drwxr-xr-x. 3 root root 4096 Mar  5 19:54 opt
-rw-r--r--. 1 root root    5 Dec 25 11:19 test.txt

刪除功能,相當於rm命令

[root@chen ~]# mkdir /old
[root@chen ~]# rsync -avz --delete /old/ /tmp/
sending incremental file list
./
deleting pear/temp/
deleting pear/
deleting old/
deleting .ICE-unix/
deleting user_passwd

sent 29 bytes  received 15 bytes  88.00 bytes/sec
total size is 0  speedup is 0.00
[root@chen ~]# ll /tmp/
total 0

1.2.2 rsync 命令常用參數選項說明:

-v,--verbose 詳細模式輸出,傳輸時的進度等信息
-z,--compress 傳輸時進行壓縮以提高傳輸效率,--compress-level=NUM可按級別壓縮。
-a,--archive 歸檔模式,表示以遞歸方式傳輸文件,並保持所有文件屬性,等於-rtopgD1(字母1)

-r,--recursive 對子目錄以遞歸模式,即目錄下的所有目錄都同樣傳輸,注意是小寫r
-t,--times 保持文件時間信息
-o,--owner 保持文件屬主信息
-p,--perms 保持文件權限
-g,--group 保持文件屬組信息
-P,--progress 顯示同步的過程及傳輸時的進度等信息
-D,--devices 保持設備文件信息
-l,--links 保留軟鏈接
-e,--rsh=COMMAND 使用的信道協議(remote shell),指定替代rsh的shell程序。例如:ssh --exclude=PATTERN 指定排除不需要傳輸的文件模式(和tar參數一樣)
--bwlimit=RATE limit socket I/O bandwidth
--delete 讓源目錄SRC和目標目錄數據DST一致

1.2.3 案例:某DBA做數據同步,帶寬占滿,導致用戶無法訪問網站。

rsync -avz dbfile 10.0.0.41:/backup #沒有給帶寬做限制
rsync -avz --bwlimit=100 dbfile 172.16.1.41:/backup   #限定了帶寬

1.2.4 保持同步目錄及文件屬性

這里的-avzP 相當於-vzrtopgDIP(還多了DI功能),生產環境常用的參數選項為-avzP或-vzrtopgP如果是放入腳本中,也可以把-v何-P去掉。這里的--progress可以用-P代替。

特別說明:以上參數為企業生產環境常用參數,對於初學者來說掌握上面內容已足夠。

生產參數:-avz或者用-vzrtopg

1.2.5 使用rsync在本地備份傳輸數據

實例1:測試本地rsync同步,rsync -avz /opt /tmp

[root@chen ~]# cd /opt #進入目錄
[root@chen opt]# mkdir chensiqi  #創建目錄
[root@chen opt]# touch chensiqi/test.txt #創建文件
[root@chen opt]# chmod -R 700 chensiqi #遞歸授權700
[root@chen opt]# ls -l #查看目錄權限700
total 4
drwx------. 2 root root 4096 Mar  5 22:18 chensiqi
[root@chen opt]# ls -l chensiqi/  #查看文件權限700
total 0
-rwx------. 1 root root 0 Mar  5 22:18 test.txt
[root@chen opt]# rsync -avz /opt/ /tmp/  #通過rsync執行本地同步操作
sending incremental file list
./
chensiqi/
chensiqi/test.txt

sent 116 bytes  received 38 bytes  308.00 bytes/sec
total size is 0  speedup is 0.00
[root@chen opt]# tree /tmp  #目錄文件完全同步過去了
/tmp
`-- chensiqi
    `-- test.txt

1 directory, 1 file
[root@chen opt]# ll /tmp/  #文件夾權限700,保持一致
total 4
drwx------. 2 root root 4096 Mar  5 22:18 chensiqi
[root@chen opt]# ll /tmp/chensiqi/ #文件權限700保持一致
total 0
-rwx------. 1 root root 0 Mar  5 22:18 test.txt

上例演示了將本地/opt目錄下的文件(不包含opt本身)同步到/tmp下其中-avz就是保持目錄或文件的相關屬性的參數

特別提示:請注意以下兩條命令的差別:
1)rsync -avz /opt/ /tmp/
2)rsync -avz /opt /tmp/
1)中/opt/的意思是,僅把/opt/目錄里面的內容同步過來,opt目錄本身並不同步;而后者2)中/opt表示把opt本身及其內部內容全都同步到/tmp下,僅一個/(斜線之差),意義大不相同,請同學們注意使用的差別。
2)在后邊要講的通過遠程shell進行數據傳輸的內容也會有類似的問題,請牢記。

當本地的不同目錄之間需要數據傳輸,特別是經常需要增量傳輸時,這個案例命令可以替代cp等命令,為你提升拷貝的效率。

實例2:將/etc下全部內容(包括/etc目錄本身)備份到/tmp目錄下

[root@chen ~]# rsync -avz /etc /tmp/
sending incremental file list
etc/
etc/.pwd.lock
etc/DIR_COLORS
etc/DIR_COLORS.256color
etc/DIR_COLORS.lightbgcolor
etc/adjtime
etc/aliases
etc/aliases.db
etc/anacrontab
下面的輸出內容省略....

[root@chen ~]# ll /tmp  #同步完成
total 4 
drwxr-xr-x. 79 root root 4096 Mar  5 19:25 etc

第一次運行命令會由於需要掃描並同步所有文件及目錄,因此時間會長一些。如果再次備份就會進行快速對比,忽略通過的文件,速度更快,如下文:

[root@chen ~]# rsync -avz /etc /tmp/
sending incremental file list

sent 39813 bytes  received 196 bytes  80018.00 bytes/sec
total size is 27542875  speedup is 688.42

我們可以看到立刻就同步完成,要傳輸的數據也很少了。因為rsync會比對所有文件和目錄,僅同步有變化(內容,修改時間等各種屬性)的文件或目錄。如果換做cp命令,那么還會重新執行完整的拷貝,浪費系統資源和時間。
當然本地備份同步不僅僅備份目錄,還可以同步單個文件,設備等,相信聰明的你都想到了,在此就不多費筆墨。

特別提示:
在傳輸數據時,rsync命令也需要有對同步的目錄擁有權限如此才可以實現正常傳輸數據。

1.3 借助ssh通道在不同主機之間傳輸數據

示例1:推送:將當前主機內容推送到遠程主機

rsync -avzP -e 'ssh -p 22'/etc/ root@192.168.197.129:/tmp/

[root@chensiqi ~]# rsync -avzP -e 'ssh -p 22' /etc/  root@192.168.197.129:/tmp/ #開始同步
忽略以上內容....
yum/version-groups.conf
         444 100%    1.14kB/s    0:00:00 (xfer#985, to-check=6/1558)
yum/pluginconf.d/
yum/pluginconf.d/fastestmirror.conf
         279 100%    0.72kB/s    0:00:00 (xfer#986, to-check=2/1558)
yum/pluginconf.d/security.conf
          17 100%    0.04kB/s    0:00:00 (xfer#987, to-check=1/1558)
yum/protected.d/
yum/vars/
yum/vars/infra
           6 100%    0.02kB/s    0:00:00 (xfer#988, to-check=0/1558)

sent 9847758 bytes  received 20677 bytes  1518220.77 bytes/sec
total size is 27542879  speedup is 2.79

#命令說明
-e 'ssh -p 22' 表示以ssh的方式通過22端口推送,如果不寫默認22端口


[root@chensiqi ~]# ssh root@chensiqi2 "ls -l /tmp" #查看同步結果
root@chensiqi2's password: 
total 1668
drwxr-xr-x.  5 root root   4096 Dec 24 09:26 ConsoleKit
-rw-r--r--.  1 root root   4439 Apr 12  2016 DIR_COLORS
-rw-r--r--.  1 root root   5139 Apr 12  2016 DIR_COLORS.256color
-rw-r--r--.  1 root root   4113 Apr 12  2016 DIR_COLORS.lightbgcolor
drwxr-xr-x.  3 root root   4096 May 12  2016 NetworkManager
drwxr-xr-x.  4 root root   4096 Dec 24 09:26 X11
以下省略若干內容...

#命令說明:
ssh root@chensiqi2的意思是,以ssh的方式進行連接,通過root賬戶來登錄主機名為chensiqi2的這台主機。
ssh root@chensiqi2 + 命令,可以將命令的結果反饋回來。
chensiqi2是當前主機下的一個hosts影射,/etc/hosts里面添加:IP地址  主機名  即作為映射對應。當輸入主機名時,系統自動通過hosts解析出對應IP地址。例如ssh root@chensiqi2  <==> ssh root@192.168.197.129

示例2:將遠程主機內容拉取到當前主機

rsync -avzP -e 'ssh -p 22' root@chensiqi2:/opt /tmp

關鍵語法說明:
1)-avz相當於-vzrtopgDI,表示同步時文件和目錄屬性不變。
2)-P顯示同步的過程,可以用--progress替換。
3)-e ‘ssh -p 22’表示通過ssh通道傳輸數據,可省略
4)root@chensiqi2:/opt 遠程主機系統用戶,地址,路徑
5)/tmp本地的路徑

實踐演示:通過root用戶從192.168.197.129的/opt目錄(包含目錄本身)把數據拉到本地的/tmp目錄下

[root@chensiqi ~]# rsync -avzP -e 'ssh -p 22' root@192.168.197.129:/opt /tmp/
root@192.168.197.129's password: 
receiving incremental file list
opt/
opt/chensiqi
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=1/3)
opt/rh/

sent 38 bytes  received 122 bytes  29.09 bytes/sec
total size is 0  speedup is 0.00
[root@chensiqi ~]# ll /tmp
total 4
drwxr-xr-x. 3 root root 4096 Mar  6  2017 opt

也可以去掉 -e ‘ssh -p 22’(默認22端口)

[root@chensiqi ~]# rsync -avzP root@192.168.197.129:/opt /tmp/
root@192.168.197.129's password: 
receiving incremental file list

sent 13 bytes  received 80 bytes  37.20 bytes/sec
total size is 0  speedup is 0.00

也可以通過映射好的主機名:(/etc/hosts)

[root@chensiqi ~]# tail -1 /etc/hosts
192.168.197.129 chensiqi2
[root@chensiqi ~]# rsync -avzP root@chensiqi2:/opt /tmp/
root@chensiqi2's password: 
Permission denied, please try again.
root@chensiqi2's password: 
receiving incremental file list
opt/
opt/chensiqi
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=1/3)
opt/rh/

sent 38 bytes  received 122 bytes  21.33 bytes/sec
total size is 0  speedup is 0.00

1.4 以守護進程(socket)的方式傳輸數據(重點)

1.4.1 部署前的准備工作:

1.4.2 部署環境

考慮到很多同學沒有實際的生產環境,本文使用VMWARE虛擬機環境下Linux主機來進行實驗。
和生產環境的真實服務器部署幾乎沒有任何區別。

操作系統:

[root@chensiqi ~]# cat /etc/redhat-release 
CentOS release 6.8 (Final)

內核版本:

[root@chensiqi ~]# uname -r
2.6.32-642.el6.x86_64

主機網絡參數設置:

主機名 網卡eth0 用途 代號
chensiqi 192.168.197.133 rsync客戶端 B-Server
chensiqi2 192.168.197.129 rsync服務端 A-Server

提示:如無特殊說明。子網掩碼均為255.255.255.0

1.4.3 具體要求

要求在A-Server上以rsync守護進程的方式部署rsync服務,使得所有rsync節點客戶端主機,可以把本地數據通過rsync的方式備份到數據備份服務器A-Server上。本例的客戶端僅以B-Server,C-Server為例。

屏幕快照 2017-03-06 下午1.24.38.png-171.6kB

1.5 開始部署rsync服務--Rsync服務器端A-Server操作過程:

1.5.1 配置rsyncd.conf

首先確認軟件是否安裝:

[root@chensiqi2 ~]# rpm -qa rsync
rsync-3.0.6-12.el6.x86_64

然后創建rsyncd.conf文件,並添加如下內容(文件默認不存在)

[root@chensiqi2 backup]# cat /etc/rsyncd.conf
#rsync_config_____start
#created by chensiqi 13:40 2017-3-6
##blog:http://www.cnblogs.com/chensiqiqi/
##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
##########################################
[backup]
# 使用目錄
path = /backup/
# 有錯誤時忽略
ignore errors
# 可讀可寫(true或false)
read only = false
# 阻止遠程列表(不讓通過遠程方式看服務端有啥)
list=false
# 允許IP
hosts allow = 192.168.197.0/24
# 禁止IP
hosts deny = 0.0.0.0/32
# 虛擬用戶
auth users = rsync_backup
# 存放用戶和密碼的文件
secrets file = /etc/rsync.password

##rsync_config______end##

1.5.2 創建共享目錄及添加rsync程序用戶

[root@chensiqi2 ~]# useradd -M -s /sbin/nologin rsync  #創建rsync用戶
[root@chensiqi2 ~]# cat /etc/passwd | grep rsync  
rsync:x:500:500::/home/rsync:/sbin/nologin
[root@chensiqi2 ~]# cat /etc/group | grep rsync
rsync:x:500:
[root@chensiqi2 ~]# mkdir /backup #創建共享目錄

1.5.3 啟動服務:rsync --daemon

[root@chensiqi2 ~]# rsync --daemon
[root@chensiqi2 ~]# netstat -antup | grep rsync
tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      5163/rsync          
tcp        0      0 :::873                      :::*                        LISTEN      5163/rsync  

1.5.4 將A-Server上的/backup文件夾更改屬主rsync

[root@chensiqi2 ~]# chown -R rsync /backup
[root@chensiqi2 ~]# ls -ld /backup
drwxr-xr-x. 2 rsync root 4096 3月   6 22:19 /backup

1.5.5 創建rsync虛擬賬戶名和密碼

[root@chensiqi2 ~]# echo "rsync_backup:123456" >/etc/rsync.password
[root@chensiqi2 ~]# cat /etc/rsync.password
rsync_backup:123456

1.5.6 將賬戶密碼文件的權限設置為600(必須否則失敗)

[root@chensiqi2 ~]# chmod 600 /etc/rsync.password 
[root@chensiqi2 ~]# ll /etc/rsync.password 
-rw-------. 1 root root 20 3月   6 22:27 /etc/rsync.password

1.5.7 加入開機啟動

[root@chensiqi2 ~]# echo "rsync --daemon" >> /etc/rc.local
[root@chensiqi2 ~]# tail -1 /etc/rc.local 
rsync --daemon

注意:
當然還可以用chkconfig rsync on命令,但是必須要編寫適合chkconfig操作的腳本才行。

如何重啟rsync服務?
pkill rsync #關閉rsync服務
rsync --daemon #啟動rsync服務

至此rsync服務器端A-server配置完畢

1.6 開始部署rsync服務--Rsync客戶端B-Server

1.6.1 只需要創建密碼文件

[root@chensiqi ~]# rpm -qa rsync
rsync-3.0.6-12.el6.x86_64
[root@chensiqi ~]# echo "123456" > /etc/rsync.password

1.6.2 將密碼文件的權限設置為600(必須否則失敗)

[root@chensiqi ~]# chmod 600 /etc/rsync.password 
[root@chensiqi ~]# ls -ld /etc/rsync.password 
-rw-------. 1 root root 7 Mar  6 01:42 /etc/rsync.password

至此rsync客戶端B-Server配置完畢。

1.6.5 Rsync同步測試

1.6.5.1 推送測試1:將客戶端指定目錄內容推送到服務器端rsync指定目錄下。

測試命令:

rsync -avz /backup/ rsync_backup@192.168.197.129::backup --password-file=/etc/rsync.password

命令說明:
-avz:保持穩健各項屬性不變,-v顯示同步信息 -P顯示具體同步過程
/backup/:要推送的內容所在目錄
rsync_backup:服務器端rsync服務的同步的用戶名(非Linux用戶)
192.168.197.129:rsync服務器IP地址
backup:rsync服務器配置文件里的模塊名
--password-file=/etc/rsync.password:免密碼的操作,指定密碼文件位置,如果不寫,則會要求用戶交互式輸入密碼。(如果想掛定時任務,必須得非交互式)

演示:

[root@chensiqi backup]# ls
opt.tar.gz
[root@chensiqi backup]# rsync -avzP /backup/ rsync_backup@192.168.197.129::backup --password-file=/etc/rsync.password #同步測試 

sending incremental file list
./
opt.tar.gz
         166 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/2)

sent 258 bytes  received 30 bytes  576.00 bytes/sec
total size is 166  speedup is 0.58

[root@chensiqi backup]# ssh root@chensiqi2 "ls -l /backup" #查看同步結果
root@chensiqi2's password: 
total 4
-rw-r--r--. 1 rsync rsync 166 Mar  6 21:02 opt.tar.gz

1.6.5.2 推送測試2:將客戶端任意目錄推送到rsync服務器端指定目錄下

測試命令:

rsync -avzP /tmp/ rsync_backup@192.168.197.129::backup --password-file=/etc/rsync.password

演示過程:

[root@chensiqi backup]# rsync -avzP /tmp/ rsync_backup@192.168.197.129::backup --password-file=/etc/rsync.password 
sending incremental file list
./
opt.tar.gz2017-03-06
         162 100%    0.00kB/s    0:00:00 (xfer#1, to-check=5/8)
backup/
opt/
opt/chensiqi
           0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=1/8)
opt/rh/

sent 441 bytes  received 62 bytes  1006.00 bytes/sec
total size is 162  speedup is 0.32
[root@chensiqi backup]# ssh root@chensiqi2 "ls /backup"   #看一眼結果
root@chensiqi2's password: 
backup
opt
opt.tar.gz2017-03-06

1.6.5.3 拉取測試1:將rsync服務器端指定目錄全部內容同步到客戶端

測試命令:

rsync -avzP rsync_backup@192.168.197.129::backup /backup/ --password-file=/etc/rsync.password

命令說明:
和推送相比,只是兩個目錄換了個位置。

演示過程:

[root@chensiqi backup]# ls
[root@chensiqi backup]# rsync -avzP rsync_backup@192.168.197.129::backup /backup/ --password-file=/etc/rsync.password 
receiving incremental file list
./
a
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=1/3)
opt.tar.gz
         166 100%  162.11kB/s    0:00:00 (xfer#2, to-check=0/3)

sent 105 bytes  received 389 bytes  988.00 bytes/sec
total size is 166  speedup is 0.34
[root@chensiqi backup]# ls
a  opt.tar.gz

1.6.5.4 拉取測試2:將rsync服務器端指定目錄下的指定內容同步到客戶端

測試命令:

rsync -avzP rsync_backup@192.168.197.129::backup/opt.tar.gz /backup/ --password-file=/etc/rsync.password

演示過程:

[root@chensiqi backup]# ls
[root@chensiqi backup]# rsync -avzP rsync_backup@192.168.197.129::backup/opt.tar.gz /backup/ --password-file=/etc/rsync.password 
receiving incremental file list
opt.tar.gz
         166 100%  162.11kB/s    0:00:00 (xfer#1, to-check=0/1)

sent 83 bytes  received 328 bytes  822.00 bytes/sec
total size is 166  speedup is 0.40
[root@chensiqi backup]# ls
opt.tar.gz

1.6.5.5 拉取測試3: 將rsync服務器端指定目錄下的全部內容排除某目錄或文件后,同步到客戶端

環境准備
我們在rsync服務器端指定目錄下創建如下文件結構

[root@chensiqi2 backup]# ls
a  b  c  chen  d  e
[root@chensiqi2 backup]# ls chen
1  2  3  4  5

說明:
a,b,c,d,e為文件,chen是目錄。目錄下有1,2,3,4,5文件

方法一:通過命令行實現排除

測試命令:

rsync -avz --exclude=a --exclude=chen/3 --exclude=chen/4 rsync_backup@192.168.197.129::backup /backup/ --password-file=/etc/rsync.password 

命令說明:
--exlude=文件名 :排除的文件

演示過程:

[root@chensiqi backup]# rsync -avz --exclude=a --exclude=chen/3 --exclude=chen/4 rsync_backup@192.168.197.129::backup /backup/ --password-file=/etc/rsync.password 
receiving incremental file list
./
.pwd.lock
b
c
d
e
.ICE-unix/
chen/
chen/1
chen/2
chen/5

sent 258 bytes  received 558 bytes  1632.00 bytes/sec
total size is 0  speedup is 0.00

[root@chensiqi backup]# ls
b  c  chen  d  e
[root@chensiqi backup]# ls chen
1  2  5

方法二:通過列表文件實現排除

創建排除列表文件

[root@chensiqi backup]# cat /root/exclude.txt 
1
3
5
b
e

測試命令:

rsync -avz --exclude-from=/root/exclude.txt rsync_backup@192.168.197.129::backup /backup/ --password-file=/etc/rsync.password

命令說明:
--exclude-from=文件的絕對路徑 :引用一個排除列表,列表里只需要輸入排除的文件名即可

演示過程:

[root@chensiqi backup]# cat /root/exclude.txt 
1
3
5
b
e
[root@chensiqi backup]# rsync -avz --exclude-from=/root/exclude.txt rsync_backup@192.168.197.129::backup /backup/ --password-file=/etc/rsync.password 
receiving incremental file list
./
a
c
d
chen/
chen/2
chen/4

sent 202 bytes  received 434 bytes  1272.00 bytes/sec
total size is 0  speedup is 0.00
[root@chensiqi backup]# ls
a  c  chen  d
[root@chensiqi backup]# ls chen
2  4

1.6.5.6 rsync同步拉取測試:讓rsync客戶端指定目錄內容始終和rsync服務器共享目錄內容保持一致

1)和rsync服務器目錄內容始終保持一致

始終保持一致的意思是說,當Rsync服務器共享目錄增加文件,那么客戶端指定目錄也增加,服務器端共享目錄刪除文件,那么客戶端指定目錄也刪除文件

測試命令:

rsync -avz --delete rsync_backup@192.168.197.129::backup /backup/ --password-file=/etc/rsync.password 

命令說明:
--delete :表示同步增,刪,改(文件內容出現變化,也會同步的)

演示過程:

[root@chensiqi backup]# rsync -avz --delete rsync_backup@192.168.197.129::backup /backup/ --password-file=/etc/rsync.password     #進行第一次同步
receiving incremental file list
./
a
b
c
d
e
chen/
chen/1
chen/2
chen/3
chen/4
chen/5

sent 262 bytes  received 663 bytes  1850.00 bytes/sec
total size is 8  speedup is 0.01
[root@chensiqi backup]# ls   #查看同步后的文件
a  b  c  chen  d  e
[root@chensiqi backup]# ssh root@chensiqi2 "rm -rf /backup/a"  #遠程刪除Rsync服務器共享目錄下的文件a
root@chensiqi2's password: 
[root@chensiqi backup]# rsync -avz --delete rsync_backup@192.168.197.129::backup /backup/ --password-file=/etc/rsync.password      #進行第二次同步
receiving incremental file list
deleting a   #可以看到同步過程中進行了一次delete同步
./

sent 69 bytes  received 278 bytes  694.00 bytes/sec
total size is 0  speedup is 0.00
[root@chensiqi backup]# ls  #查看同步結果,文件a消失了。
b  c  chen  d  e
[root@chensiqi backup]# ssh root@chensiqi2 "echo 1111 >/backup/chensiqi" #遠程在rsync服務器端共享目錄下創建一個有內容的文件chensiqi
root@chensiqi2's password: 
[root@chensiqi backup]# rsync -avz --delete rsync_backup@192.168.197.129::backup /backup/ --password-file=/etc/rsync.password   #進行第三次同步
receiving incremental file list
./
chensiqi    #新增了chensiqi文件

sent 88 bytes  received 337 bytes  850.00 bytes/sec
total size is 5  speedup is 0.01
[root@chensiqi backup]# cat chensiqi    #查看同步后的文件內容
1111

[root@chensiqi backup]# ssh root@chensiqi2 "echo 222 >>/backup/chensiqi" #遠程對rsync服務器端共享目錄下的chensiqi文件增加一行內容。
root@chensiqi2's password: 
[root@chensiqi backup]# rsync -avz --delete rsync_backup@192.168.197.129::backup /backup/ --password-file=/etc/rsync.password      #進行第四次同步
receiving incremental file list
chensiqi  #修改后的文件也被同步了

sent 91 bytes  received 338 bytes  858.00 bytes/sec
total size is 9  speedup is 0.02
[root@chensiqi backup]# cat chensiqi  #查看同步后文件內容
1111
222

2)排除某文件后,再和服務器進行同步

測試命令:

rsync -avz --delete --exclude=c rsync_backup@192.168.197.129::backup /backup/ --password-file=/etc/rsync.password 

命令說明:
--exclude=c:同步時不考慮文件名為c的文件

演示過程:

[root@chensiqi backup]# ls   #查看目錄下內容
b  c  chen  chensiqi  d  e
[root@chensiqi backup]# rsync -avz --delete --exclude=c rsync_backup@192.168.197.129::backup /backup/ --password-file=/etc/rsync.password   #第一次同步
receiving incremental file list

sent 73 bytes  received 283 bytes  237.33 bytes/sec
total size is 9  speedup is 0.03
[root@chensiqi backup]# ssh root@chensiqi2 "rm -rf /backup/c"  #遠程刪除服務器端c文件
root@chensiqi2's password: 
[root@chensiqi backup]# rsync -avz --delete --exclude=c rsync_backup@192.168.197.129::backup /backup/ --password-file=/etc/rsync.password   #第二次同步
receiving incremental file list
./          #沒有同步到任何東西

sent 76 bytes  received 286 bytes  241.33 bytes/sec
total size is 9  speedup is 0.02
[root@chensiqi backup]# ssh root@chensiqi2 "touch /backup/c"   #遠程創建c文件
root@chensiqi2's password: 
[root@chensiqi backup]# rsync -avz --delete --exclude=c rsync_backup@192.168.197.129::backup /backup/ --password-file=/etc/rsync.password     #第三次同步
receiving incremental file list
./     #還是沒有同步到任何東西

sent 76 bytes  received 286 bytes  241.33 bytes/sec
total size is 9  speedup is 0.02
[root@chensiqi backup]# ssh root@chensiqi2 "echo 111 >>/backup/c"  #遠程修改c文件
root@chensiqi2's password: 
[root@chensiqi backup]# rsync -avz --delete --exclude=c rsync_backup@192.168.197.129::backup /backup/ --password-file=/etc/rsync.password   #第四次同步
receiving incremental file list
                                             #仍舊沒有同步到任何東西
sent 73 bytes  received 283 bytes  712.00 bytes/sec
total size is 9  speedup is 0.03

1.6.5.7 rsync同步推送測試:讓Rsync服務器端共享目錄始終和rsync客戶端指定目錄內容一致。

1)和rsync客戶端目錄內容始終保持一致

始終保持一致的意思是說,當Rsync客戶端指定目錄增加文件,那么服務器端共享目錄也增加,客戶端指定目錄刪除文件,那么服務器端共享目錄也刪除文件

測試命令:

rsync -avz --delete /backup/ rsync_backup@192.168.197.129::backup --password-file=/etc/rsync.password 

命令說明:
--delete :表示同步增,刪,改(文件內容出現變化,也會同步的)
與同步拉取相比:只是客戶端目錄放在了服務器端的前邊。

演示過程:

[root@chensiqi backup]# ls
a  b  c  chen  d  e
[root@chensiqi backup]# rsync -avz --delete /backup/ rsync_backup@192.168.197.129::backup --password-file=/etc/rsync.password #第一次同步
sending incremental file list
./
a
b
c
d
e
chen/
chen/1
chen/2
chen/3
chen/4
chen/5

sent 594 bytes  received 206 bytes  533.33 bytes/sec
total size is 0  speedup is 0.00

[root@chensiqi backup]# rm a   #客戶端刪除文件a
rm: remove regular empty file `a'? y
[root@chensiqi backup]# rsync -avz --delete /backup/ rsync_backup@192.168.197.129::backup --password-file=/etc/rsync.password  #第二次同步
sending incremental file list
./
deleting a  #同步了刪除文件a的過程

sent 225 bytes  received 13 bytes  476.00 bytes/sec
total size is 0  speedup is 0.00
[root@chensiqi backup]# touch a   #創建文件a
[root@chensiqi backup]# rsync -avz --delete /backup/ rsync_backup@192.168.197.129::backup --password-file=/etc/rsync.password #第三次同步
sending incremental file list
./
a  #推送了a文件到服務器端

sent 271 bytes  received 32 bytes  606.00 bytes/sec
total size is 0  speedup is 0.00

[root@chensiqi backup]# echo 1111 >>a  #修改文件a
[root@chensiqi backup]# cat a
1111
[root@chensiqi backup]# rsync -avz --delete /backup/ rsync_backup@192.168.197.129::backup --password-file=/etc/rsync.password #第四次同步
sending incremental file list
a      #同步了修改后的文件a到服務器端

sent 277 bytes  received 29 bytes  612.00 bytes/sec
total size is 5  speedup is 0.02

[root@chensiqi backup]# ssh root@chensiqi2 "cat /backup/a"  #遠程查看一下服務器端共享目錄下的文件a的內容
root@chensiqi2's password: 
1111

2)--exclude=文件名。排除某文件后,再和服務器進行同步

和同步拉取排除完全一致,只是目錄換個位置,在此不在多費篇幅,同學們自己測試。

1.6.6 Rsync企業應用之風險提示

特別說明:
執行--delete參數從rsync服務器端往rsync客戶端拉取數據時,一定要小心,最好不用,它比從rsync客戶端帶--delete參數往rsync服務端推送危險的多。客戶端帶--delete參數往服務端推送僅刪除服務端模塊下的數據,而前者有能力刪除rsync客戶端本地的所有數據包括跟下的所有目錄。

rsync推送企業工作場景:
1)備份 --delete 風險
本地有啥,遠端就有啥,本地沒有的遠端有也要刪除。服務器端的目錄數據可能丟失。

rsync拉取企業工作場景:
1)代碼發布,下載。--delete風險
遠端有啥,本地(客戶端)就有啥,遠端沒有的本地有也要刪除。本地的目錄數據可能丟失。

1.6.7 rsync無差異同步的生產場景應用

一般是有需要兩台服務器之間,必須要求數據一致,且時時性又不是很高的情況下,如兩台負載均衡下面web服務器之間的同步,或者高可用雙機配置之間的同步等,rsync無差異同步非常的危險,而且,有很多的替代方案,因此,生產場景沒有特殊的需求,應避免使用。切記,有很多朋友都已經有了血的教訓。

1.7 Rsync 優缺點

1.7.1 rsync優點:

1,增量備份,支持socket(daemon),集中備份(支持推拉,都是以客戶端為參照物)。
2,遠程SHELL通道模式還可以加密(SSH)傳輸,socket(daemon)需要加密傳輸,可以利用vpn服務或ipsec服務

1.7.2 rsync缺點:

1,大量小文件時候同步的時候,比對時間較長,有的時候,同步過程中,rsync進程可能會停止,僵死了。
2,同步大文件,10G這樣的大文件有時也會出問題,中斷。未完整同步前,是隱藏文件,可以通過續傳(--partial)等參數實現傳輸
3,一次性遠程拷貝可以用scp,大量小文件要打成一個包再拷貝。(重要)

1.8 排錯必備思想

  • 部署流程步驟熟練
  • rsync原理理解
  • 學會看日志,rsync命令行輸出,日志文件/var/log/rsyncd.log

1.9 Rsync守護進程服務傳輸數據排錯思路:

1.9.1 Rsync服務端排錯思路

  1. 查看rsync服務配置文件路徑是否正確,正確的默認路徑為:/etc/rsyncd.conf
  2. 查看配置文件里host allow,host deny,允許的IP網段是否是允許客戶端訪問的ip網段
  3. 查看配置文件中path參數里的路徑是否存在,權限是否正確(正常應為配置文件中的UID參數對應的屬主和組)
  4. 查看rsync服務是否啟動。查看命令為:ps -ef|grep rsync。端口是否存在netstat -antup |grep 873
  5. 查看iptables防火牆和selinux是否開啟允許rsync服務通過,也可以考慮關閉
  6. 查看服務端rsync配置的密碼文件是否為600的權限,密碼文件格式是否正確,正確格式為:用戶名:密碼,文件路徑和配置文件里的secrect files參數對應。
  7. 如果是推送數據,要查看下,配置rsyncd.conf文件中用戶是否對模塊下目錄有可讀寫的權限。

1.9.2 Rsync客戶端拍錯思路

  1. 查看客戶端rsync配置的密碼文件是否600的權限,密碼文件格式是否正確,注意:僅需要有密碼,並且和服務器端的密碼保持一致。
  2. 用telnet連接rsync服務器ip地址873端口,查看服務是否啟動(可測試服務端防火牆是否阻擋)telnet 192.168.197.129 873
  3. 客戶端執行命令時:rsync -avzP rsync_backup@192.168.197.129::backup /backup/ --password-file=/etc/rsync.password
  4. 此命令的細節要記清楚,尤其192.168.197.129::backup 處的雙冒號及其后的backup為模塊名稱

2【Rsync項目實戰】備份全網服務器數據生產架構方案案例模型(必做)

【企業案例】:
某公司里有一台Web服務器,里面的數據很重要,但是如果硬盤壞了,數據就會丟失,現在領導要求你把數據在其他機器上做一個周期性定時備份。要求如下:

每天晚上00電整在Web服務器A上打包備份網站程序目錄並通過rsync命令推送到服務器B上備份保存(備份思路可以是先在本地按日期打包,然后再利用rsync推送到備份服務器上)。

具體要求如下:
1)NFS服務器nfs01和備份服務器backup的備份目錄必須都為/backup
2)NFS服務器站點目錄假定為(/var/www/html)
3)NFS服務器本地僅保留7天內的備份。
4)備份服務器上檢查備份結果是否正常,並將每天的備份結果發給管理員信箱。
5)備份服務器上每周六的數據都保留,其他備份僅保留180天備份。

附錄1: rsyncd.conf配置文件常用參數說明:

rsyncd.conf參數 參數說明
uid=rsync #rsync使用的用戶。
gid=rsync #rsync使用的用戶組(用戶所在的組)
use chroot=no #如果為true,daemon會在客戶端傳輸文件前“chroot to the path”。這是一種安全配置,因為我們大多數都在內網,所以不配也沒關系
max connections=200 #設置最大連接數,默認0,意思無限制,負值為關閉這個模塊
timeout=400 #默認為0,表示no timeout,建議300-600(5-10分鍾)
pid file #rsync daemon啟動后將其進程pid寫入此文件。如果這個文件存在,rsync不會覆蓋該文件,而是會終止
lock file #指定lock文件用來支持“max connections”參數,使得總連接數不會超過限制
log file #不設或者設置錯誤,rsync會使用rsyslog輸出相關日志信息
ignore errors #忽略I/O錯誤
read only=false #指定客戶端是否可以上傳文件,默認對所有模塊為true
list=false #是否允許客戶端可以查看可用模塊列表,默認為可以
hosts allow #指定可以聯系的客戶端主機名或和ip地址或地址段,默認情況沒有此參數,即都可以連接
hosts deny #指定不可以聯系的客戶端主機名或ip地址或地址段,默認情況沒有此參數,即都可以連接
auth users #指定以空格或逗號分隔的用戶可以使用哪些模塊,用戶不需要在本地系統中存在。默認為所有用戶無密碼訪問
secrets file #指定用戶名和密碼存放的文件,格式;用戶名;密碼,密碼不超過8位
[backup] #這里就是模塊名稱,需用中括號擴起來,起名稱沒有特殊要求,但最好是有意義的名稱,便於以后維護
path #這個模塊中,daemon使用的文件系統或目錄,目錄的權限要注意和配置文件中的權限一致,否則會遇到讀寫的問題

特別說明
1)模塊中的參數項可以拿到全局配置中使用
2)以上配置文件中的參數,為生產中經常使用的參數,初學者掌握這些足夠了。
3)以上配置文件中沒有提到的參數請參考man rsyncd.conf查看

附錄2: 開發rsync服務啟動腳本

#!/bin/bash
#author:Mr.chen
# chkconfig:35 13 91
# description:This is Rsync service management shell script


# Source function library
. /etc/rc.d/init.d/functions


start(){
	rsync --daemon
	if [ $? -eq 0 -a `ps -ef|grep -v grep|grep rsync|wc -l` -gt 0 ];then
		action "Starting Rsync:" /bin/true
		sleep 1
	else
		action "Starting Rsync:" /bin/false
		sleep 1
	fi
}

stop(){
	pkill rsync;sleep 1;pkill rsync
	if [ `ps -ef|grep -v grep|grep "rsync --daemon"|wc -l` -lt 1 ];then
		action "Stopping Rsync: " /bin/true
		sleep 1
	else
		action "Stopping Rsync:" /bin/true
		sleep 1
	fi
}

case "$1" in
	start)
		start;
		;;
	stop)
		stop;
		;;
	restart|reload)
		stop;
		start;
		;;
	*)
		echo $"Usage: $0 {start|stop|restart|reload}"
		;;
esac

保存成rsyncd,放到/etc/init.d/rsyncd

[root@chensiqi2 ~]# cp rsync /etc/init.d/rsyncd
[root@chensiqi2 ~]# chmod +x /etc/init.d/rsyncd 
[root@chensiqi2 ~]# /etc/init.d/rsyncd stop
已終止
[root@chensiqi2 ~]# /etc/init.d/rsyncd start
Starting Rsync:                                            [確定]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM