1. 程式人生 > >第十六課----Rsync數據同步工具

第十六課----Rsync數據同步工具

rm 命令 地址 傳輸 from 客戶端連接 排除 chroot grep -v 格式

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工具更勝一籌。
1.3 Rsync的特性
Rsync的特性如下:
? 支持拷貝特殊文件如鏈接文件,設備等
? 可以有排除(tar?find?)指定文件或目錄同步的功能,相當於打包命令tar的排除功能
? 可以做到保持原文件或目錄的權限,時間,軟硬鏈接,屬主,組等屬性均不改變-p
? 可以實現增量同步,既只同步發生變化的數據,因此數據傳輸效率很高(tar-N)
? 可以使用rcp,rsh,ssh等方式來配合傳輸文件(rsync本身不對數據加密)
? 可以通過socket(進程方式)傳輸文件和數據(服務端和客戶端)
? 支持匿名的或認證(無需系統用戶)的進程模式傳輸,可實現方便安全的進行數據備份及鏡像
1.2 Rsync的工作方式
為了方便同學學習,我從實際的使用功能上進行了一下劃分。一般來說,Rsync大致使用三種主要的傳輸數據的方式。分別為:
? 單個主機本地之間的數據傳輸(此時類似於cp命令的功能)
? 借助rcp,ssh等通道來傳輸數據(此時類似於scp命令的功能)
? 以守護進程(socket)的方式傳輸數據(這個是rsync自身的重要功能) --工作中最重要的 (在遠程做推拉)
以上的幾種rsync的工作方式,我們可以通過man rsync幫助或查看官方的手冊獲得:
1.2.1 本地數據傳輸模式(local-only mode)
Rsync本地傳輸模式的語法為:
rsync [OPTION...] SRC...[DEST]
語法說明:
1)Rsync為同步的命令;
2)[OPTION]為同步時的參數選項
3)SRC為源,即待拷的分區,文件或目錄等;
4)[DEST]為目的分區,文件或目錄等;
直接本地同步:相當於cp
rsync /etc/hosts /tmp/

安裝Rsync 工具

[root@ServerRsync ~]# yum -y install rsync

查看安裝包
[root@ServerRsync ~]# rpm -qa | grep rsync

啟動服務
[root@ServerRsync ~]# rsync --daemon
查看Rsync服務端口
[root@ServerRsync ~]# netstat -lnt
技術分享圖片
使用工具Rsync同步
[root@ServerRsync ~]# rsync -azvP /var/ /backup
技術分享圖片

刪除功能,相當於rm 命令
[root@ServerRsync ~]# rsync -avz --delete /root/allen/ /backup
(原則就是 前面有啥 後面有啥 前面是空 後面就是空)

1.2.4 保持同步目錄及文件屬性
這裏的-avzP 相當於-vzrtopgDIP(還多了DI功能),生產環境常用的參數選項為-avzP或-vzrtopgP如果是放入腳本中,也可以把-v何-P去掉。這裏的--progress可以用-P代替。
特別說明:以上參數為企業生產環境常用參數,對於初學者來說掌握上面內容已足夠。
生產參數:-avz或者用-vzrtopg
1.2.5 使用rsync在本地備份傳輸數據

1.3 借助ssh通道在不同主機之間傳輸數據
示例1:推送:將當前主機內容推送到遠程主機

[root@ServerRsync ~]# rsync -avz -e ‘ssh -p 22‘ /backup/ [email protected]:/tmp/

技術分享圖片

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

查看同步到遠端服務器的結果
[root@ServerRsync ~]# ssh [email protected] "ls -la /tmp/"

技術分享圖片

