作用:
01. 資料備份的伺服器
02. 進行日誌統一儲存
[root@nfs01 backup]# grep -r oldboy /backup/
/backup/10.0.0.7_bak/oldboy.log:oldboy
什麼是rsync服務
Rsync是一款開源的、快速的、多功能的、可實現全量及增量的本地或遠端資料同步備份的優秀工具
Rsync簡介
rsync英文稱為remote synchronization,從軟體的名稱就可以看出來,rsync具有可使本地和遠端兩臺主機之間的資料快速複製同步映象、遠端備份的功能,這個功能類似於ssh帶的scp命令,但是又優於scp命令的功能,scp每次都是全量拷貝,而rsync可以增量拷貝。當然,rsync還可以在本地主機的不同分割槽或目錄之間全量及增量的複製資料,這又類似cp命令。但是同樣也優於cp命令,cp每次都是全量拷貝,而rsync可以增量拷貝。
在同步資料的時候,預設情況下,rsync通過其獨特的“quick check”演算法,它僅同步大小或者最後修改時間發生變化的檔案或目錄,當然也可根據許可權、屬主等屬性的變化同步,但是需要制定相應的引數,甚至可以實現只同步一個檔案裡有變化的內容部分,所以,可是實現快速的同步備份資料。
rsync官方地址:
小提示:利用rsync還可以實現刪除檔案和目錄的功能,這又相當於rm命令,一個rsync相當於scp、cp、rm,但是還優於他們的每一個命令。
Rsync的特性
支援拷貝特殊檔案,如連線檔案、裝置等。 可以有排除指定檔案或目錄同步的功能,相當於打包命令tar的排除功能。 可以做到保持原檔案或目錄的許可權、時間、軟硬連結、屬主、組等所有屬性均不改變 –p。 可以實現增量同步,既只同步發生變化的資料,因此資料傳輸效率很高(tar-N)。 可以使用rcp、rsh、ssh等方式來配合傳輸檔案(rsync本身不對資料加密)。 可以通過socket(程式方式)傳輸檔案和資料(服務端和客戶端)*。 支援匿名的活認證(無需系統使用者)的程式模式傳輸,可以實現方便安全的進行資料備份和映象。
生產場景架構叢集備份方案
1.藉助cron+rsync把所有客戶伺服器資料同步到備份伺服器。
2.針對公司重要資料備份混亂狀況和領導提出備份全網資料的解決方案。
3.通過本地打包備份,然後rsync結合inotify應用把全網數統一備份到一個固定儲存伺服器,然後在儲存伺服器上通過指令碼檢查並報警管理員備份結果。
4.定期將IDC機房的資料 備份公司的內部伺服器,防止機房地震及火災問題導致資料丟失。
5.實時同步,解決儲存伺服器等的單點問題。
備份型別介紹
Rsync應用場景
1.推: 所有主機推送本地資料至Rsync備份伺服器,會導致資料同步緩慢(適合少量資料備份)
2.拉: rsync備份服務端拉取所有主機上的資料,會導致備份伺服器開銷大
3.大量伺服器備份場景
4.異地備份實現思路
Rsync傳輸模式
Rsync使用三種主要的資料傳輸方式
本地方式
遠端方式
單個主機本地之間的資料傳輸(此時類似於cp
命令)
Local: rsync [OPTION...] SRC... [DEST] rsync # 備份命令(cp) [options] # 選項 SRC... # 本地原始檔 [DEST] # 本地目標檔案 rsync -avz /etc/passwd /tmp/
遠端傳輸方式
通過ssh
通道傳輸資料,類似scp
命令
#pull拉取資料命令 Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] #pull拉取資料示例 [root@backup ~]# rsync -avz root@172.16.1.41:/etc/hostname ./ #拉取遠端檔案 [root@backup ~]# rsync -avz root@172.16.1.41:/root/ /backup/ #拉取遠端目錄下的所有檔案 [root@backup ~]# rsync -avz root@172.16.1.41:/root /backup/ #拉取遠端目錄以及目錄下的所有檔案 Pull #拉取, 下載 rsync #備份命令 [options] #選項 [USER@] #目標主機的系統使用者 HOST #目主機IP地址或域名 SRC... #目標主機原始檔 [DEST] #下載至本地哪個位置
#push推送資料命令
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST #push推送資料示例 rsync -avz /backup/2018-10-01 root@172.16.1.41:/tmp/ Push #推送, 上傳 rsync #備份命令 [options] #選項 SRC... #本地原始檔 [USER@] #目標主機的系統使用者 HOST #目主機IP地址或域名 [DEST] #目標對應位置
Rsync
藉助SSH
協議同步資料存在的缺陷
1.使用系統使用者(不安全) 2.使用普通使用者(會導致許可權不足情況)
守護程式傳輸方式
rsync
自身非常重要的功能(不使用系統使用者,更加安全)
#pull拉取資料命令
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] #1.拉取rsync備份服務的"backup模組"至本地/mnt目錄 [root@nfs01 ~]# rsync -avz rsync_backup@172.16.1.41::backup/ /mnt/ --password-file=/etc/rsync.password rsync #命令 [OPTION...] #選項 [USER@] #遠端主機使用者(虛擬使用者) HOST:: #遠端主機地址 SRC... #遠端主機模組(不是目錄) [DEST] #將遠端主機資料備份至本地什麼位置
#push推送資料命令
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
#2.將本地/mnt目錄推送至rsync備份伺服器的"backup模組"
[root@nfs01 ~]# rsync -avz /mnt/ rsync_backup@172.16.1.41::backup/ --password-file=/etc/rsync.password rsync #命令 [OPTION...] #選項 SRC... #遠端主機模組(不是目錄) [USER@] #遠端主機使用者(虛擬使用者) HOST:: #遠端主機地址 [DEST] #將遠端主機模組備份至本地什麼位置
Rsync命令對應選項
-a # 歸檔模式傳輸, 等於-tropgDl -v # 詳細模式輸出, 列印速率, 檔案數量等 -z # 傳輸時進行壓縮以提高效率 -r # 遞迴傳輸目錄及子目錄,即目錄下得所有目錄都同樣傳輸 -R, --relative # 使用相對路徑名 -t # 保持檔案時間資訊 -o # 保持檔案屬主資訊 -p # 保持檔案許可權 -g # 保持檔案屬組資訊 -l # 保留軟連線 -P # 顯示同步的過程及傳輸時的進度等資訊 -D # 保持裝置檔案資訊 -L # 保留軟連線指向的目標檔案 -e # 使用的通道協議,指定替代rsh的shell程式 --exclude=PATTERN # 指定排除不需要傳輸的檔案模式 --exclude-from=file # 從檔案讀取排除列表 --bwlimit=100 # 限速傳輸 --partial # 斷點續傳 --delete # 讓目標目錄和源目錄資料保持一致, 從目標目錄中刪除無關檔案 --password-file=file # 指定密碼檔案
Rsync服務使用
準備
主機角色 | 外網IP(WAN) | 內網IP(LAN) | 主機名稱 |
---|---|---|---|
Rsync服務端 | 10.0.0.41 | 172.16.1.41 | backup |
Rsync客戶端 | 10.0.0.31 | 172.16.1.31 | nfs |
(1)服務端安裝Rsync
[root@backup ~]# yum -y install rsync
(2)服務端配置Rsync
[root@backup ~]# vim /etc/rsyncd.conf uid = rsync gid = rsync port = 873 fake super = yes use chroot = no max connections = 200 timeout = 600 ignore errors read only = false list = false auth users = rsync_backup secrets file = /etc/rsync.passwd log file = /var/log/rsyncd.log [backup] comment = welcome to oldboyedu backup! path = /backup
-
/etc/rsyncd.conf
配置檔案詳解:-
配置項放在模組外是全域性配置,對所有模組生效
-
配置項放在模組中是區域性配置,僅對該模組生效
-
可以建立多個模組用於多執行緒,多目錄操作
-
[root@backup ~]# cat /etc/rsyncd.conf uid = rsync # 執行程式的使用者 gid = rsync # 執行程式的使用者組 port = 873 # 監聽埠 fake super = yes # 無需讓rsync以root身份執行,允許接收檔案的完整屬性 use chroot = no # 禁錮推送的資料至某個目錄, 不允許跳出該目錄 max connections = 0 # 0是最大併發連線數不限制 timeout = 600 # 超時時間 ignore errors # 忽略錯誤資訊 exclude = lost+found/ # 排除選項 log file = /var/log/rsyncd.log # 指定日誌檔案路徑, 預設 pid file = /var/run/rsyncd.pid # pid檔案路徑 lock file = /var/run/rsyncd.lock # 鎖檔案路徑 read only = false # 對備份資料可讀寫 list = false # 不允許檢視模組資訊 reverse lookup = no # 不做解析反向解析 hosts allow = 172.16.1.0/24 # 允許172.16.1.0網段訪問 auth users = rsync_backup # 定義連線認證使用者 secrets file = /etc/rsync.passwd # 定義連線認證使用者密碼檔案路徑 [backup] # 定義模組資訊 comment = commit # 模組註釋資訊 path = /backup # 定義接收備份資料目錄
(3)服務端建立使用者
建立一個用來執行rsync服務的使用者身份,不允許登入,不建立家目錄
[root@backup ~]# useradd -M -s /sbin/nologin rsync
(4)服務端準備同步目錄
同步目錄的磁碟空間儘可能足夠大,授權rsync使用者為屬主
[root@backup ~]# mkdir /backup [root@backup ~]# chown -R rsync.rsync /backup/
(5)服務端虛擬使用者配置
建立虛擬使用者密碼檔案, 授權600安全許可權(用於客戶端連線時使用的使用者)
[root@backup ~]# echo "rsync_backup:123456" >/etc/rsync.passwd [root@backup ~]# chmod 600 /etc/rsync.passwd # 修改許可權,避免其他人看見此檔案的使用者名稱密碼
(6)服務端啟動
啟動rsync服務,並將rsync加入開機自啟動
[root@backup ~]# systemctl start rsyncd [root@backup ~]# systemctl enable rsyncd
(7)服務端檢查服務和埠
[root@backup ~]# systemctl status rsyncd.service rsyncd.service - fast remote file copy program daemon Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2020-08-31 14:49:55 CST; 15min ago Main PID: 24685 (rsync) CGroup: /system.slice/rsyncd.service └─24685 /usr/bin/rsync --daem.. [root@backup ~]# netstat -lntup | grep 873 tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 24685/rsync tcp6 0 0 :::873 :::* LISTEN 24685/rsync
(8)客戶端安裝
[root@nfs ~]# yum -y install rsync # 方式一:適合終端執行指定使用者密碼檔案 [root@nfs ~]# echo "123456" > /etc/rsync.passwd [root@nfs ~]# chmod 600 /etc/rsync.passwd # 方式二:指令碼中使用環境變數RSYNC_PASSWORD,強烈推薦 [root@nfs ~]# export RSYNC_PASSWORD=123456
客戶端推送backup目錄下所有內容至Rsync
服務端
[root@nfs01 ~]# export RSYNC_PASSWORD=123456 [root@nfs01 ~]# rsync -avz /backup/ rsync_backup@172.16.1.41::backup/
客戶端拉取Rsync
服務端 backup模組資料至本地客戶端的 /backup目錄
[root@nfs01 ~]# export RSYNC_PASSWORD=123456 [root@nfs01 ~]# rsync -avz rsync_backup@172.16.1.41::backup /backup/
Rsync
實現資料無差異同步
# 拉取遠端資料:遠端與本地保持一致,遠端沒有本地有會被刪除, 造成客戶端資料丟失
[root@nfs01 ~]# export RSYNC_PASSWORD=123456
[root@nfs01 ~]# rsync -avz --delete rsync_backup@172.16.1.41::backup/ /backup/
[root@nfs01 ~]# export RSYNC_PASSWORD=123456 [root@nfs01 ~]# rsync -avz --delete /data/ rsync_backup@172.16.1.41::backup/
Rsync
的Limit限速
[root@nfs01 ~]# export RSYNC_PASSWORD=123456 [root@nfs01 ~]# rsync -avz --bwlimit=1 rsync_backup@172.16.1.41::backup/ /backup/
Rsync備份案例
使用3臺伺服器主機名分別為web01、backup 、nfs
主機資訊見下表:
角色 | 外網IP(WAN) | 內網IP(LAN) | 主機名 | |
---|---|---|---|---|
WEB | eth0:10.0.0.7 | eth1:172.16.1.7 | web01 | |
NFS | eth0:10.0.0.31 | eth1:172.16.1.31 | nfs01 | |
Rsync | eth0:10.0.0.41 | eth1:172.16.1.41 | backup |
客戶端需求
1.客戶端提前準備存放的備份的目錄,目錄規則如下:/backup/nfs_172.16.1.31_2018-09-02
2.客戶端在本地打包備份(系統配置檔案、應用配置等)拷貝至/backup/nfs_172.16.1.31_2018-09-02
3.客戶端最後將備份的資料進行推送至備份伺服器 4.客戶端每天凌晨1點定時執行該指令碼 5.客戶端伺服器本地保留最近7天的資料, 避免浪費磁碟空間
服務端需求
1.服務端部署rsync,用於接收客戶端推送過來的備份資料 2.服務端需要每天校驗客戶端推送過來的資料是否完整 3.服務端需要每天校驗的結果通知給管理員 4.服務端僅保留6個月的備份資料,其餘的全部刪除
注意:所有伺服器的備份目錄必須都為/backup
建議備份的資料內容如下:
# 1.開機自啟動配置檔案 裝置掛載配置檔案 本地內網配置檔案 (系統配置檔案)
/etc/rc.local /etc/fstab /etc/hosts
# 2.cron定時任務 firewalld防火牆 指令碼目錄 (重要目錄)
/var/spool/cron/ /etc/firewalld /server/scripts
# 3.系統日誌檔案
/var/log/ /系統安全日誌、sudo日誌、核心日誌、rsyslog日誌
# 4.應用程式服務配置檔案 nginx、PHP、mysql、redis.....
-
客戶端備份實現思路,每天凌晨01點定時執行一次指令碼(打包->標記->推送->保留最近7天的檔案)
[root@nfs scripts]# vim /server/scripts/client_rsync_backup.sh #!/usr/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin Host=$(hostname) Addr=$(ifconfig eth1|awk 'NR==2{print $2}') Date=$(date +%F) Dest=${Host}_${Addr}_${Date} Path=/backup
[ -d $Path/$Dest ] || mkdir -p $Path/$Dest
cd / && \ [ -f $Path/$Dest/system.tar.gz ] || tar czf $Path/$Dest/system.tar.gz etc/fstab etc/rsyncd.conf && \ [ -f $Path/$Dest/log.tar.gz ] || tar czf $Path/$Dest/log.tar.gz var/log/messages var/log/secure && \
[ -f $Path/$Dest/flag ] || md5sum $Path/$Dest/*.tar.gz >$Path/$Dest/flag_$Date
export RSYNC_PASSWORD=123456 rsync -avz $Path/ rsync_backup@172.16.1.41::backup
find $Path/ -type d -mtime +7 | xargs rm -rf
-
客戶端編寫定時任務,讓備份每天凌晨1點執行
00 01 * * * /bin/bash /server/scripts/client_rsync_backup.sh &>/dev/null
-
服務端校驗客戶端推送資料的完整性, (校驗->儲存校驗結果->將儲存的結果通過郵件傳送給管理員->保留最近180天的資料)
# 1.服務端配置郵件功能
[root@backup /]# yum install mailx -y
[root@backup /]# vim /etc/mail.rc # 檔案最後新增
set from=2543843664@qq.com # 郵件來源(發件人)
set smtp=smtps://smtp.qq.com:465 # smtp伺服器地址
set smtp-auth-user=2543843664@qq.com # 發件人郵箱帳號
set smtp-auth-password=xcvzpqgrjtmuecaa # smtp客戶端授權密碼,登入郵箱設定,並非郵箱密碼!
set smtp-auth=login # 需要登入認證
set ssl-verify=ignore # 忽略證照警告
set nss-config-dir=/etc/pki/nssdb/ # 證照所在目錄
# 2.服務端校驗、以及郵件通知指令碼
[root@backup ~]# mkdir /server/scripts -p [root@backup ~]# vim /server/scripts/check_backup.sh #!/usr/bin/bash # 1.定義全域性的變數 export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin # 2.定義區域性變數 Path=/backup Date=$(date +%F) # 3.檢視flag檔案,並對該檔案進行校驗, 然後將校驗的結果儲存至result_時間 find $Path/ -type f -name "flag_$Date"|xargs md5sum -c >$Path/result_${Date} # 4.將校驗的結果傳送郵件給管理員 mailx -s "Rsync Backup $Date" 2543843664@qq.com <$Path/result_${Date} # 5.刪除超過7天的校驗結果檔案, 刪除超過180天的備份資料檔案 find $Path/ -type f -name "result*" -mtime +7|xargs rm -f find $Path/ -type d -mtime +180|xargs rm -rf
-
服務端編寫定時任務指令碼
00 05 * * * /bin/bash /server/scripts/check_backup.sh &>/dev/null
-
擴充套件多臺客戶端
對其他客戶端重複1. 2. 步即可
rsync命令 1v4
a 本地備份資料 cp
[root@nfs01 backup]# cp /etc/hosts /tmp
[root@nfs01 backup]# ll /tmp/hosts
-rw-r--r-- 1 root root 371 May 6 16:11 /tmp/hosts
[root@nfs01 backup]# rsync /etc/hosts /tmp/host_rsync
[root@nfs01 backup]# ll /tmp/host_rsync
-rw-r--r-- 1 root root 371 May 6 16:12 /tmp/host_rsync
b 遠端備份資料 scp
scp -rp /etc/hosts root@172.16.1.41:/backup
root@172.16.1.41's password:
hosts 100% 371 42.8KB/s 00:00
-r --- 遞迴複製傳輸資料
-p --- 保持檔案屬性資訊不變
[root@nfs01 ~]# rsync -rp /etc/hosts 172.16.1.41:/backup/hosts_rsync
root@172.16.1.41's password:
rsync遠端備份目錄:
[root@nfs01 ~]# rsync -rp /oldboy 172.16.1.41:/backup --- 備份的目錄後面沒有 /
root@172.16.1.41's password:
[root@backup ~]# ll /backup
total 0
drwxr-xr-x 2 root root 48 May 6 16:22 oldboy
[root@backup ~]# tree /backup/
/backup/
└── oldboy
├── 01.txt
├── 02.txt
└── 03.txt
1 directory, 3 files[root@nfs01 ~]# rsync -rp /oldboy/ 172.16.1.41:/backup --- 備份的目錄後面有 /root@172.16.1.41's password:[root@backup ~]# ll /backup
total 0
-rw-r--r-- 1 root root 0 May 6 16:24 01.txt
-rw-r--r-- 1 root root 0 May 6 16:24 02.txt
-rw-r--r-- 1 root root 0 May 6 16:24 03.txt
總結: 在使用rsync備份目錄時:
備份目錄後面有 / -- /oldboy/ : 只將目錄下面的內容進行備份傳輸
備份目錄後面沒有/ -- /oldboy : 會將目錄本身以及下面的內容進行傳輸備份
c 替代刪除命令
rm命令
[root@nfs01 ~]# rsync -rp --delete /null/ 172.16.1.41:/backup
root@172.16.1.41's password:
--delete 實現無差異同步資料
面試題: 有一個儲存資料資訊的目錄, 目錄中資料儲存了50G資料, 如何將目錄中的資料快速刪除
rm /目錄/* -rf
d 替代檢視檔案命令 ls
[root@backup ~]# ls /etc/hosts
/etc/hosts
[root@backup ~]# rsync /etc/hosts
-rw-r--r-- 371 2019/05/06 11:55:22 hosts