01-Rsync備份服務

1、Rsync概念

Rsync一款開源的、一款支持快速徹底備份和增量備份的工具,支持本地複製,遠程同步等,相似於 scp 命令,rsync 命令在同步文件以前要先登陸目標主機進行用戶身份 認證,認證事後才能進行數據同步,身份認證方式取決於所使用的協議類型,rsync 通常使用兩種協議進行數據同步:ssh 協議和 rsync 協議。php

rsync官網html

rsync 監聽端口: 873nginx

2、Rsync備份方式

2.1 徹底備份

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

徹底備份方式:把客戶端全部的數據file1 file2 file3所有備份至服務器(效率低,佔用空間)shell

2.2 增量備份

增量備份方式:把客戶端的file2 file3增量備份至服務端(提升效率,節約空間)安全

3、安裝Rsync

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

4、 Rsync工做模式

4.1 本地模式

代替複製命令cp服務器

[root@backup tools]# ls
install.txt
# 把install.txt複製到/tmp 做用和CP命令同樣
[root@backup tools]# rsync install.txt /tmp
# 查看是否已經複製過去
[root@backup tools]# ll /tmp/install.txt 
-rw-r--r-- 1 root root 5556 Jul  4 01:45 /tmp/install.txt

代替刪除命令rm網絡

## 假設在/tmp下面有100G的數據,如何將目錄中的數據快速刪除
# 1. 建立一個空目錄
[root@backup ~]# mkdir /null
# 2. 使用--delete參數無差別同步
[root@backup ~]# rsync -rp --delete /null/ /tmp
# 確認數據是否被刪除
[root@backup ~]# ll /tmp/
total 0

4.2 遠程模式

代替命令SCPssh

上傳方式:工具

# 把本地文件install.txt上傳到遠程服務器192.168.1.7上
[root@backup tools]# rsync install.txt root@192.168.1.7:/root

# 上傳本地目錄
[root@backup tools]# rsync -rp test root@192.168.1.7:/root

-r   遞歸複製傳輸數據
-p   保持文件屬性信息不變
# 備份目錄後面有  /  test/ : 只將目錄下面的內容進行備份傳輸 
# 備份目錄後面沒有/  test : 會將目錄自己以及下面的內容進行傳輸備份

下載方式:

# 把遠程服務器192.168.1.7/root/test 目錄下載到當前目錄下
[root@backup tools]# rsync  -rp root@192.168.1.7:/root/test ./

4.3 守護進程模式

守護進程方式備份數據:

  1. 能夠進行一些配置管理
  2. 能夠進行安全策略管理
  3. 能夠實現自動傳輸備份數據

Rsync命令語法格式和參數

SYNOPSIS # 概要

# 本地備份數據方式
Local:  rsync [OPTION...] SRC... [DEST] 
   本地備份數據: 
   src: 要備份的數據信息
   dest: 備份到什麼路徑中

# 遠程備份數據方式:
Access via remote shell:
   Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
       [USER@]    --- 以什麼用戶身份拉取數據(默認以當前用戶)
       hosts      --- 指定遠程主機IP地址或者主機名稱
       SRC        --- 要拉取的數據信息
       dest       --- 保存到本地的路徑信息
   
   Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
       SRC        --- 本地要進行遠程傳輸備份的數據
       [USER@]    --- 以什麼用戶身份推送數據(默認以當前用戶)
       hosts      --- 指定遠程主機IP地址或者主機名稱
       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
              
# 選項參數      
[OPTION...] 
    -a #歸檔模式傳輸, 等於-tropgDl
    -v #詳細模式輸出, 打印速率, 文件數量等
    -z #傳輸時進行壓縮以提升效率
    -r #遞歸傳輸目錄及子目錄,即目錄下得全部目錄都一樣傳輸。
    -t #保持文件時間信息
    -o #保持文件屬主信息
    -p #保持文件權限
    -g #保持文件屬組信息
    -l #保留軟鏈接
    -P #顯示同步的過程及傳輸時的進度等信息
    -D #保持設備文件信息
    -L #保留軟鏈接指向的目標文件
    -e #使用的信道協議,指定替代 rsh 的 shell 程序
    --exclude=PATTERN #指定排除不須要傳輸的文件
    --exclude-from=file #指定排除file中包含的文件名 所在目錄的文件
    --bwlimit=100 #限速傳輸  100Mb/8=12.5MB
    --delete #讓目標目錄和源目錄數據保持一致,實現數據無差別同步
