rsync是一款開源、快速、多功能、可實現全量及增量的本地或遠程數據同步備份的優秀工具。rsync軟件適用於 MacOS/Unix/linux/Windows等多種操做系統平臺。
全量備份:將全部的數據都進行一次備份linux
增量備份:基於全量備份來講,只給增長的部分作備份web
## 不支持增量 scp [選項] [源文件] [用戶名@主機] [位置] [root@backup ~]# scp -r /etc/ root@172.16.1.31:/tmp
ssh 22 telnet 23 ftp 21 http 80 https 443 rdp 3389 rsync 873
rsync官網:[TP](rsync (samba.org))shell
rsync端口:873vim
rsync模式:C/S client/server (客戶端鏈接服務端)bash
本地方式:相似於 cp 命令服務器
#rsync命令注意:1.傳遞的目錄加/只同步該目錄下的全部文件 2.傳遞的目錄不加/同步該目錄自己和目錄下的全部文件 本地方式:相似於 cp 命令 Local: rsync [OPTION...] SRC... [DEST] SRC:source 源文件 [DEST]:目標 ## 拷貝/etc目錄及底下的全部文件到/tmp/ [root@backup ~]# rsync -av /etc /tmp/ ## 拷貝/etc/目錄下的全部文件到/tmp [root@backup ~]# rsync -av /etc/ /tmp/
遠程方式:相似於 scp 命令ssh
Access via remote shell: Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] rsync 選項... 用戶名@主機IP:源文件 目標 ## 將172.16.1.31服務器上的/opt目錄及下面的全部文件拉到本地的/etc/目錄下 rsync -avz root@172.16.1.31:/opt /etc/ Push: rsync [OPTION...] SRC... [USER@]HOST:DEST rsync 選項... 源文件 用戶名@主機IP:目標 ## 將本地/etc目錄及下面的全部文件遠程傳輸給172.16.1.31服務器的/opt目錄下 [root@backup ~]# rsync -avz /etc root@172.16.1.31:/opt 缺點:必須使用系統用戶,用root用戶還得知道root的密碼
守護進程:C/S結構(服務端和客戶端)tcp
Access via rsync daemon: Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] #SRC : 表明的是模塊 不是源文件了 port:端口 通常用第一個 Push: rsync [OPTION...] SRC... [USER@]HOST::DEST rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST ## rsync的選項 -a:#archive 歸檔拷貝 -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 #使用密碼文件
前戲準備工具
主機角色 | 外網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的配置文件路徑 [root@backup ~]# rpm -qc rsync 只有yum安裝的或者rpm命令安裝的服務才能用rpm -qc查看 用源碼安裝或者二進制安裝的包 這個是看不了的 ## 1.修改配置 [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 [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 # 只讀爲false,可讀可寫 read only = false # 不容許其餘用戶查詢模塊名 list = false # 虛擬用戶,rsync同步須要使用的用戶 auth users = rsync_backup # 存放虛擬用戶密碼的文件 secrets file = /etc/rsync.passwd # rsync服務的日誌存放路徑 log file = /var/log/rsyncd.log #################################### # 模塊名 [backup] # 同步的描述信息 comment = xxx # 同步的路徑 path = /backup ## 2.建立服務啓動的用戶 [root@backup ~]# useradd rsync -s /sbin/nologin -M ## 3.建立虛擬用戶的密碼文件 密碼文件的格式 用戶名:密碼 [root@backup ~]# echo 'rsync_backup:1' > /etc/rsync.passwd [root@backup ~]# cat /etc/rsync.passwd rsync_backup:1 ## 4.rsync要求密碼文件的權限必須是600 [root@backup ~]# chmod 600 /etc/rsync.passwd ## 5.建立一個同步的路徑 [root@backup ~]# mkdir /backup ## 6.修改同步路徑的屬主和屬組 [root@backup ~]# chown rsync:rsync /backup/ ## 7.啓動rsync服務 [root@backup ~]# systemctl start rsyncd ## 8.加入開機自啓 [root@backup ~]# systemctl enable rsyncd ## 9.驗證服務啓動(進程,端口) [Wed Jul 07 05:53:17 root@backup ~] # ps -ef|grep [r]sync root 17427 1 0 Jul06 ? 00:00:00 /usr/bin/rsync --daemon --no-detach [Wed Jul 07 05:56:47 root@backup ~] # netstat -lntup|grep 873 tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 17427/rsync tcp6 0 0 :::873 :::* LISTEN 17427/rsync
## 須要交互 [root@nfs ~]# rsync -avz /etc zls_abc@172.16.1.41::bak ## 報錯1 [root@nfs ~]# rsync -avz /etc zls_abc@172.16.1.41::bak 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 zls_abc@172.16.1.41::bak 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 zls_abc@172.16.1.41::bak --passwordfile=/tmp/rsync.pass 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' > /tmp/rsync.pass [root@nfs ~]# chmod 600 /tmp/rsync.pass [root@nfs ~]# rsync -avz /var zls_abc@172.16.1.41::bak --passwordfile=/tmp/rsync.pass # 2.使用rsync的環境變量 [root@nfs ~]# export RSYNC_PASSWORD=123 [root@nfs ~]# rsync -avz /var zls_abc@172.16.1.41::bak
## 爲了保證數據的一致性 [root@nfs data]# rsync -avz --delete /opt/data sync_backup@172.16.1.41::bak
角色 | 外網IP(WAN) | 內網IP(LAN) | 主機名 |
---|---|---|---|
rsync客戶端 | eth0:10.0.0.7 | eth1:172.16.1.7 | web01 |
rsync客戶端 | eth0:10.0.0.31 | eth1:172.16.1.31 | nfs01 |
rsync服務端 | eth0:10.0.0.41 | eth1:172.16.1.41 | backu |
1.客戶端提早準備存放的備份的目錄,目錄規則以下: /backup/nfs_172.16.1.31_2018-09-02ui
# 在web01和nfs服務器上建立備份目錄 [root@web01 ~]# mkdir /backup [root@nfs ~]# mkdir /backup
2.客戶端在本地打包備份(系統配置文件、應用配置等)拷貝至 /backup/nfs_172.16.1.31_2018-09-02
mkdir /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F) tar zcf /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F)/pass.tgz /etc/passwd
3.客戶端最後將備份的數據進行推送至備份服務器
rsync -az /backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date +%F)/pass.tgz zls_abc@172.16.1.41::bak --password-file=/etc/rsync.pass
4.客戶端天天凌晨1點定時執行該腳本
crontab -e 00 01 * * * /bin/sh /root/backup.sh &>/dev/null
5.客戶端服務器本地保留最近7天的數據, 避免浪費磁盤空間
find /backup ! -mtime -7|xargs rm -f
1.服務端部署rsync,用於接收客戶端推送過來的備份數據
部署rsync守護進程模式
2.服務端須要天天校驗客戶端推送過來的數據是否完整
1.在客戶端打包完成以後,先要生成一個md5值保存到文件裏 2.在服務端使用md5sum -c來校驗數據的完整性
3.服務端須要天天校驗的結果通知給管理員
# 1.配置郵件 # 2.將校驗的結果經過郵件發送到管理員的郵箱 md5sum -c md5.check |mail md5校驗數據 1922142306@qq.com
4.服務端僅保留6個月的備份數據,其他的所有刪除
find /backup ! -mtime -180|xargs rm -f
#!/bin/bash #if [ -d /backup ];then # echo '存在' #else # echo '不存在' #fi bak_dir=/backup HOSTNAME=$(hostname) IP=$(/usr/sbin/ifconfig eth1|awk 'NR==2{print $2}') DATE=$(date +%F_%T) tar_dir=$bak_dir/${HOSTNAME}_${IP}_${DATE} export RSYNC_PASSWORD=123 mkdir -p $bak_dir mkdir -p $tar_dir cd /etc tar zcf $tar_dir/passwd.tgz passwd md5sum $tar_dir/passwd.tgz > $tar_dir/md5.check rsync -az $bak_dir/ zls_abc@172.16.1.41::bak find /backup ! -mtime -7|xargs rm -f
#!/bin/bash bak_dir=/backup HOSTNAME=$(hostname) IP=$(/usr/sbin/ifconfig eth1|awk 'NR==2{print $2}') DATE=$(date +%F_%T) tar_dir=$bak_dir/${HOSTNAME}_${IP}_${DATE} md5sum -c $bak_dir/*/*.check|mail -s "備份數據校驗結果${DATE}" 133411023@qq.com &>/dev/null find $bak_dir ! -mtime -180|xargs rm -f
[root@backup ~]# vim /etc/rsyncd.conf #------------------------------- # 模塊名 [bak] # 同步的描述信息 comment = xxx # 同步的路徑 path = /backup #------------------------------ [bak2] comment = aaa path = /backup2 ## 根據配置文件建立出對應的目錄 [root@backup ~]# mkdir /backup2 [root@backup ~]# chown rsync.rsync /backup2/ ## 只要改完配置文件必定要重啓服務 [root@backup ~]# systemctl restart rsyncd ## 客戶端同步 [root@nfs ~]# rsync -avz /etc zls_abc@172.16.1.41::bak2
yum -y install inotify-tools
/usr/bin/inotifywait -mrq --format '%Xe %w %f' -e create,modify,delete,attrib,close_write /backup