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:
拉(下載下傳)
rsync ---指令
[OPTION...] ---選項
[USER@] ---遠端主機使用者(系統使用者)
HOST: ---遠端主機位址
SRC... ---遠端主機資料
[DEST] ---将遠端主機資料備份至本地什麼位置
推(上傳)
SRC... ---本地檔案或目錄
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:
[USER@] ---遠端主機使用者(虛拟使用者)
HOST:: ---遠端主機位址
SRC... ---遠端主機子產品(不是目錄)
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,主機資訊見下表:
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
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
hosts allow = 172.16.56.0/24
hosts deny = 0.0.0.0/32
EOF
cat >> /etc/rsync.password <<EOF
rsync_backup:xuliangwei
chmod 600 /etc/rsync.password
####rsync server start###
rsync --daemon
echo "rsync --daemon" /etc/rc.local
//用戶端
xuliangwei
//在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腳本
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 smtp=smtps://smtp.qq.com:465
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:備份政策