# 例如    
[root@backup ~]# rsync  -avz  /backup root@192.168.1.7::/back

5、 Rsync守護進程部署(服務端)

5.1 下載安裝軟件

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

5.2 編寫配置文件

[root@backup ~]# cat /etc/rsyncd.conf
uid = www 
gid = www 
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
ignore errors
read only = false
list = false
hosts allow = 172.16.1.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsync/rsyncd.log

[web_backup]
comment = "The backup data from web_server"
path = /backup

[db_backup]
path = /db_backup

## 配置文件解釋
uid = rsync       	--- 指定管理備份目錄的用戶  
gid = rsync       	--- 指定管理備份目錄的用戶組
port = 873        	--- 定義rsync備份服務的網絡端口號
fake super = yes  	--- 將rsync虛擬用戶假裝成爲一個超級管理員用戶 
use chroot = no   	--- 和安全相關的配置,禁錮推送的數據至某個目錄, 不容許跳出該目錄
max connections = 200 	 --- 最大鏈接數  同時只能有200個客戶端鏈接到備份服務器
timeout = 300         	 		--- 超時時間(單位秒)
pid file = /var/run/rsyncd.pid   --- 記錄進程號碼信息 1.讓程序快速中止進程 2. 判斷一個服務是否正在運行  
lock file = /var/run/rsync.lock  --- 鎖文件
log file = /var/log/rsync/rsyncd.log   --- rsync服務的日誌文件 用於排錯分析問題
ignore errors                    	--- 忽略傳輸中的簡單錯誤
read only = false                  --- 指定備份目錄是可讀可寫
list = false                    		 --- 是否容許客戶端能夠查看服務端的模塊信息
hosts allow = 172.16.1.0/24       --- 容許傳輸備份數據的主機(白名單)
hosts deny = 0.0.0.0/32          	--- 禁止傳輸備份數據的主機(黑名單)
auth users = rsync_backup        --- 指定認證用戶 
secrets file = /etc/rsync.password   --- 指定認證用戶密碼文件 用戶名稱:密碼信息 
 
[web_backup] 		---模塊信息
comment = "The backup data from web_server"   --- 模塊註釋信息
path = /backup          --- 備份路徑

[db_backup]
path = /db_backup

5.3 建立用戶和數據目錄

[root@backup ~]# useradd -M www -s /sbin/nologin
[root@backup ~]# id www
uid=1005(www) gid=1005(www) groups=1005(www)
[root@backup ~]# mkdir /backup
[root@backup ~]# chown -R www.www /backup

5.4 建立密碼文件

[root@backup ~]# echo "rsync_backup:123456" > /etc/rsync.passwd
[root@backup ~]# chmod 600 /etc/rsync.passwd

5.5 啓動服務

[root@backup ~]# systemctl start rsyncd
[root@backup ~]# systemctl enable rsyncd
[root@backup ~]# netstat -tunlp |grep 73

6、 Rsync守護進程部署(客戶端)

6.1 下載安裝軟件

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

6.2 配置密碼文件

[root@web01 ~]# echo 123456> /etc/rsync.password

7、練習

7.1 客戶端備份數據至Rsync服務端

# 客戶端要備份的數據/backup
[root@web01 backup]# tree /backup
web01_backup/
├── a.txt
├── b.txt
├── c.txt
├── install.txt
└── test
    ├── e.txt
    ├── f.txt
    ├── g.txt
    └── h.txt
5 directories, 4 files

# --password-file 指定密碼認證文件
[root@web01 backup]# rsync -avz /backup/ rsync_backup@172.16.1.41::web_backup --password-file=/etc/rsync.password

# 在備份服務器查是否備份成功
[root@backup ~]# cd /web_backup/
[root@backup web_backup]# ll
total 0
drwxr-xr-x 3 www www 76 Jul  4 03:26 web01_backup
[root@backup web_backup]# tree web01_backup/
web01_backup/
├── a.txt
├── b.txt
├── c.txt
├── install.txt
└── test
    ├── e.txt
    ├── f.txt
    ├── g.txt
    └── h.txt
5 directories, 4 files
# 兩邊數據同樣,備份成功

7.2 客戶端從Rsync服務端下載數據

[root@web01 backup]# rsync -avz rsync_backup@172.16.1.41::web_backup /backup --password-file=/etc/rsync.password

# 把Rsync服務端的web_backup模塊下的數據下載到本地/backup目錄下

7.3 Rsync實現數據無差別同步

