Rsync基本概述

Rsync基本概述
rsync是一款開源的備份工具,可以在不同主機之間進行同步,可實現全量備份與增量備份,保持鏈接和權限,且採用優化的同步算法,傳輸前執行壓縮,因此非常適合用於架構集中式備份或異地備份等應用。
rsync官方地址:傳送門
rsync監聽端口:873
rsync運行模式:C/S

常見的備份有如下幾種方式

完全備份
增量備份
差異備份

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

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

增量備份,將客戶端的file2 file3增量備份至服務端 (提高備份效率,節省空間, 適合異地備份 )
2.Rsync應用場景
關於數據同步的兩種方式
推:一臺主機負責把數據推送至其他主機,服務器開銷大。(適合推送少量主機)
拉:所有主機定時去找一主機拉數據。可能會導致數據同步緩慢。

3.Rsync傳輸模式
Rsync大致使用三種主要的數據傳輸方式

本地方式
遠程方式
守護進程

//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
Rsync命令對應選項

-a //歸檔模式傳輸, 等於-tropgDl
-v //詳細模式輸出, 打印速率, 文件數量等
-z //傳輸時進行壓縮以提高效率
-r //遞歸傳輸目錄及子目錄,即目錄下得所有目錄都同樣傳輸。
-t //保持文件時間信息
-o //保持文件屬主信息
-p //保持文件權限
-g //保持文件屬組信息
-l //保留軟連接
-P //顯示同步的過程及傳輸時的進度等信息
-D //保持設備文件信息
-L //保留軟連接指向的目標文件
-e //使用的信道協議,指定替代rsh的shell程序
--exclude=PATTERN //指定排除不需要傳輸的文件模式
--exclude-from=file //文件名所在的目錄文件
--bwlimit=100 //限速傳輸
--partial //斷點續傳
--delete //讓目標目錄和源目錄數據保持一致
1.本地傳輸方式: 單個主機本地之間的數據傳輸(此時類似於cp命令)

Local: rsync [OPTION...] SRC... [DEST]
rsync ---數據備份命令
[OPTION...] ---命令相關參數
SRC... ---要進行本地備份的數據信息
[DEST] ---把數據備份到本地什麼位置

//同步hosts文件置tmp目錄相當於cp命令
[root@nfs01 ~]# rsync -avz /etc/hosts /tmp/

2.遠程通道傳輸方式: 通過ssh通道傳輸數據,類似scp命令

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

拉(下載)
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
rsync ---命令
[OPTION...] ---選項
[USER@] ---遠程主機用戶(系統用戶)
HOST: ---遠程主機地址
SRC... ---遠程主機數據
[DEST] ---將遠程主機數據備份至本地什麼位置

推(上傳)
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
rsync ---命令
[OPTION...] ---選項
SRC... ---本地文件或目錄
[USER@] ---遠程主機用戶(系統用戶)
HOST: ---遠程主機地址
[DEST] ---本地數據備份至遠端什麼目錄

//push: 推送本地數據至backup服務器(上傳)
[root@nfs01 ~]# rsync -avz /etc/hosts [email protected]:/etc/hosts

//pull 拉取backup服務器數據至本地(下載)
[root@nfs01 ~]# rsync -avz [email protected]:/etc/hosts /etc/hosts
3.守護進程傳輸方式: rsync自身非常重要的功能(不使用系統用戶,更加安全)

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

Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync ---命令
[OPTION...] ---選項
[USER@] ---遠程主機用戶(虛擬用戶)
HOST:: ---遠程主機地址
SRC... ---遠程主機模塊(不是目錄)
[DEST] ---將遠程主機數據備份至本地什麼位置

Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync ---命令
[OPTION...] ---選項
SRC... ---遠程主機模塊(不是目錄)
[USER@] ---遠程主機用戶(虛擬用戶)
HOST:: ---遠程主機地址
[DEST] ---將遠程主機模塊備份至本地什麼位置

//將本地數據推送至backup服務器
rsync -avz /mnt/ [email protected]::backup/ --password-file=/etc/rsync.password

