rsync是一款開源的備份工具,能夠在不一樣主機之間進行同步,可實現全量備份與增量備份,所以很是適合用於架構集中式備份或異地備份等應用。
rsync官方地址:傳送門http://rsync.samba.org/
rsync監聽端口:873
rsync運行模式:C/S
既然須要備份,那麼咱們應該瞭解備份的方式
徹底備份
增量備份
假設客戶端上有file1 file2 file3文件,服務端上有file1文件,現要將客戶端上的數據備份至服務端
mysql
徹底備份,將客戶端全部的數據內容file1 file2 file3所有備份至服務端 (效率低下, 佔用空間)
nginx
增量備份,將客戶端的file2 file3增量備份至服務端 (提升備份效率,節省空間, 適合異地備份 )web
前面咱們瞭解過備份的方式,下面咱們須要瞭解Rync的數據同步模式
1.推: 全部主機推送本地數據至Rsync備份服務器,會致使數據同步緩慢(適合少許數據備份)
2.拉: rsync備份服務端拉取全部主機上的數據,會致使備份服務器開銷大
3.大量服務器備份場景
4.異地備份實現思路
redis
Rsync使用三種主要的數據傳輸方式
本地方式
遠程方式
守護進程sql
本地拷貝數據命令shell
Local: rsync [OPTION...] SRC... [DEST] #本地拷貝數據示例 [root@backup ~]# rsync -avz /etc/passwd /tmp/ rsync #備份命令(cp) [options] #選項 SRC... #本地源文件 [DEST] #本地目標文件
#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.使用普通用戶(會致使權限不足狀況)
#pull拉取數據命令 Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] #1.拉取rsync備份服務的"backup模塊"數據至本地/mnt目錄 [root@nfs01 ~]# rsync -avz rsync_backup@192.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@192.172.16.1.41::backup/ --password-file=/etc/rsync.password rsync #命令 [OPTION...] #選項 SRC... #遠程主機模塊(不是目錄) [USER@] #遠程主機用戶(虛擬用戶) HOST:: #遠程主機地址 [DEST] #將遠程主機模塊備份至本地什麼位置
-a #歸檔模式傳輸, 等於-tropgDl -v #詳細模式輸出, 打印速率, 文件數量等 -z #傳輸時進行壓縮以提升效率 -r #遞歸傳輸目錄及子目錄,即目錄下得全部目錄都一樣傳輸。 -t #保持文件時間信息 -o #保持文件屬主信息 -p #保持文件權限 -g #保持文件屬組信息 -l #保留軟鏈接 -P #顯示同步的過程及傳輸時的進度等信息 -D #保持設備文件信息 -L #保留軟鏈接指向的目標文件 -e #使用的信道協議,指定替代rsh的shell程序 --exclude=PATTERN #指定排除不須要傳輸的文件模式 --exclude-from=file #文件名在file文件中的 --bwlimit=100 #限速傳輸 --partial #斷點續傳 --delete #讓目標目錄和源目錄數據保持一致
=============================================vim
主機角色 | 主機名稱 | 外網IP(NAT) | 內網IP(LAN) |
---|---|---|---|
Rsync服務端 | backup | 10.0.0.41 | 172.16.1.41 |
Rsync客戶端 | nfs | 10.0.0.31 | 172.16.1.31 |
1.安裝rsync [root@backup ~]# yum -y install rsync 2.配置/etc/rsyncd.conf [root@backup ~]# cat /etc/rsyncd.conf uid = www gid = www 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 --- 配置詳解 [root@backup ~]# vim /etc/rsyncd.conf uid = www # 運行進程的用戶 gid = www # 運行進程的用戶組 port = 873 # 監聽端口 fake super = yes # 無需讓rsync以root身份運行,容許接收文件的完整屬性 use chroot = no # 禁錮推送的數據至某個目錄, 不容許跳出該目錄 max connections = 200 # 最大鏈接數 timeout = 600 # 超時時間 ignore errors # 忽略錯誤信息 read only = false # 對備份數據可讀寫 list = false # 不容許查看模塊信息 auth users = rsync_backup # 定義虛擬用戶,做爲鏈接認證用戶 secrets file = /etc/rsync.passwd # 定義rsync服務用戶鏈接認證密碼文件路徑 [backup] # 定義模塊信息 comment = commit # 模塊註釋信息 path = /backup # 定義接收備份數據目錄 3.建立用戶(運行www服務的用戶身份) #1) 建立www帳戶 [root@backup ~]# groupadd -g666 www [root@backup ~]# useradd -u666 -g666 www #2) 建立備份目錄(儘量磁盤空間足夠大),受權www用戶爲屬主 [root@backup ~]# mkdir /backup [root@backup ~]# chown -R www.www /backup/ 4.建立虛擬用戶密碼文件, 受權600安全權限(用於客戶端鏈接時使用的用戶) [root@backup ~]# echo "rsync_backup:xly" >/etc/rsync.passwd [root@backup ~]# chmod 600 /etc/rsync.passwd 使用rsync須要使用參數--password-file=/etc/rsync.passwd 5.啓動rsync服務,並將rsync加入開機自啓動 [root@backup ~]# systemctl start rsyncd [root@backup ~]# systemctl enable rsyncd 6.檢查rsync 873端口是否已處於監聽狀態 [root@backup ~]# 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 7.Rsync客戶端僅需配置虛擬用戶的密碼,並受權爲600安全權限 # 方式一:適合終端執行指定用戶密碼文件 [root@nfs01 ~]# yum install rsync -y [root@nfs01 ~]# echo "xly" > /etc/rsync.pass [root@nfs01 ~]# chmod 600 /etc/rsync.pass # 方式二:腳本中使用,強烈推薦方式 [root@nfs01 ~]# export RSYNC_PASSWORD=xly
實戰一: 客戶端推送backup目錄下全部內容至Rsync服務端安全
[root@nfs01 ~]# export RSYNC_PASSWORD=bgx [root@nfs01 ~]# rsync -avz /backup/ rsync_backup@172.16.1.41::backup/
實戰二: 客戶端拉取Rsync服務端 backup模塊數據至本地客戶端的 /backup目錄bash
[root@nfs01 ~]# export RSYNC_PASSWORD=bgx [root@nfs01 ~]#rsync -avz rsync_backup@172.16.1.41::backup /backup/
實戰三: Rsync實現數據無差別同步服務器
#拉取遠端數據:遠端與本地保持一致,遠端沒有本地有會被刪除, 形成客戶端數據丟失 [root@nfs01 ~]# export RSYNC_PASSWORD=bgx [root@nfs01 ~]# rsync -avz --delete rsync_backup@172.16.1.41::backup/ /data/ #推送數據至遠端:本地與遠端保持一致, 本地沒有遠端會被刪除, 形成服務器端數據丟失 [root@nfs01 ~]# export RSYNC_PASSWORD=bgx [root@nfs01 ~]# rsync -avz --delete /data/ rsync_backup@172.16.1.41::backup/
實戰四: Rsync的Limit限速
#企業案例: 某DBA使用rsync拉取備份數據時,因爲文件過大致使內部交換機帶寬被沾滿,致使用戶的請求沒法響應 [root@nfs01 ~]# export RSYNC_PASSWORD=bgx [root@nfs01 ~]# rsync -avz --bwlimit=1 rsync_backup@172.16.1.41::backup/ /data/
=============================================
已知3臺服務器主機名分別爲web0一、backup 、nfs主機信息見下表:
主機角色 | 主機名稱 | 外網IP(NAT) | 內網IP(LAN) |
---|---|---|---|
Rsync服務端 | backup | 10.0.0.41 | 172.16.1.41 |
Rsync客戶端 | nfs | 10.0.0.31 | 172.16.1.31 |
WEB客戶端 | web01 | 10.0.0.7 | 1:172.16.1.7 |
需求:
客戶端需求 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.nfs客戶端備份實現思路,腳本天天凌晨01點定時執行一次(打包->標記->推送->保留最近7天的文件) [root@nfs scripts]# cat /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_$Date ] || md5sum $Path/$Dest/*.tar.gz >$Path/$Dest/flag_$Date #5.推送本地數據至備份服務器 export RSYNC_PASSWORD=bgx rsync -avz $Path/ rsync_backup@172.16.1.41::backup #6.本地保留最近7天的數據 find $Path/ -type d -mtime +7|xargs rm -rf
2.客戶端編寫定時任務,讓備份天天凌晨1點執行
[root@nfs01 ~]# crontab -l 00 01 * * * /bin/bash /server/scripts/backup_rsync.sh &>/dev/null
3.backup服務端校驗客戶端推送數據的完整性, (校驗->存儲校驗結果->將保存的結果經過郵件發送給管理員->保留最近180天的數據)
#1.服務端配置郵件功能 [root@backup /]# yum install mailx -y [root@backup /]# vim /etc/mail.rc set from=552408925@qq.com set smtp=smtps://smtp.qq.com:465 set smtp-auth-user=552408925@qq.com set smtp-auth-password=#客戶端受權碼 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.將校驗的結果發送郵件給管理員 mail -s "Rsync Backup $Date" 123@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 4.服務端編寫定時任務腳本 [root@backup backup]# crontab -l 00 05 * * * /bin/bash /server/scripts/check_backup.sh &>/dev/null 5.如何擴展多臺服務器的備份? [root@nfs ~]# rsync -avz /server 172.16.1.7:/
6.全網備份圖解流程