# 1. 客戶端操做
[root@web01 backup]# cd /backup/web01_backup
[root@web01 web01_backup]# ls
a.txt  b.txt  c.txt  install.txt  test
# 2. 把test目錄移走
[root@web01 web01_backup]# mv test/ /tmp
[root@web01 web01_backup]# ls
a.txt  b.txt  c.txt  install.txt

# 3. 開始無差別同步
[root@web01 web01_backup]# rsync -avz --delete /backup/ rsync_backup@172.16.1.41::web_backup --password-file=/etc/rsync.password

# 4. Rsync服務端查看數據是否存在差別
[root@backup backup]# cd /web_backup/web01_backup/
[root@backup web01_backup]# ls
a.txt  b.txt  c.txt  install.txt

說明:
#1. 下載遠端數據:遠端與本地保持一致,遠端沒有本地有會被刪除, 形成客戶端數據丟失
#2. 上傳數據至遠端:本地與遠端保持一致, 本地沒有遠端會被刪除, 形成服務器端數據丟失

7.4 Rsync備份數據排除功能

### 使用--exclude參數實現排除不想同步的文件
[root@backup web01_backup]# ls
a.txt  b.txt  c.txt  install.txt
# 批量建立1到10,後綴名爲.c的文件
[root@web01 web01_backup]# touch {1..5}.c
[root@web01 web01_backup]# ls
1.c  2.c  3.c  4.c  5.c  a.txt  b.txt  c.txt  install.txt

# 刪除Rsync服務端之前的備份
[root@backup web01_backup]# rm -rf /web_backup/*

# 備份數據時不要備份以1.c 2.c 5.c
[root@web01 web01_backup]# [root@web01 web01_backup]# rsync -avz /backup/web01_backup --exclude=1.c --exclude=2.c --exclude=5.c rsync_backup@172.16.1.41::web_backup --password-file=/etc/rsync.password

# Rsync服務端查看備份狀況,沒有備份排除掉的1.c  2.c  5.c
[root@backup web_backup]# tree web01_backup/
web01_backup/
├── 3.c
├── 4.c
├── a.txt
├── b.txt
├── c.txt
└── install.txt
0 directories, 6 files

# 使用--exclude參數排除文件時,每指定一個排除文件都要使用一個--exclude=xxx file,這樣使得命令過長,很容易出錯,若是要排除的文件多了,會帶來很大的不便

### 使用--exclude-from參數只須要編寫一個排除文件,把要排除的文件名寫入其中,就能夠達到備份時排除多個文件的目的

# 1.客戶端準備數據
[root@web01 backup]# tree web01_backup/
web01_backup/
├── 1.c
├── 2.c
├── 3.c
├── 4.c
├── 5.c
├── a.txt
├── b.txt
├── c.txt
├── exclude.txt
├── hello
├── install.txt
└── test
    ├── 11.php
    ├── 12.php
    ├── 13.php
    ├── 14.php
    └── 15.php
# 2. 編寫排除文件,注意後面不要有空格,備份的時候會把排除文件也備份,須要把排除文件名也加上
[root@web01 web01_backup]# cat /backup/web01_backup/exclude.txt 
1.c
5.c
c.txt
test/14.php
hello/
exclude.txt

# 3. 開始備份
[root@web01 web01_backup]# rsync -avz /backup/web01_backup --exclude-from=exclude.txt rsync_backup@172.16.1.41::web_backup --password-file=/etc/rsync.password

#4. 檢查Rsync服務端數據
[root@backup web_backup]# tree web01_backup/
web01_backup/
├── 2.c
├── 3.c
├── 4.c
├── a.txt
├── b.txt
├── install.txt
└── test
    ├── 11.php
    ├── 12.php
    ├── 13.php
    └── 15.php

7.5 Rsync建立備份目錄

[root@web01 backup]# rsync -avz /backup/web01_backup rsync_backup@172.16.1.41::web_backup/172.16.1.7/ --password-file=/etc/rsync.password

# 備份數據時會自動在Rsync服務端備份目錄下自動建立172.16.1.7目錄,不能建立多級目錄
[root@backup web_backup]# ls
172.16.1.7  web01_backup

7.6 Rsync訪問控制

主要是/etc/rsyncd.conf配置文件中的兩個參數

hosts allow = 172.16.1.0/24 容許備份的IP
hosts deny = 0.0.0.0/32 拒絕備份數據的IP

7.7 Rsync 的 Limit 限速

