Rsync文件同步及備份

Rsync文件同步及備份

Rsync服務概述

rsync是一款開源、快速、多功能、可實現全量及增量的本地或遠程數據同步備份的優秀工具。rsync軟件適用於
MacOS/Unix/linux/Windows等多種操做系統平臺。

全量備份:將全部的數據都進行一次備份linux

image
增量備份:基於全量備份來講,只給增長的部分作備份web

image

遠程文件傳輸

## 不支持增量
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簡介

rsync官網:[TP](rsync (samba.org))shell

rsync端口:873vim

rsync模式:C/S client/server (客戶端鏈接服務端)bash

rsync的三種傳輸模式

本地方式:相似於 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 #使用密碼文件

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
只有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

企業中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 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

如何配置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' -e
create,modify,delete,attrib,close_write /backup

image

相關文章
相關標籤/搜索