//將backup服務器數據拉至本地服務器
rsync -avz [email protected]::backup/ /mnt/ --password-file=/etc/rsync.password
4.Rsync服務實踐
角色 外網IP(NAT) 內網IP(LAN) 主機名
Rsync服務端 eth0:10.0.0.41 eth1:172.16.1.41 backup
Rsync客戶端 eth0:10.0.0.31 eth1:172.16.1.31 nfs
1.第一個里程碑,安裝rsync軟件

[root@backup ~]# yum -y install rsync
//檢查是否安裝成功
[root@backup ~]# rpm -qa rsync
rsync-3.1.2-4.el7.x86_64
2.第二個里程碑,配置/etc/rsyncd.conf

[root@backup ~]# cat /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
#hosts allow = 172.16.1.0/24
#hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
log file = /var/log/rsyncd.log
#####################################
[backup]
comment = welcome to oldboyedu backup!
path = /backup

[root@backup ~]# vim /etc/rsyncd.conf

全局模塊

uid = rsync # 運行進程的用戶
gid = rsync # 運行進程的用戶組
port = 873 # 監聽端口
use chroot = no # 關閉假根功能
max connections = 200 # 最大連接數
timeout = 600 # 超時時間
ignore errors # 忽略錯誤信息
read only = false # 對備份數據可讀寫
list = false # 不允許查看模塊信息
hosts allow = 172.16.56.0/24 # 允許某個IP或網段訪問
hosts deny = 0.0.0.0/32 # 拒絕某個網段或IP訪問
auth users = rsync_backup # 定義虛擬用戶,作爲連接認證用戶
secrets file = /etc/rsync.password # 定義rsync服務用戶連接認證密碼文件路徑

##局部模塊
[backup] # 定義模塊信息
comment = commit # 模塊註釋信息
path = /backup # 定義接收備份數據目錄
3.第三個里程碑,建立虛擬用戶並授權對應目錄

//創建rsync賬戶,不允許登錄不創建家目錄
[root@backup ~]# useradd -M -s /sbin/nologin rsync

//創建備份目錄(儘可能磁盤空間足夠大),授權rsync用戶爲屬主
[root@backup ~]# mkdir /backup
[root@backup ~]# chown -R rsync.rsync /backup/
4.第四個里程碑,創建虛擬用戶密碼文件

//創建虛擬用戶和密碼,並賦予600權限
[root@backup ~]# echo "rsync_backup:xuliangwei" >/etc/rsync.password
[root@backup ~]# chmod 600 /etc/rsync.password
5.第五個里程碑,啓動rsync服務,並加入開機自啓

[root@backup ~]# systemctl start rsyncd
[root@backup ~]# systemctl enable rsyncd