企業案例: 某 DBA 使用 rsync 拉取備份數據時,因爲文件過大致使內部交換機帶寬被沾滿,致使用戶的請求沒法響應
rsync -avz --bwlimit=100 rsync_backup@172.16.1.41::backup /web_backup

8、全網備份項目

備份環境:備份服務器backup、 3臺web服務器web01 web02 web03

客戶端需求:

一、天天凌晨2點服務器本地打包備份

  • 系統配置文件/etc/fstab/etc/passwd/etc/rc.local/etc/sysconfig/iptables
  • 平常腳本目錄/server/scripts
  • web服務器站點目錄/html/www
  • 日誌文件/var/log/messages/var/log/secure、web訪問日誌目錄/var/log/nginx

二、 打包備份的文件必須保存在/backup目錄下,以主機名+IP地址+備份日期命令的目錄中,如:web01_172.16.1.7_2020-6-28

三、 本地只保留打包後的最近7天數據,避免磁盤資源浪費

備份服務端需求:

一、 備份目錄必須爲/backup

二、 須要天天校驗客戶端推送過來的數據是否完整

三、 將天天校驗的結果以163郵件發送給管理員,便於及時發現問題

四、 服務端只保留一年的數據,其餘的所有刪除

客戶端配置

hostname: 主機名稱

hostname -i : IP地址

date +%F : 日期

一、 編寫客戶端腳本

[root@web01 scripts]# cat /server/scripts/01-rsync_push.sh 
#!/bin/sh
# author: Zachariah
# desc: Push local data to Rsync_server

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
backup_dir=/backup/$(hostname)_$(hostname -i)_$(date +%F)
passwd_file=/etc/rsync.password

# 1. 建立本地備份目錄
mkdir -p ${backup_dir}

# 2. 壓縮數據
cd /
if [ $?==0 ];then
tar -chf ${backup_dir}/system_file.tar.gz \
  etc/fstab etc/passwd etc/rc.local etc/sysconfig/iptables
fi

if [ $?==0 ];then
tar -chf ${backup_dir}/log.tar.gz \
  var/log/messages var/log/secure var/log/nginx
fi 

if [ $?==0 ];then
tar -chf ${backup_dir}/scripts.tar.gz \
  server/scripts
fi 

if [ $?==0 ];then
tar -chf ${backup_dir}/site_dir.tar.gz  \
  html/www
fi 

# 3. 生成md5驗證文件
if [ $?==0 ];then
md5sum ${backup_dir}/*.tar.gz > ${backup_dir}/md5.txt
fi 

# 4. 推送本地備份好的數據到備份服務器
rsync -az  ${backup_dir} rsync_backup@172.16.1.41::web_backup \
  --password-file=${passwd_file}

# 5. 刪除7天之前的壓縮文件
if [ $?==0 ];then
find ${backup_dir}/ -mtime +7 |xargs rm -rf
fi

二、 編寫定時任務,天天2:00自動打包上傳

[root@web01 scripts]# crontab -e
# push local achive date to rsync_server
00 02 * * * /bin/sh /server/scripts/01-rsync_push.sh > /dev/null 2>&1

服務端需求

1.服務端部署 rsync,用於接收客戶端推送過來的備份數據,備份目錄/web_backup
2.服務端須要天天校驗客戶端推送過來的數據是否完整
3.服務端須要天天校驗的結果通知給管理員
4.服務端僅保留 6 個月的備份數據,其他的所有刪除

服務端操做

1.編寫郵件配置

[root@backup scripts]# yum -y install postfix
[root@backup scripts]# cat /etc/mail.rc
set from=zachariah9426@163.com
set smtp=smtp.163.com
set smtp-auth-user=zachariah9426@163.com                               
set smtp-auth-password=xxxxxx
set smtp-auth=login

重啓郵件服務: systemctl restart postfix.service

2.編寫服務端腳本

#!/bin/sh
# check rsync data by client backup

path=/backup
mail_addr=zachariah9426@163.com

# 1. creat rsync check file
find ${path}/*_$(date +%F)/ -type f -name "md5.txt" |xargs \
  md5sum -c > ${path}/$(date +%F)_checkResult.txt

# 2. send mail to admin
if [ $?==0 ];then
  mail -s "$(date +%F)_RsyncCheckResult" ${mail_addr} < \
    ${path}/$(date +%F)_checkResult.txt
fi

# find data from 6 months ago and delete it
# find data from 7 day ago and delete it
find ${path}/ -type f -mtime +7 |xargs rm -rf
find ${path}/ -type d -mtime +180 |xargs rm -rf
相關文章
相關標籤/搜索