示例2:將遠程主機內容拉取到當前主機,與推送只是把遠端與本地的目錄位置對換
[root@ServerRsync ~]# rsync -avz -e ‘ssh -p 22‘ [email protected]:/tmp/ /backup/

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

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.4 以守護進程(socket)的方式傳輸數據(重點)
1.4.1 部署前的準備工作:
1.4.2 部署環境
操作系統:
[root@ServerRsync ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
內核版本:
[root@ServerRsync ~]# uname -r
3.10.0-862.el7.x86_64

[root@ServerRsync ~]# uname -ra
Linux ServerRsync 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

主機網絡參數設置:
主機名 網卡eth0 用途 代號
計算機名1 10.1.3.229 rsync客戶端 B-Server
計算機名2 10.1.3.231 rsync服務端 A-Server

1.4.3 具體要求
要求在A-Server上以rsync守護進程的方式部署rsync服務,使得所有rsync節點客戶端主機,可以把本地數據通過rsync的方式備份到數據備份服務器A-Server上。本例的客戶端僅以B-Server,C-Server為例。
技術分享圖片
1.5 開始部署rsync服務--Rsync服務器端A-Server操作過程:
1.5.1 配置rsyncd.conf
首先確認軟件是否安裝:
[root@ServerRsync ~]# rpm -qa rsync
rsync-3.1.2-4.el7.x86_64
然後創建rsyncd.conf文件,並添加如下內容(文件默認不存在)
[root@ServerRsync ~]# cat /etc/rsyncd.conf
備份配置文件
[root@ServerRsync ~]# cp -a /etc/rsyncd.conf /etc/rsyncd.conf.bak

備份文件說明:

用戶

uid = rsync

gid = rsync

程序安全設置

use chroot = no

客戶端連接數

max connections = 200

超時時間

timeout = 300

進程號文件位置

pid file = /var/run/rsyncd.pid1

進程鎖

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 --daemon (873端口)

1.5.2 創建共享目錄及添加rsync程序用戶
創建rsync用戶
[root@ServerRsync ~]# useradd -M -s /sbin/nologin rsync
創建共享目錄
[root@ServerRsync ~]# mkdir /backup/
指定用戶目錄屬性
[root@ServerRsync ~]# chown - R rsync:rsyns /backup/

1.5.3 啟動服務:rsync --daemon

[root@ServerRsync ~]# rsync --daemon
[root@ServerRsync ~]# netstat -antup | grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0: LISTEN 11784/rsync
tcp6 0 0 :::873 :::
LISTEN

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

chown -R rsync /backup

1.5.5 創建rsync虛擬賬戶名和密碼
[root@ServerRsync ~]# echo "rsync_backup:123456" > /etc/rsync.password
[root@ServerRsync ~]# cat /etc/rsync.password
rsync_backup:123456

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

[root@ServerRsync ~]# chmod 600 /etc/rsync.password

關閉防火墻
[root@ServerRsync ~]# systemctl stop firewall
[root@ServerRsync ~]# iptbales -F
[root@ServerRsync ~]# setenforce 0

1.6.5 Rsync同步測試

拉取命令

[root@ServerRsync ~]# rsync -avz [email protected]::backup /backup

--password-file=/etc/rsync.password:免密碼的操作,指定密碼文件位置,如果不寫,則會要求用戶交互式輸入密碼。(如果想掛定時任務,必須得非交互式)

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

rsync -avzP /backup/ [email protected]::backup --password-file=/etc/rsync.password

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

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

說明:
a,b,c,d,e為文件,10.1.3.231是目錄。目錄下有1,2,3,4,5文件
方法一:通過命令行實現排除
測試命令:
[root@ServerRsync ~]#rsync -avz --exclude=a --exclude=thinkmo/3 --exclude=thinkmo/4 [email protected]::backup /backup/ --password-file=/etc/rsync.password
命令說明:
--exlude=文件名 :排除的文件

方法二:通過列表文件實現排除
創建排除列表文件
[root@ServerRsync ~]# cat /root/exclude.txt
1
3
5
a
c
g
[root@ServerRsync ~]#
測試命令:
rsync -avz --exclude-from=/root/exclude.txt [email protected]::backup /backup/ --password-file=/etc/rsync.password

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

1.6.5.6 rsync同步拉取測試:讓rsync客戶端指定目錄內容始終和rsync服務器共享目錄內容保持一致
1)和rsync服務器目錄內容始終保持一致
始終保持一致的意思是說,當Rsync服務器共享目錄增加文件,那麽客戶端指定目錄也增加,服務器端共享目錄刪除文件,那麽客戶端指定目錄也刪除文件
測試命令:
rsync -avz --delete [email protected]::backup /backup/ --password-file=/etc/rsync.password

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

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

【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.thinkmo

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: ps -ef|grep -v grep|grep rsync|wc -l" /bin/true
sleep 1
else
action "Stopping Rsync:ps -ef|grep -v grep | grep "rsync --daemon"|wc -l" /bin/true
sleep 1
fi
}

case "$1" in
start)
start;
;;
stop)
stop;
;;
restart|reload)
$0 stop;
$0 start;
;;
*)
echo $"Usage: $0 {start|stop|restart|reload}"
;;
esac
保存成rsyncd,放到/etc/init.d/rsyncd
[root@thinkmo2 ~]# cp rsync /etc/init.d/rsyncd
[root@thinkmo2 ~]# chmod +x /etc/init.d/rsyncd
[root@thinkmo2 ~]# /etc/init.d/rsyncd stop
已終止
[root@thinkmo2 ~]# /etc/init.d/rsyncd start
Starting Rsync: [確定]

第十六課----Rsync數據同步工具