備份伺服器

作用:
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官方地址:TP rsync監聽埠:873 rsync運行模式:C/S


小提示:利用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.實時同步,解決存儲伺服器等的單點問題。

備份類型介紹

 

完全備份

增量備份

假設客戶端上有file1 file2 file3文件,服務端上有file1 file2文件,現要將客戶端上的數據備份至服務端

 

 

 全量備份,將客戶端所有的數據內容file1 file2 file3全部備份至服務端 (效率低下, 佔用空間)

 

 增量備份,只將客戶端的file3增量備份至服務端 (提高備份效率,節省空間, 適合異地備份 )

Rsync應用場景

Rync的數據同步模式

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 [email protected]:/etc/hostname ./   #拉取遠程文件
 [root@backup ~]# rsync -avz [email protected]:/root/ /backup/   #拉取遠程目錄下的所有文件
 [root@backup ~]# rsync -avz [email protected]:/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 [email protected]:/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 [email protected]::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/ [email protected]::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/ [email protected]::backup/

客戶端拉取Rsync服務端 backup模組數據至本地客戶端的 /backup目錄

 [root@nfs01 ~]# export RSYNC_PASSWORD=123456
 [root@nfs01 ~]# rsync -avz [email protected]::backup /backup/

Rsync實現數據無差異同步

 # 拉取遠端數據:遠端與本地保持一致,遠端沒有本地有會被刪除, 造成客戶端數據丟失
 [root@nfs01 ~]# export RSYNC_PASSWORD=123456
 [root@nfs01 ~]# rsync -avz --delete [email protected]::backup/ /backup/ 
# 推送數據至遠端:本地與遠端保持一致, 本地沒有遠端會被刪除, 造成伺服器端數據丟失
 [root@nfs01 ~]# export RSYNC_PASSWORD=123456
 [root@nfs01 ~]# rsync -avz --delete /data/ [email protected]::backup/

Rsync的Limit限速

 [root@nfs01 ~]# export RSYNC_PASSWORD=123456
 [root@nfs01 ~]# rsync -avz --bwlimit=1 [email protected]::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.....

  1. 客戶端備份實現思路,每天凌晨01點定時執行一次腳本(打包->標記->推送->保留最近7天的文件)

 [root@nfs scripts]# vim /server/scripts/client_rsync_backup.sh
 #!/usr/bin/bash

   # 1.定義變數

 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

  ​# 2.創建備份目錄

 [ -d $Path/$Dest ] || mkdir -p $Path/$Dest

 # 3.備份對應的文件

 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 && \

 # 4.攜帶md5驗證資訊

 [ -f $Path/$Dest/flag ] || md5sum $Path/$Dest/*.tar.gz >$Path/$Dest/flag_$Date

 # 5.推送本地數據至備份伺服器

 export RSYNC_PASSWORD=123456
 rsync -avz $Path/ [email protected]::backup

 # 6.本地保留最近7天的數據

 find $Path/ -type d -mtime +7 | xargs rm -rf
  1. 客戶端編寫定時任務,讓備份每天凌晨1點執行

 00 01 * * * /bin/bash /server/scripts/client_rsync_backup.sh &>/dev/null
  1. 服務端校驗客戶端推送數據的完整性, (校驗->存儲校驗結果->將保存的結果通過郵件發送給管理員->保留最近180天的數據)

 # 1.服務端配置郵件功能
[root@backup /]# yum install mailx -y
 [root@backup /]# vim /etc/mail.rc        # 文件最後添加
 set [email protected]               # 郵件來源(發件人)
 set smtp=smtps://smtp.qq.com:465         # smtp伺服器地址
 set [email protected]     # 發件人郵箱帳號
 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" [email protected] <$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
  1. 服務端編寫定時任務腳本

 00 05 * * * /bin/bash /server/scripts/check_backup.sh &>/dev/null
  1. 擴展多台客戶端

    對其他客戶端重複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 [email protected]:/backup
[email protected]’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
[email protected]’s password:

rsync遠程備份目錄:
[root@nfs01 ~]# rsync -rp /oldboy 172.16.1.41:/backup — 備份的目錄後面沒有 /
[email protected]’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 — 備份的目錄後面有 /[email protected]’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
[email protected]’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