rsync是一款開源、快速、多功能、可實現全量及增量的本地或遠程數據同步備份的優秀工具。rsync軟件適用於Unix/linux/Windows等多種操做系統平臺。linux
rsync英文稱爲remote synchronizetion,從軟件的名稱就能夠看出來,rsync具備可以使本地和遠程兩臺主機之間的數據快速複製同步鏡像、遠程備份的功能,這個功能相似於**ssh帶的scp命令,可是又優於scp命令的功能**,**scp每次都是全量拷貝,而rsync能夠增量拷貝**。固然,rsync還能夠在本地主機的不一樣分區或目錄之間全量及曾量的複製數據,這又相似cp命令。可是一樣也優於cp命令,cp每次都是全量拷貝,而rsync能夠增量拷貝。 在同步數據的時候,默認狀況下,rsync經過其獨特的「quick check」算法,它僅同步大小或者最後修改時間發生變化的文件或目錄,固然也可根據權限、屬主等屬性的變化同步,可是須要制定相應的參數,甚至能夠實現只同步一個文件裏有變化的內容部分,因此,但是實現快速的同步備份數據。
rsync監聽端口:873web
rsync運行模式:C/S算法
client/servershell
客戶端/服務端vim
小提示:利用rsync還能夠實現刪除文件和目錄的功能,這又至關於rm命令,一個rsync至關於scp、cp、rm,可是還優於他們的每個命令。windows
支持拷貝特殊文件,如鏈接文件、設備等。 能夠有排除指定文件或目錄同步的功能,至關於打包命令tar的排除功能。 能夠作到保持原文件或目錄的權限、時間、軟硬連接、屬主、組等全部屬性均不改變 –p。 能夠實現增量同步,既只同步發生變化的數據,所以數據傳輸效率很高(tar-N)。 可使用rcp、rsh、ssh等方式來配合傳輸文件(rsync自己不對數據加密)。 能夠經過socket(進程方式)傳輸文件和數據(服務端和客戶端)。 支持匿名的活認證(無需系統用戶)的進程模式傳輸,能夠實現方便安全的進行數據備份和鏡像。
1.藉助cron+rsync把全部客戶服務器數據同步到備份服務器。 2.針對公司重要數據備份混亂情況和領導提出備份全網數據的解決方案。 3.經過本地打包備份,而後rsync結合`inotify`應用把全網數統一備份到一個固定存儲服務器,而後在存儲服務器上經過腳本檢查並報警管理員備份結果。 4.按期將IDC機房的數據 備份公司的內部服務器,防止機房地震及火災問題致使數據丟失。 5.實時同步,解決存儲服務器等的單點問題。
全備安全
將數據所有備份下來:全量備份,將客戶端全部的數據內容所有備份至服務端 (效率低下, 佔用空間)bash
增備服務器
全備以後新增的數據,備份下來:增量備份,將客戶端的增量備份至服務端 (提升備份效率,節省空間, 適合異地備份 )架構
本地方式
遠程方式
守護進程
單個主機本地之間的數據傳輸(此時相似於cp
命令)
#本地拷貝數據命令 Local: rsync [OPTION...] SRC... [DEST] #本地拷貝數據示例 [root@backup ~]# rsync -avz /etc/passwd /tmp/ rsync #備份命令(cp) [options] #選項 SRC... #本地源文件 [DEST] #本地目標文件 [root@web01 ~]# rsync /etc/b.txt /tmp/
經過ssh
通道傳輸數據,相似scp
命令`
#pull拉取數據命令 Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] #push推送數據命令 Push: rsync [OPTION...] SRC... [USER@]HOST: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推送數據示例 rsync -avz /backup/2018-10-01 root@172.16.1.41:/tmp/ Push #推送, 上傳 rsync #備份命令 [options] #選項 SRC... #本地源文件 [USER@] #目標主機的系統用戶 HOST #目主機IP地址或域名 [DEST] #目標對應位置
pull拉: [root@web01 ~]# rsync -avz root@172.16.1.41:/tmp ./
push推: [root@web01 ~]# rsync -avz /var root@172.16.1.41:/tmp/
注意: rsync不論是推仍是拉,推送目錄的時候帶/和不帶/
1.帶/ :/etc/ 將etc目錄下的全部內容,推過去(拉過來)
2.不帶/:/etc 將etc目錄總體推過去(拉過來)
Rsync
藉助SSH
協議同步數據存在的缺陷
1.使用系統用戶(不安全)
2.使用普通用戶(會致使權限不足狀況)
rsync
自身很是重要的功能(不使用系統用戶,更加安全)
#pull拉取數據命令 Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] #push推送數據命令 Push: rsync [OPTION...] SRC... [USER@]HOST::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] #將遠程主機數據備份至本地什麼位置 #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] #將遠程主機模塊備份至本地什麼位置 rsync -avz /data/ rsync_backup@172.16.1.41::zls
-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 #讓目標目錄和源目錄數據保持一致 --password-file=xxx #使用密碼文件
rsync -avz --delete rsync_backup@172.16.1.41::cm
rsync -avz --bwlimit=1024 /etc rsync_backup@172.16.1.41::cm
主機名 | 外網IP | 內網IP | 角色 |
---|---|---|---|
backup | 10.0.0.41 | 172.16.1.41 | 服務端 |
web01 | 10.0.0.7 | 172.16.1.7 | 客戶端 |
nfs01 | 10.0.0.31 | 172.16.1.31 | 客戶端 |
[root@backup ~]# yum -y install rsync
[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 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 = rsync #運行進程的用戶名 gid = rsync #運行進程的用戶組 port = 873 #監聽端口 fake super = yes #無需讓rsync以root身份運行 use chroot = no #禁錮推送的數據至某個目錄,不容許跳出該目錄 max connections = 200 #最大鏈接數200 timeout = 600 #超時時間600s 10分鐘 ignore errors #忽略錯誤信息 read only = false #關閉只讀 list = false #不容許查看模塊信息 auth users = rsync_backup #定義虛擬用戶,做爲鏈接認證用戶 secrets file = /etc/rsync.passwd #認證用戶的密碼文件 log file = /var/log/rsyncd.log #日誌文件路徑 ##################################### [cm] #模塊(任意名字均可以) comment = welcome to oldboyedu backup! #註釋信息(可有可無) path = /backup #定義接受備份數據路徑
建立一個用來運行rsync服務的用戶身份
#檢查用戶是否存在 [root@backup ~]# id rsync id: rsync: no such user #建立用戶(不容許登陸,不建立家目錄) [root@backup ~]# useradd rsync -s /sbin/nologin -M -s:指定登陸的shell -M:不建立家目錄
[root@backup ~]# mkdir /backup #受權rsync用戶 [root@backup ~]# chown -R rsync.rsync /backup/
建立虛擬用戶密碼文件, 受權600安全權限(用於客戶端鏈接時使用的用戶)
#建立用戶名和密碼文件 [root@backup ~]# vim /etc/rsync.passwd rsync_backup:123456 #受權 [root@backup ~]# chmod 600 /etc/rsync.passwd
[root@backup ~]# ll /usr/lib/systemd/system/rsyncd.service -rw-r--r-- 1 root root 237 Apr 26 01:17 /usr/lib/systemd/system/rsyncd.service #啓動rsyncd守護進程 [root@backup ~]# systemctl start rsyncd #容許開機自啓 [root@backup ~]# systemctl enable rsyncd
[root@backup ~]# netstat -lntup 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
[root@web01 ~]# yum install -y rsync
Rsync
客戶端僅需配置虛擬用戶的密碼,並受權爲600安全權限
#建立用戶密碼文件 [root@web01 ~]# vim /etc/rsync.pass 123456 或 echo 123456 >/etc/rsync.pass #受權 [root@web01 ~]# chmod 600 /etc/rsync.pass #免交互方式一: rsync -avz --password-file=/etc/rsync.pass #免交互方式二(腳本使用,推薦): export RSYNC_PASSWORD=cm
[root@web01 ~]# mkdir /data [root@web01 ~]# cd /data [root@web01 data]# touch file{1..100} [root@web01 data]# ll
推:客戶端推送data目錄下全部內容至Rsync
服務端
#交互式,須要輸入密碼 [root@web01 ~]# rsync -avz /data/ rsync_backup@172.16.1.41::cm #非交互式 [root@web01 ~]# rsync -avz /data/ rsync_backup@172.16.1.41::cm --password-file=/etc/rsync.pass #查看 [root@backup ~]# ll /backup total 0 -rw-r--r-- 1 rsync rsync 0 Aug 1 20:07 file1 -rw-r--r-- 1 rsync rsync 0 Aug 1 20:07 file2 -rw-r--r-- 1 rsync rsync 0 Aug 1 20:07 file3 -rw-r--r-- 1 rsync rsync 0 Aug 1 20:07 file4 -rw-r--r-- 1 rsync rsync 0 Aug 1 20:07 file5
拉:客戶端拉取Rsync
服務端 backup模塊數據至本地客戶端的 /root目錄
#交互式,須要輸入密碼 [root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::cm /root/ #非交互式 [root@web01 ~]# rsync -avz rsync_backup@172.16.1.41::cm /root/ --password-file=/etc/rsync.pass #查看 [root@web01 ~]# ll -rw-r--r-- 1 root root 0 Aug 1 20:07 file1 -rw-r--r-- 1 root root 0 Aug 1 20:07 file2 -rw-r--r-- 1 root root 0 Aug 1 20:07 file3 -rw-r--r-- 1 root root 0 Aug 1 20:07 file4 -rw-r--r-- 1 root root 0 Aug 1 20:07 file5
報錯:
1.客戶端密碼文件:600權限
2.服務端密碼文件:600權限
3.客戶端密碼文件中,只寫密碼,不寫用戶
4.服務端密碼文件中,用戶:密碼
5.服務端的/backup目錄權限不是 rsync
chown -R rsync.rsync /backup
認證失敗:
1.先檢查配置文件:服務端:/etc/rsyncd.conf
[模塊]
2.檢查服務端,/etc/rsync.passwd文件的權限是否是600
3.再檢查服務端,/etc/rsync.passwd文件的內容,是否是 用戶名:密碼
rsyncd.conf 裏的 rsync_backup
4.再檢查客戶端,/etc/rsync.pass 權限600
5./etc/rsync.pass 內容只寫密碼
6.修改完配置文件要重啓服務,[backup] [cm]
systemctl restart rsyncd
1.客戶端提早準備存放的備份的目錄,目錄規則以下:/backup/nfs_172.16.1.31_2018-09-02
#安裝ntpdate yum install -y ntpdate #實現第一部份內容,將備份的數據目錄建立出來 [root@web01 ~]# vim rsync.sh #!/bin/bash H=`hostname` IP=`ifconfig eth1|awk 'NR==2{print $2}'` DATE=`date +%F` SRC=${H}_${IP}_${DATE} mkdir -p /backup/$SRC #建立備份目錄 #執行腳本 [root@web01 ~]# sh rsync.sh #查看備份數據 [root@web01 ~]# ll /backup/ total 0 drwxr-xr-x 2 root root 6 Aug 2 19:00 web01_172.16.1.7_2019-08-02
2.客戶端在本地打包備份(系統配置文件、應用配置等)拷貝至/backup/nfs_172.16.1.31_2018-09-02
[root@web01 ~]# vim rsync.sh #!/bin/bash H=`hostname` IP=`ifconfig eth1|awk 'NR==2{print $2}'` DATE=`date +%F` SRC=${H}_${IP}_${DATE} mkdir -p /backup/$SRC tar zcf /backup/${SRC}/conf_${DATE}.tar.gz /var/log/messages /etc/passwd /etc/gshadow /etc/shadow /etc/group &>/dev/null #打包備份至/backup/nfs_172.16.1.31_2018-09-02/下
3.客戶端最後將備份的數據進行推送至備份服務器
[root@web01 ~]# vim rsync.sh #!/bin/bash H=`hostname` IP=`ifconfig eth1|awk 'NR==2{print $2}'` DATE=`date +%F` SRC=${H}_${IP}_${DATE} export RSYNC_PASSWORD=123456 #設置免交互密碼 mkdir -p /backup/$SRC tar zcf /backup/${SRC}/conf_${DATE}.tar.gz /var/log/messages /etc/passwd /etc/gshadow /etc/shadow /etc/group &>/dev/null rsync -az /backup/ rsync_backup@172.16.1.41::cm #將備份數據推送至備份服務器
測試命令:
[root@web01 ~]# for n in `seq -w 30`;do date -s "201908$n";sh rsync.sh;done
4.客戶端服務器本地保留最近7天的數據, 避免浪費磁盤空間
[root@web01 ~]# vim rsync.sh #!/bin/bash H=`hostname` IP=`ifconfig eth1|awk 'NR==2{print $2}'` DATE=`date +%F` SRC=${H}_${IP}_${DATE} export RSYNC_PASSWORD=123456 mkdir -p /backup/$SRC tar zcf /backup/${SRC}/conf_${DATE}.tar.gz /var/log/messages /etc/passwd /etc/gshadow /etc/shadow /etc/group &>/dev/null md5sum /backup/${SRC}/conf_${DATE}.tar.gz > /backup/res7.txt #校驗打包結果放入/backup目錄下 rsync -az /backup/ rsync_backup@172.16.1.41::cm find /backup/ -type d -mtime +7 |xargs rm -fr #保留最近7天的數據
#定義變量 [root@web01 ~]# H=`hostname` [root@web01 ~]# IP=`ifconfig eth1 |awk 'NR==2{print $2}'` [root@web01 ~]# DATE=`date +%F` [root@web01 ~]# SRC=${H}_${IP}_${DATE} #校驗打包是否成功 [root@web01 ~]# md5sum /backup/${SRC}/conf_${DATE}.tar.gz 1c7529d288ee10f18e59d8ad93e770f7 /backup/web01_172.16.1.7_2019-08-04/conf_2019-08-04.tar.gz #將校驗結果放入/backup目錄下 [root@web01 ~]# md5sum /backup/${SRC}/conf_${DATE}.tar.gz > /backup/res.txt
5.客戶端天天凌晨1點定時執行該腳本
[root@web01 ~]# crontab -e #天天凌晨一點備份重要數據 By:cm At:2019-08-02 00 01 * * * /bin/sh /root/rsync.sh &>/dev/null #如何修改時間 [root@backup ~]# date Sat Aug 3 00:04:57 CST 2019 [root@backup ~]# date -s '20190804' Sun Aug 4 00:00:00 CST 2019 #如何同步時間 [root@backup ~]# ntpdate time.windows.com &>/dev/null
1.服務端部署rsync,用於接收客戶端推送過來的備份數據
#安裝mailx,ntpdate yum install -y mailx yum install -y ntpdate #配置mail.rc vim /etc/mail.rc Shift + g(在文件末尾添加便可) set from=531759321@qq.com set smtp=smtps://smtp.qq.com:465 set smtp-auth-user=531759321@qq.com set smtp-auth-password=受權碼 set smtp-auth=login set ssl-verify=ignore set nss-config-dir=/etc/pki/nssdb/
2.服務端須要天天校驗客戶端推送過來的數據是否完整
3.服務端須要天天校驗的結果通知給管理員
4.服務端僅保留6個月的備份數據,其他的所有刪除
#配置文件 vim check_backup.sh #!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin DATE=`date +%F` md5sum -c /backup/res*.txt|mail -s "${DATE} check backup" 531759321@qq.com #檢驗數據併發送給管理員 find /backup -type d -mtime +180|xargs rm -fr #保留6個月的備份數據
[root@web01 ~]# crontab -e #天天凌晨一點零一分校驗結果 By:cm At:2019-08-02 01 01 * * * /bin/sh /root/check_backup.sh &>/dev/null