啓動後檢查對應端口
[root@bogon ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 4758/rsync
6.Rsync客戶端配置, 配置密碼並設置權限

方式一:適合終端執行指定用戶密碼文件
[root@nfs01 ~]# yum install rsync -y
[root@nfs01 ~]# echo "xuliangwei" > /etc/rsync.password
[root@nfs01 ~]# chmod 600 /etc/rsync.password

方式二:適合寫腳本,強烈推薦方式
[root@nfs01 ~]# export RSYNC_PASSWORD=123456
實戰一: 客戶端推送數據至Rsync服務端

[root@nfs01 ~]# rsync -avz /backup/ [email protected]::backup/ --password-file=/etc/rsync.password
實戰二: 客戶端拉取Rsync服務端數據至本地

[root@nfs01 ~]#rsync -avz [email protected]::backup /backup/ --password-file=/etc/rsync.password
實戰三: Rsync實現數據無差異同步

//拉取遠端數據:遠端與本地保持一致,遠端沒有本地有會被刪除, 造成客戶端數據丟失
[root@nfs01 ~]# rsync -avz --delete [email protected]::backup/ /data/ --password-file=/etc/rsync.password

//推送數據至遠端:本地與遠端保持一致, 本地沒有遠端會被刪除, 造成服務器端數據丟失
[root@nfs01 ~]# rsync -avz --delete /data/ [email protected]::backup/ --password-file=/etc/rsync.password
5.Rsync定時備份
//Rsync配合crond定時推送數據

[root@nfs-server scripts]# vim rsync_crond_backup.sh
#!/bin/bash

Client

Client_BackupDIR=/backup-A
Client_Host=$(hostname)
Client_IP=$(/sbin/ifconfig eth1|awk 'NR==2'|awk '{print $2}'|awk -F ':' '{print $2}')
Client_Date=$(date +%F)
Client_Datefile=$(date +%H%M)
Client_Desc_DIR="$Client_BackupDIR"/"$ClientHost""$ClientIP""$Client_Date"

###Server
Server_User=rsync_backup
Server_IP=172.16.56.11
Server_mode=backup/
Server_pass=/etc/rsync.password

###command
mkdir -p $Client_Desc_DIR
/bin/cp /var/spool/cron/root $Client_Desc_DIR/cronroot$Client_Date_file
/bin/cp /etc/fstab $Client_Desc_DIR/etcfstab$Client_Date_file
/bin/cp /etc/rc.d/rc.local $Client_Desc_DIR/etcrc.local$Client_Date_file

##rsync
rsync -avz $Client_BackupDIR/ $Server_User@$Server_IP::$Server_mode/ --password-file=$Server_pass
6.Rsync備份項目案例
已知 3 臺服務器主機名分別爲 web01、backup 、nfs,主機信息見下表:

角色 外網IP(NAT) 內網IP(LAN) 主機名
WEB服務器 eth0:192.168.56.11 eth1:172.16.56.11 web01
NFS存儲服務器 eth0:192.168.56.12 eth1:172.16.56.12 nfs01
Rsync備份服務器 eth0:192.168.56.13 eth1:172.16.56.13 backup
要求:
每天晚上01點整在 Web 服務器上打包備份系統配置文件、日誌文件、其他目錄 並通過rsync命令推送備份服務器backup上備份保留
備份思路:
所有服務器在本地按日期打包, 然後再推到備份服務器backup上

具體要求如下:
1)所有服務器的備份目錄必須都爲/backup。
2)備份的系統配置文件包括但不限於:

//配置文件
/etc/rc.local //開機自啓動配置文件
/etc/fstab //設備掛載配置文件
/etc/hosts //本地內網配置文件

//重要目錄
/var/spool/cron/ //cron定時任務
/etc/firewalld //firewalld防火牆
/soft/scripts //腳本目錄

系統日誌文件
/var/log/ //系統安全日誌、sudo日誌、內核日誌、rsyslog日誌

應用程序日誌
/soft/log/nginx
/soft/log/mysql
/soft/log/php
/soft/log/tomcat
.....

//自己思考下還有什麼需要備份的?
3)Web服務器本地保留最近7天的數據, 避免浪費磁盤空間
4)Rsync備份服務器上,其它要保留6個月的數據副本。
5)客戶端服務器推送數據, 以主機名_IP地址_當前時間作爲目錄, 所有的備份數據存放至該目錄下 nfs-server_192.168.69.112_2018-03-28/
6)確保備份的數據完整,在備份服務器上對備份的數據進行檢查,把備份的成功及失敗結果信息發給系統管理員郵箱中。
7)真實工作中除了服務器之間備份, 可能還會需要異地備份,這個地方請大家思考如何異地備份。

8)評分標準見表:

ID 分數 項目
1 20分 完成服務端 rsync 服務搭建
2 10分 完成客戶端 rsync 命令推送到服務端
3 20分 完成客戶端本地打包及校驗腳本。
4 10分 完成客戶端定時任務配置。
5 15分 完成服務端數據完整性檢查及清理腳本
6 10分 完成服務端定時執行腳本。
7 15分 實現每日郵件發送結果給管理員
1.搭建rsync

##backup create-rsync-server.sh

mkdir -p /soft/scripts
vim /soft/scripts/create-rsync-server.sh
#!/bin/sh
useradd rsync
mkdir –p /backup
chown rsync.rsync /backup

