Rsync文件同步備份

Rsync文件同步備份

什麼是Rsync

rsync是一款開源、快速、多功能、可實現全量及增量的本地或遠程數據同步備份的優秀工具。
rsync軟件適用於Unix/linux/Windows/macos等多種操做系統平臺。
  • 全量備份:將全部數據都進行一次備份
  • 增量備份:基於全量備份來講,只給增長的部分作備份

遠程文件傳輸

# 語法
scp [選項] [源文件] [用戶名@主機IP]:[位置]

# 選項
-r:遞歸複製
[root@backup ~]# scp -r /etc/passwd root@172.16.1.31:/tmp

# 注意:scp不支持增量,只能全量備份

服務端口

協議 端口
ssh 22
telnet 23
ftp 21
http 80
https 443
rdp 3389
rsync 873
RPCbind 111
mysql 3306
php 9000
redis 6379

Rsync簡介

  • rsync官網:TP
  • rsync端口:873
  • rsync模式:C/S client/server

注意:利用rsync還能夠實現刪除文件和目錄的功能,這又至關於rm命令,一個rsync至關於scp、cp、rm,可是還優於他們的每個命令。php

Rsync的三種傳輸模式

rsync命令注意:
  • 1.傳遞的目錄加/只同步該目錄下的全部文件
  • 2.傳遞的目錄不加/同步該目錄自己和目錄下的全部文件
三種傳輸模式
  • 本地方式:相似於cp命令
Local: rsync [OPTION...] SRC... [DEST]

## 拷貝/etc目錄到/tmp下
[root@backup ~]# rsync -av /etc /tmp/

## 拷貝/etc/目錄下的全部文件到/tmp
[root@backup ~]# rsync -av /etc/ /tmp/
  • 遠程方式:相似於scp命令
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結構(服務器和客戶端)
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:archive 歸檔拷貝,等於-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服務實戰

環境準備

主機角色 外網IP(WAN) 內網IP(LAN) 主機名稱
Rsync服務端 10.0.0.41 172.16.1.41 backup
Rsync客戶端 10.0.0.31 172.16.1.31 nfs

安裝rsync

[root@backup ~]# yum -y install rsync

配置rsync

查找rsync的配置文件路徑
[root@backup ~]# rpm -qc rsync
[root@backup ~]# rpm -qc rsync
/etc/rsyncd.conf
/etc/sysconfig/rsyncd
1.修改配置
[root@backup ~]# vim /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 = dsr_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[nfs_backup]
comment = welcome to oldboyedu backup!
path = /opt/backup1/nfs_data
#####################################
[web_backup]
comment = welcome to oldboyedu backup!
path = /opt/backup2/web_bak



