rsync是一款開源、快速、多功能、可實現全量及增量的本地或遠程數據同步備份的優秀工具。rsync軟件適用於MacOS/Unix/linux/Windows等多種操做系統平臺mysql
全量備份:將全部數據都進行一次備份linux
增量備份:基於全量備份來講,只給增長的部分作備份web
scp命令redis
語法及使用方式sql
scp [選項] [源文件] [用戶名@主機]:[位置] scp -r /etc root@172.16.1.31:/tmp
scp只能全量備份,因此效率較低shell
ssh 22 telnet 23 ftp 21 http 80 DNS 53 https 443 rdp 3389 rsync 873 mysql 3306 redis 6379
rsync官方地址:TPvim
rsync運行模式:C/S安全
C/S架構:須要一個客戶端和服務端bash
源文件路徑的後面若是加/,就會拷貝源文件路徑下面的全部文件服務器
若是不加/,就會拷貝源文件和源文件路徑下面全部的文件
Rync的數據同步模式
1.推: 全部主機推送本地數據至Rsync備份服務器,會致使數據同步緩慢(適合少許數據備份)
2.拉: rsync備份服務端拉取全部主機上的數據,會致使備份服務器開銷大
rsync命令的選項
-a:archive 歸檔拷貝,包含-tropglD -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 #使用密碼文件
單個主機本地之間的數據傳輸
Local: rsync [OPTION...] SRC... [DEST] 選項 源文件 目標文件 ## 拷貝/etc目錄到/tmp下 [root@backup ~]# rsync -av /etc /tmp/ ## 拷貝/etc/目錄下的全部文件到/tmp [root@backup ~]# rsync -av /etc/ /tmp/
經過ssh通道傳輸數據
Rsync藉助SSH協議同步數據存在的缺陷
1.使用系統用戶(不安全)
2.使用普通用戶(會致使權限不足狀況)
Pull:拉 Push:推 Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] 選項 用戶名@主機ip:源文件 目標 Push: rsync [OPTION...] SRC... [USER@]HOST:DEST 選項 源文件 用戶名@主機ip:目標 #缺點:必須使用系統用戶,用root用戶還得知道root用戶的密碼,普通用戶又有可能沒有權限
## 將172.16.1.31服務器上的/opt目錄及下面的全部文件拉到本地的/etc/目錄下 rsync -avz root@172.16.1.31:/opt /etc/ ## 將本地/etc目錄及下面的全部文件遠程傳輸給172.16.1.31服務器的/opt目錄下 rsync -avz /etc root@172.16.1.31:/opt
rsync自身很是重要的功能(不使用系統用戶,更加安全)
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] 選項 用戶名@主機ip::模塊名 源文件 rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST::DEST 選項 源文件 用戶名@主機ip::模塊名(目標路徑) rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST #選項 -a:歸檔同步 -v:顯示同步的過程 -z:壓縮同步(下降同步時佔用的網絡帶寬) --delete:無差別同步 --password-file=密碼文件:指定用戶密碼文件,免交互
主機角色 | 外網IP(WAN) | 內網IP(LAN) | 主機名稱 |
---|---|---|---|
Rsync服務端 | 10.0.0.41 | 172.16.1.41 | backup |
Rsync客戶端 | 10.0.0.31 | 172.16.1.31 | nfs |
[root@backup ~]# yum -y install rsync
## 查找rsync的配置文件路徑,只能查找rpm安裝包的信息 [root@backup ~]# rpm -qc rsync
[root@backup ~]$ vim /etc/rsyncd.conf uid = rsync #服務啓動的用戶 gid = rsync #服務啓動的用戶組 port = 873 #服務監聽的端口 fake super = yes #假的超級用戶,以普通用戶身份執行rooy用戶能執行的操做 use chroot = no #禁錮指定的目錄,不容許用戶跳出到其餘目錄 max connections = 200 #最大鏈接數 timeout = 600 #超時時間 ignore errors #忽略錯誤提示 read only = false #只讀爲false,就是可讀可寫 list = false #不容許其餘用戶查詢模塊名 auth users = rsync_backup #虛擬用戶,rcync同步須要使用的用戶,可隨意指定用戶 secrets file = /etc/rsync.passwd #指定存放虛擬用戶密碼的文件爲/etc/rsync.passwd,可隨意定義 log file = /var/log/rsyncd.log #指定srync服務的日誌文件存放路徑爲var/log/rsyncd.log,可隨意定義 #--------------------------------------------------------------分割線 [backup] #模塊名,可隨意定義 comment = welcome to oldboyedu backup! #註釋,同步的描述信息,隨便寫 path = /backup #同步的路徑,也就是用戶被禁錮的路徑
[root@backup ~]$ useradd rsync -s /sbin/nologin -M [root@backup ~]$ id rsync uid=1000(rsync) gid=1000(rsync) groups=1000(rsync)
[root@backup ~]$ echo 'rsync_backup:123' > /etc/rsync.passwd #咱們建立的是虛擬用戶的密碼 #密碼文件的格式:用戶名:密碼 [root@backup ~]$ cat /etc/rsync.passwd rsync_backup:123
chmod 600 /etc/rsync.passwd
mkdir /backup
chown rsync:rsync /backup/ [root@backup ~]$ ll /backup/ -d drwxr-xr-x. 2 rsync rsync 6 Jul 6 19:23 /backup/
[root@backup ~]# systemctl start rsyncd
[root@backup ~]# systemctl enable rsyncd
[root@backup ~]$ ps -ef|grep [r]sync root 7444 1 0 Jul06 ? 00:00:00 /usr/bin/rsync --daemon --no-detach [root@backup ~]$ netstat -lntup|grep 873 tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 7444/rsync tcp6 0 0 :::873 :::* LISTEN 7444/rsync
[root@nfs ~]$ rsync -avz /etc rsync_backup@172.16.1.41::backup Password: #須要輸入密碼
報錯1.
[root@nfs ~]$ rsync -avz /etc rsync_backup@172.16.1.41::backup Password: @ERROR: auth failed on module bak rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2] 排查思路: 1.密碼文件的權限不是600 2.密碼文件裏的密碼和手動輸入的密碼不一致 3.密碼文件名字和配置文件中的名字不一致
報錯2.
[root@nfs ~]$ rsync -avz /backup/123.txt rsync_backup@172.16.1.41::backup Password: sending incremental file list 123.txt rsync: mkstemp ".123.txt.P2Kfee" (in bak) failed: Permission denied (13) sent 89 bytes received 120 bytes 139.33 bytes/sec total size is 0 speedup is 0.00 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [sender=3.1.2] 排查思路: 1.沒有關閉selinux 2.備份路徑的權限不是配置文件中指定的uid權限
報錯3.
[root@nfs ~]# rsync -avz /var rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd ERROR: password file must not be other-accessible rsync error: syntax or usage error (code 1) at authenticate.c(196) [sender=3.1.2] 排查思路: 客戶端的密碼文件權限必須也是600
# 1.建立密碼文件(客戶端的密碼文件只寫密碼不寫用戶) [root@nfs ~]$ echo '123' > /etc/rsync.passwd [root@nfs ~]$ chmod 600 /etc/rsync.passwd [root@nfs ~]$ rsync -avz /var rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd # 2.使用rsync的環境變量 [root@nfs ~]$ export RSYNC_PASSWORD=123 [root@nfs ~]$ rsync -avz /var rsync_backup@172.16.1.41::backup
#爲了保持數據的一致性 [root@nfs ~]$ mkdir /opt/date [root@nfs ~]$ rsync -avz --delete /opt/date rsync_backup@172.16.1.41::backup
角色 | 外網IP(WAN) | 內網IP(LAN) | 主機名 |
---|---|---|---|
rsync客戶端 | 10.0.0.7 | 172.16.1.7 | web01 |
rsync客戶端 | 10.0.0.31 | 172.16.1.31 | nfs |
rsync服務端 | 10.0.0.41 | 172.16.1.41 | backup |
1.客戶端提早準備存放的備份的目錄,目錄格式以下: /backup/nfs_172.16.1.31_2018-09-02
# 在web01和nfs服務器上建立備份目錄 [root@nfs ~]$ mkdir /backup [root@web01 ~]$ mkdir /backup
2.客戶端在本地打包備份(系統配置文件、應用配置等)拷貝至/backup/nfs_172.16.1.31_2018-09-02
#打包備份/etc/passwd mkdir /backup/$(hostname)_$(ifconfig eth0|awk 'NR==2 {print $2}')_$(date +%F) tar zcf /backup/$(hostname)_$(ifconfig eth0|awk 'NR==2 {print $2}')_$(date +%F)/pass.tgz /etc/passwd
3.客戶端最後將備份的數據進行推送至備份服務器
rsync -az /backup/$(hostname)_$(ifconfig eth0|awk 'NR==2 {print $2}')_$(date +%F)/pass.tgz rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd
4.客戶端天天凌晨1點定時執行該腳本
[root@web01 ~]$ crontab -l 00 01 * * * /usr/bin/sh /root/backup.sh &>/dev/null
5.客戶端服務器本地保留最近7天的數據, 避免浪費磁盤空間
find /backup ! -mtime -7|xargs rm -f
#!/bin/bash #if [ -d /backup ];then # echo '存在' #else # echo '不存在' #fi #將/backup目錄設置爲變量bak_dir bak_dir=/backup #將命令$(hostname)設置爲變量HOSTNAME HOSTNAME=$(hostname) #將主機IP設置爲變量IP IP=$(/usr/sbin/ifconfig eth1|awk 'NR==2{print $2}') #將時間命令$(date +%F)設置爲變量DATE DATE=$(date +%F) #將/backup/主機名_IP_時間 這個格式的目錄設置爲變量tar_dir tar_dir=$bak_dir/${HOSTNAME}_${IP}_${DATE} #設置臨時變量:指定虛擬用戶密碼爲123 export RSYNC_PASSWORD=123 #建立/backup目錄 mkdir -p $bak_dir #遞歸建立/backup/主機名_IP_時間,這個目錄 mkdir -p $tar_dir #到/etc目錄下:爲防止tar命令的/報錯 cd /etc #等於tar zcf /backup/主機名_IP_時間/passwd.tgz passwd tar zcf $tar_dir/passwd.tgz passwd #等於md5sum /backup/主機名_IP_時間/passwd.tgz > /backup/主機名_IP_時間/md5.check 表示利用md5sum工具給壓縮包對應的隨機數後,將隨機數存放至/backup/主機名_IP_時間目錄下的md5.check文件中 md5sum $tar_dir/passwd.tgz > $tar_dir/md5.check #將/backup目錄中的內容備份至服務端,注意$bak_dir/帶根了,只複製目錄下面的全部內容,不包括目錄自己 rsync -az $bak_dir/ rsync_backup@172.16.1.41::backup #刪除/backup目錄中7天之前的信息 find /backup ! -mtime -7|xargs rm -f
1.服務端部署rsync,用於接收客戶端推送過來的備份數據
[root@backup ~]$ vim /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 而後配置好用戶及文件,同上配置rsync服務
2.服務端須要天天校驗客戶端推送過來的數據是否完整
1.在客戶端打包完成以後,先要生成一個md5值保存到文件裏 md5sum /backup/主機名_IP_時間/passwd.tgz > /backup/主機名_IP_時間/md5.check 2.在服務端使用md5sum -c來校驗數據的完整性 md5sum -c /backup/主機名_IP_時間/md5.check
3.服務端須要天天校驗的結果通知給管理員
1.配置郵件 2.將校驗的結果經過郵件發送到管理員的郵箱 md5sum -c md5.check |mail md5校驗數據 1946354906@qq.com 3.編寫定時任務 [root@backup ~]$ crontab -e #天天執行一次校驗腳本 00 00 * * * /usr/bin/sh /root/backup.sh &> /dev/null
4.服務端僅保留6個月的備份數據,其他的所有刪除
find /backup ! -mtime -180|xargs rm -f
#!/bin/bash #將/backup設置爲變量bak_dir bak_dir=/backup #將執行hostname命令後的結果設置爲變量HOSTNAME HOSTNAME=$(hostname) #將主機內網IP設置爲變量IP IP=$(/usr/sbin/ifconfig eth1|awk 'NR==2{print $2}') #將執行hostname命令後的結果設置爲變量HOSTNAME HOSTNAME=$(hostname) #將主機內網IP設置爲變量IP IP=$(/usr/sbin/ifconfig eth1|awk 'NR==2{print $2}') #將date +%F命令執行後的日期信息設置爲變量DATE DATE=$(date +%F) #將/backup/主機名_主機IP_時間信息 這個格式的目錄設置爲變量tar_dir tar_dir=$bak_dir/${HOSTNAME}_${IP}_${DATE} #利用md5sum -c命令校驗/backup/主機名_主機IP_時間信息/ 下面的全部存放隨機數的文件,並用郵件將校驗結果發給指定用戶 md5sum -c $bak_dir/*/*.check|mail -s "備份數據校驗結果${DATE}" 1946354906@qq.com #其餘信息放進黑洞文件 &>/dev/null #服務端刪除6個月以前的備份文件 find $bak_dir ! -mtime -180|xargs rm -f
配置郵件 vim /etc/mail.rc set from=#發郵件的qq郵箱 set smtp=smtps://smtp.qq.com:465 set smtp-auth-user=#發郵件的qq郵箱 set smtp-auth-password=#客戶端受權碼 set smtp-auth=login set ssl-verify=ignore set nss-config-dir=/etc/pki/nssdb/
[root@backup ~]# vim /etc/rsyncd.conf #------------------------------- #模塊名 [backup] #同步的描述信息 comment = xxx #同步的路徑 path = /backup #------------------------------ [backup2] comment = aaa path = /backup2 #根據配置文件建立出對應的目錄 [root@backup ~]$ mkdir /backup2 #再更改新目錄屬主屬組信息 [root@backup ~]$ chown rsync.rsync /backup2/ #只要改完配置文件必定要重啓服務 [root@backup ~]$ systemctl restart rsyncd #客戶端同步 [root@nfs ~]$ rsync -avz /etc rsync_backup@172.16.1.41::backup2