cat >> /etc/rsyncd.conf <<EOF
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
ignore errors
read only = false
list = false
hosts allow = 172.16.56.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password

[backup]
path = /backup
EOF

cat >> /etc/rsync.password <<EOF
rsync_backup:xuliangwei
EOF

chmod 600 /etc/rsync.password
####rsync server start###
rsync --daemon
echo "rsync --daemon" /etc/rc.local

//客戶端
cat >> /etc/rsync.password <<EOF
xuliangwei
EOF
chmod 600 /etc/rsync.password

//在backup上部署rsync, 並且在客戶端上可以推送成功。
2.客戶端上建立備份腳本

IP=$(ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}')
if [ $(date +%w) -eq 0 ]
then
Date="week$(date +%F-%w -d "-1day")
else
Date=$(date +%F -d "-1day")
fi
Path=/backup
/bin/mkdir $Path/$IP -p
cd / &&\
/bin/tar czf $Path/$IP/backup$Date.tar.gz var/spool/cron/root etc/rc.local etc/sysconfig/iptables var/www/html app/logs &&\
md5sum $Path/$IP/backup
$Date.tar.gz > $Path/$IP/flag_$Date &&\
rsync -az /backup/ [email protected]::backup/ --password-file=/etc/rsync.password &&\

#del
find $Path/ -type f -mtime +7 (-name ".log" -o -name ".tar.gz")| xargs rm –f
//3.配置定時任務

Server端backup腳本

IP=$(ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}')
if [ $(date +%w) -eq 0 ]
then
Date="week$(date +%F-%w -d "-1day")
else
Date=$(date +%F -d "-1day")
fi
Path=/backup
/bin/mkdir $Path/$IP -p

LANG=en
find /backup/ -type f -name "${Date}.log"|xargs md5sum -c >>$Path/${Date}_result.log 2>&1 &&\
mail -s "$Date bak result" [email protected] <$Path/${Date}_result.log
find $Path/ -type f -mtime +180 ! -name "_week_6*" | xargs rm -f

//check.sh
find /backup -type f -name "flag_$(date +%F)" |xargs md5sum -c |grep FAILED &> /tmp/mailbody$(date +%F).txt

mail -s "$(date +%U%T) back" [email protected] </tmp/mailbody$(date +%F).txt
配置郵箱

// (在末行加入如下命令)
[root@backup /]# vim /etc/mail.rc
set [email protected]
set smtp=smtps://smtp.qq.com:465
set [email protected]
set smtp-auth-password=
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/

備份思考
1.要備份什麼?

WEB APP部署程序配置文件
MYSQL數據庫部署程序及其配置文件
MySQL數據文件
MySQK的binlog日誌、慢查詢日誌、錯誤日誌
系統的安全日誌、內核的日誌、sudo日誌、rsyslog日誌
應用程序日誌 access.log error.log
靜態數據文件

//備份目錄如何規劃,如果之前備份規劃是這個樣子的?
/usr/local/nginx
/opt/mysql
/etc/php
/etc/my.cnf

//如果服務器規劃是這個樣子
/soft/webapp/nginx
/soft/webapp/apache
/soft/webapp/tomcat
/soft/scripts/crond_nginx.sh
/soft/scripts/crond_rsync.sh
/data/mysql/mysql3306/{data,logs,conf,tmp}
/data/mysql/mysql3307/{data,logs,conf,tmp}
/data/mysql/mysql3308/{data,logs,conf,tmp}
思考2:如何備份?

1.根據時間維護劃分
實時備份(同步備份)
非實時備份(異步備份)

2.根據地域劃分
同IDC備份部署
跨IDC備份部署
本地->雲主機->異地主機
備份3:備份可恢復性?

時間成本
維護成本
備份4:備份策略

備份保留時間? 1個月, 1年或永久?

備份恢復校驗
1個月模擬一次,半年演練一次?
這裏牽扯到備份有效性和備份時效性的一個校驗。

萬一備份服務器掛了怎麼辦?
備份之後是否還有備份

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章