[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
# 只讀爲false,可讀可寫
read only = false
# 不容許其餘用戶查詢模塊名
list = false
# 虛擬用戶,rsync同步須要使用的用戶
auth users = dsr_backup
# 存放虛擬用戶密碼的文件
secrets file = /etc/rsync.passwd
# rsync服務的日誌存放路徑
log file = /var/log/rsyncd.log
#####################################
# 模塊名
[nfs_backup]
# 同步的描述信息
comment = welcome to oldboyedu backup!
# 同步的路徑
path = /opt/backup1/nfs_data
#####################################
# 模塊名
[web_backup]
# 同步的描述信息
comment = welcome to oldboyedu backup!
# 同步的路徑
path = /opt/backup2/web_bak
2.建立服務啓動的用戶
[root@backup ~]# groupadd www -g 666
[root@backup ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M
3.建立虛擬用戶的密碼文件
密碼文件的格式用戶名:密碼
[root@backup ~]# echo 'dsr_backup:123' > /etc/rsync.passwd
[root@backup ~]# cat /etc/rsync.passwd dsr_backup:123
4.rsync要求密碼文件的權限必須是600
[root@backup ~]# chmod 600 /etc/rsync.passwd 
[root@backup ~]# ll /etc/rsync.passwd -rw-------. 1 root root 17 Jul  6 20:06 /etc/rsync.passwd
5.建立備份目錄
[root@backup ~]# mkdir -p /opt/backup1/nfs_data
[root@backup ~]# mkdir -p /opt/backup2/web_bak
6.修改同步路徑的屬主和屬組
[root@backup ~]# chown www.www /opt/backup1/nfs_data
[root@backup ~]# chown www.www /opt/backup1
[root@backup ~]# chown www.www /opt/backup2/web_bak/
[root@backup ~]# chown www.www /opt/backup2
7.啓動rsync服務
[root@backup ~]# systemctl start rsyncd
8.加入開機自啓
[root@backup ~]# systemctl enable rsyncd
9.驗證服務啓動(進程,端口)
[root@backup ~]# ps -ef|grep [r]syncroot  
7405      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      7405/rsync          tcp6       0      0 :::873                  :::*                    LISTEN      7405/rsync

客戶端操做

須要交互

[root@nfs ~]# rsync -avz /etc rsync_backup@172.16.1.41::backup

報錯1

[root@nfs ~]# rsync -avz /etc zls_abc@172.16.1.41::bak
Password:
@ERROR: auth failed on module bakrsync 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 list123.txtrsync: mkstemp ".123.txt.P2Kfee" (in bak) failed: Permission denied (13)sent 89 bytes received 120 bytes 139.33 bytes/sectotal size is 0 speedup is 0.00rsync error: some files/attrs were not transferred (see previous errors) (code 23) atmain.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-accessiblersync 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 rsync_backup@172.16.1.41::backup --password-file=/tmp/rsync.pass

# 2.使用rsync的環境變量
[root@nfs ~]# export RSYNC_PASSWORD=123
[root@nfs ~]# rsync -avz /var rsync_backup@172.16.1.41::backup

無差別同步

## 爲了保證數據的一致性
[root@nfs data]# rsync -avz --delete /opt/data rsync_backup@172.16.1.41::backup

企業中rsync實戰案例

環境搭建

角色 外網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 nfs
rsync服務端 eth0:10.0.0.41 eth1:172.16.1.41 backup

客戶端需求

1.客戶端提早準備存放的備份的目錄,目錄規則以下:/backup/nfs_172.16.1.31_2018-09-02mysql

[root@nfs ~]# mkdir -p /backup/$(hostname)_$(hostname -I|awk '{print $2}')_$(date +%F)
[root@web01 ~]# mkdir -p /backup/$(hostname)_$(hostname -I|awk '{print $2}')_$(date +%F)

2.客戶端在本地打包備份(系統配置文件、應用配置等)拷貝至/backup/nfs_172.16.1.31_2018-09-02linux

tar zcf /backup/$(hostname)_$(hostname -I|awk '{print $2}')_$(date +%F)/passwd.tgz /etc/passwd

3.客戶端最後將備份的數據進行推送至備份服務器web

echo '123' > /tmp/rsync.passwdchmod 600 /tmp/rsync.passwdrsync -az  /backup/$(hostname)_$(hostname -I|awk '{print $2}')_$(date +%F) rsync_backup@172.16.1.41::backup --password-file=/tmp/rsync.passwd

4.客戶端天天凌晨1點定時執行該腳本redis

crontab -e00 01 * * * /bin/sh /root/backup.sh &> /dev/null

5.客戶端服務器本地保留最近7天的數據, 避免浪費磁盤空間sql

find /backup !-mtime -7|xargs rm -f

服務端需求

1.服務端部署rsync,用於接收客戶端推送過來的備份數據shell

部署rsync守護進程模式

2.服務端須要天天校驗客戶端推送過來的數據是否完整macos

1.在客戶端打包完成以後,先要生成一個md5值保存到文件裏2.在服務端使用md5sum -c來校驗數據的完整性

3.服務端須要天天校驗的結果通知給管理員vim

# 1.配置郵件# 2.將校驗的結果經過郵件發送到管理員的郵箱md5sum -c md5.check |mail md5校驗數據 133411023@qq.com

4.服務端僅保留6個月的備份數據,其他的所有刪除bash

find /backup ! -mtime -180|xargs rm -f

客戶端腳本

#!/bin/bash
bak_dir=backup
HOSTNAME=$(hostname)
IP=$(hostname -I|awk '{print $2}')
DATE=$(date +%F)
tar_dir=$bak_dir/${HOSTNAME}_${IP}_${DATE}mkdir -p /$tar_dir
cd /etc
tar zcf /$tar_dir/passwd.tgz passwd
echo '123' > /tmp/rsync.passwd
chmod 600 /tmp/rsync.passwd
md5sum /$tar_dir/passwd.tgz > /$tar_dir/md5.check
rsync -az /$tar_dir rsync_backup@172.16.1.41::backup --password-file=/tmp/rsync.passwd
find /$bak_dir ! -mtime -7|xargs rm -f
[root@nfs ~]# crontab -e
*/6 * * * * /bin/ntpdate time1.aliyun.com &>/dev/null
00 01 * * * /bin/sh /root/backup.sh &> /dev/null

服務端腳

#!/bin/bash
bak_dir=backup
HOSTNAME=$(hostname)
IP=$(hostname -I|awk '{print $2}')
DATE=$(date +%F)
tar_dir=$bak_dir/${HOSTNAME}_${IP}_${DATE}

md5sum -c /$bak_dir/*/*.check|mail -s "備份數據校驗結果${DATE}"1031109605@qq.com &> /dev/null
find /$bak_dir ! -mtime -180|xargs rm -f

[root@backup ~]# crontab -e
*/5 * * * * /bin/ntpdate time1.aliyun.com &>/dev/null
00 01 * * * /bin/sh /root/backup.sh &> /dev/null

如何配置rsync服務多備份目錄

[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

rsync擴展結合inotify使用

安裝inotify

yum -y install inotify-tools

inotify命令

/usr/bin/inotifywait -mrq --format '%Xe %w %f' -ecreate,modify,delete,attrib,close_write /backup
相關文章
相關標籤/搜索