Rsync文件同步及備份

Rsync文件同步及備份

Rsync基本概述

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

Rsync的三種傳輸模式

源文件路徑的後面若是加/,就會拷貝源文件路徑下面的全部文件服務器

若是不加/,就會拷貝源文件和源文件路徑下面全部的文件

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 #使用密碼文件

本地方式(相似cp)

單個主機本地之間的數據傳輸

Local:  rsync [OPTION...] SRC... [DEST]
			     選項     源文件   目標文件
## 拷貝/etc目錄到/tmp下
[root@backup ~]# rsync -av /etc /tmp/

## 拷貝/etc/目錄下的全部文件到/tmp
[root@backup ~]# rsync -av /etc/ /tmp/

遠程方式(相似scp)

經過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

守護進程(C/S結構)

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=密碼文件:指定用戶密碼文件,免交互

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的配置文件路徑,只能查找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

rsync要求密碼文件的權限必須是600

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/

啓動rsync服務

[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

企業中rsync實戰案例

環境準備

角色 外網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/

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

[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
相關文章
相關標籤/搜索