MENU

Rsync备份服务

• 2019 年 07 月 20 日 • 默认分类,Linux技术

RSYNC+全网备份

RSYNC=Remote Sync 远程同步 高效,一定要结合shell
官方网站:https://rsync.samba.org/
Author: Andrew Tridgell, Wayne Davison, and others
Andrew Tridgell是Samba项目的领导者和主要开发人员,同时还在参与开发rsync、Linux Kernel。
rsync --version #查看rsync版本,可以看到相关作者信息

与SCP的比较:scp=无法备份大量数据,类似windows的复制
rsync=边复制 ,边统计,边比较

Rysnc特性和优点

可以镜像保存整个目录树和文件系统。
可以很容易做到保持原来文件的权限、时间、软硬链接等等。
无须特殊权限即可安装。
快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。
压缩传输:rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。
安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接。
支持匿名传输,以方便进行网站镜象。
选择性保持:符号连接,硬链接,文件属性,权限,时间等

常见备份分类

完整备份,差异备份,增量备份

  • 完整备份:每次备份都是从备份源将所有的文件或目录备份到目的地
  • 差量备份:备份上次完全备份以后有变化的数据(他针对的上次的完全备份,他备份过程中不清除存档属性)
  • 增量备份:备份上次备份以后有变化的数据.(他才不管是那种类型的备份,有变化的数据就备份,他会清除存档属性)

运行模式和端口

  • 采用C/S模式(客户端/服务器模式) [ 就是一个点到点的传输,直接使用rsync命令 ]
  • 端口:873

发起端和备份源

四个名词的解释:

  • 发起端:负责发起rsync同步操作的客户机叫做发起端,通知服务器我要备份你的数据
  • 备份源:负责相应来自客户机rsync同步操作的服务器脚在备份源,需要备份的服务器
  • 服务端:运行rsyncd服务,一般来说,需要备份的服务器
  • 客户端:存放备份数据

数据同步方式

  • 推push:一台主机负责把数据传送给其他主机,服务器开销很大,比较适合后端服务器少的情况
  • 拉pull:所有主机定时去找一主机拉数据,可能就会导致数据缓慢
  • 推:目的主机配置为rsync服务器,源主机周期性的使用rsync命令把要同步的目录推过去(需要备份的机器是客户端,存储备份的机器是服务端)
  • 拉:源主机配置为rsync服务器,目的主机周期性的使用rsync命令把要同步的目录拉过来(需要备份的机器是服务端,存储备份的机器是客户端)两种方案,rsync都有对应的命令来实现

Xinetd管理Rsync工作原理

Xinetd管理Rsync服务.eddx.jpg

使用rsync来同步是先通过xinetd监听873号端口,如果rsync进来的是873号端口,那么xinetd就会通知它所管辖的rsync服务来做回应,接下来就是rsync俩服务于之间的通讯

rsync程序功能: 1 vs 4

rsync == cp

[root@backup ~]# cp -a /etc/hosts /tmp/cp_hosts
[root@backup ~]# ll /tmp/cp_hosts 
-rw-r--r-- 1 root root 375 Feb 21 17:17 /tmp/cp_hosts
[root@backup ~]# rsync -a /etc/hosts /tmp/rsync_hosts
[root@backup ~]# ll /tmp/rsync_hosts
-rw-r--r-- 1 root root 375 Feb 21 17:17 /tmp/rsync_hosts

rsync == scp(远程备份)

scp -rp /etc/sysconfig/  172.16.1.31:/tmp/
rsync -rp /oldboy_dir/  172.16.1.31:/tmp/

利用rsync传输目录时:
传输的目录后面如果存在   / == /xoxo_dir/  表示将目录下面的数据内容进行全部传输
传输的目录后面如果不存在 / == /xoxo_dir   表示将目录本身和目录下面的数据内容进行全部传输

rsync == rm

[root@backup ~]# mkdir /null
[root@backup ~]# ll /null/
total 0
[root@backup ~]# rsync -rp --delete /null/ 172.16.1.31:/tmp/
root@172.16.1.31's password: 
--delete : 无差异同步--我有什么,你也有什么;我没有什么,你也不能有
           实现不同主机之间数据高度一致

rsync == ls

[root@nfs01 tmp]# ls /tmp/
oldboy.txt
[root@nfs01 tmp]# rsync /tmp/
drwxr-xr-x             24 2019/02/21 17:42:52 .
-rw-r--r--              0 2019/02/21 17:41:46 xoxo.txt

rsync命令的工作模式

本地备份数据 cp

Local:  rsync [OPTION...] SRC... [DEST]
src:  要备份的数据信息
DEST: 将数据存储在什么位置    

远程备份数据 scp

Access via remote shell:
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]  -- 下载
[USER@]  -- 指定以什么用户身份传输数据
HOST     -- 指定远程主机IP地址或者主机名称
SRC      -- 远程主机上要进行下载的数据信息
DEST     -- 将远程主机信息保存到本地主机的什么路径中

Push: rsync [OPTION...] SRC... [USER@]HOST:DEST    -- 上传
SRC      -- 本地主机上要进行上传的数据信息
DEST     -- 将本地主机信息保存到远程主机的什么路径中

守护进程方式远程备份数据:(推荐)

Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] -- 下载
      [USER@]  -- 指定一个认证用户信息
      HOST     -- 指定远程主机IP地址或者主机名称
      SRC      -- 远程主机上要进行下载的模块信息???
      DEST     -- 将远程主机信息保存到本地主机的什么路径中
      
      rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
            
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST   -- 上传
      SRC      -- 本地主机上要进行上传的数据信息
      [USER@]  -- 指定一个认证用户信息
      HOST     -- 指定远程主机IP地址或者主机名称
      DEST     -- 将本地主机信息保存到远程主机的什么模块信息???
      
      rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
         
  1. 可以控制传输的连接数量(同一时刻)
  2. 可以实现免交互方式进行传输数据
  3. 具有单独的传输认证进制

rsync服务守护进程方式部署流程(YUM)

rsync服务端(rsync服务进程)
第一个: 安装部署软件

[root@backup ~]# rpm -qa rsync
rsync-3.1.2-4.el7.x86_64

第二个: 编写配置文件
PS: 只要是一个守护进程服务, 都会存在配置文件

vim /etc/rsyncd.conf
#rsync_config
#created by HQ at 2017
##rsyncd.conf start##    -- 注释信息 
uid = rsync              -- 管理备份目录(属主信息是rsync)
gid = rsync              -- 管理备份目录(属组信息是rsync)
port = 873               -- 守护进程服务端口信息
fake super = yes        -- 假超级
use chroot = no          -- 安全的配置
max connections = 200    -- 同时可以有多少客户端连接rsync服务器
timeout = 300            -- 超时时间,显示空闲连接存活时间
pid file = /var/run/rsyncd.pid   --- 保存进程pid号码信息
lock file = /var/run/rsync.lock  --- 真正的限制同时的连接数
log file = /var/log/rsyncd.log   --- rsync程序日志文件
ignore errors            -- 在备份传输数据时,一些不严重问题先进行忽略
read only = false        -- 备份目录设置为可读可写
list = true              -- 使客户端可以查看服务端的模块信息
hosts allow = 172.16.1.0/24   --- 设置允许哪些主机或网段可以向备份服务器存储数据(白名单)
hosts deny = 0.0.0.0/32       --- 设置禁止哪些主机或网段可以向备份服务器存储数据(黑名单)
auth users = rsync_backup     --- 认证用户
secrets file = /etc/rsync.password  --- 认证用户密码文件(信息:rsync_backup:oldboy123)
[backup]                            --- 模块信息
comment = "backup dir by oldboy"    --- 模块注释说明信息
path = /backup                      --- 定义一个备份目录

第三个: 创建一个rsync虚拟用户

useradd -s /sbin/nologin -M rsync 

第四个: 创建备份目录 授予备份目录相关权限

mkdir /backup
chmod rsync.rsync -R /backup

第五个: 创建认证密码文件

echo "rsync_backup:oldboy123" >/etc/rsync.password
chmod 600 /etc/rsync.password
    

第六个: 启动rsync服务

systemctl start rsyncd
systemctl enable rsyncd

rsync客户端
进行传输测试 切记关闭SElinux与防火墙

[root@nfs01 tmp]# rsync -avz /etc/hosts  rsync_backup@172.16.1.41::backup
Password: 

rsync守护进程模式传输数据原理(centos7 rsync - 3.1.2)

a 在客户端执行守护进程备份数据命令

b 完成数据传输认证过程(用户名 密码信息)

c 完成用户映射过程 将客户端用户 --- 服务端的rsync用户

d 完成传输文件属主 属组信息的修改 --- 修改为rsync

如何实现免交互传输数据

完成rsync客户端配置过程
第一: 创建密码文件 修改密码文件权限为600

echo 123456 >/etc/rsync.password
chmod 600 /etc/rsync.password

第二: 进行传输测试

rsync -avz /tmp/123456.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

rsync命令参数说明

-v, --verbose      --- 显示传输数据过程信息
-z, --compress     --- 将传输数据进行压缩
-a, --archive       --- 归档参数 -rtopgDl 
-r, --recursive    --- 递归传输数据
-t, --times        --- 保持文件修改时间不变
-o, --owner        --- 保持文件属主信息不变(在配置文件中uid设置为root用户)
-g, --group        --- 保持文件属组信息不变(在配置文件中gid设置为root用户)
-p, --perms        --- 保持文件权限不变
-D                 --- 保持设置文件信息不变
-l, --links        --- 只传输链接文件,不会传输源文件中的内容 (bug)
-L,                --- 只传输链接文件,会传输源文件中的内容    
-P, --progress     --- 显示数据传输的进度信息

PS:如果想让选项-o和-g参数生效,需要将配置文件的uid和gid改为root,需要将fake super参数进行注释或者改为no

rsync服务实现备份数据排除功能(过滤)

--exclude=PATTERN    注意: 排除数据信息要写上相对路径
--exclude-from=file        利用exclude-from参数排除数据信息时, 建议后面接绝对路径信息

准备环境:

[root@nfs01 tmp]# mkdir /xoxo/{01..03} -p
[root@nfs01 tmp]# touch /xoxo/{01..03}/{a..c}.txt
[root@nfs01 tmp]# tree /xoxo/
/xoxo/
├── 01
│?? ├── a.txt
│?? ├── b.txt
│?? └── c.txt
├── 02
│?? ├── a.txt
│?? ├── b.txt
│?? └── c.txt
└── 03
    ├── a.txt
    ├── b.txt
    └── c.txt
    

进行排除操作: 排除01目录都不传输 排除02目录c.txt文件不要传输

[root@nfs01 tmp]# rsync -avz /xoxo/ --exclude=01/ --exclude=02/c.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
sending incremental file list
./
02/
02/a.txt
02/b.txt
03/
03/a.txt
03/b.txt
03/c.txt

sent 375 bytes  received 134 bytes  1,018.00 bytes/sec
total size is 0  speedup is 0.00

[root@nfs01 xoxo]# rsync -avz /xoxo/ --exclude-from=/xoxo/exlude_file rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
sending incremental file list
./
02/
02/a.txt
02/b.txt
03/
03/a.txt
03/b.txt
03/c.txt

sent 375 bytes  received 134 bytes  1,018.00 bytes/sec
total size is 0  speedup is 0.00

[root@nfs01 xoxo]# cat exlude_file 
01/
02/c.txt
exlude_file
PS: 利用exclude-from参数排除数据信息时, 建议后面接绝对路径信息

rsync服务实现无差异同步

--delete :  使客户端数据信息和备份服务端数据信息保持高度一致
[root@nfs01 xoxo]# rsync -avz /xoxo/ --delete rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
sending incremental file list
deleting 01/c.txt
deleting 01/b.txt
deleting 01/a.txt
deleting 01/
./

sent 235 bytes  received 72 bytes  614.00 bytes/sec
total size is 25  speedup is 0.08

rsync备份服务实现存储数据访问控制

hosts allow = 172.16.1.0/24   白名单
hosts deny = 0.0.0.0/32       黑名单
理解rsync服务访问控制原理
第一种情况: 只有白名单 没有黑名单
[root@nfs01 xoxo]# rsync -avz /xoxo/ --delete rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
sending incremental file list

sent 228 bytes  received 22 bytes  500.00 bytes/sec
total size is 25  speedup is 0.10
[root@nfs01 xoxo]# rsync -avz /xoxo/ --delete rsync_backup@10.0.0.41::backup --password-file=/etc/rsync.password
@ERROR: Unknown module 'backup'
rsync error: error starting client-server protocol (code 5) at main.c(1648) [sender=3.1.2]

rsync服务模块列表功能

list = false    在客户端上可以显示服务端的所有模块信息
PS: 建议将此功能关闭    

rsync服务备份目录层级创建功能

PS: 无法创建多级目录
[root@nfs01 xoxo]# rsync -avz /etc/hosts  rsync_backup@172.16.1.41::backup/01/ --password-file=/etc/rsync.password
sending incremental file list
created directory 01
hosts

sent 227 bytes  received 68 bytes  590.00 bytes/sec
total size is 371  speedup is 1.26
[root@nfs01 xoxo]# rsync -avz /etc/hosts  rsync_backup@172.16.1.41::backup/01/02/03/04/ --password-file=/etc/rsync.password
sending incremental file list
rsync: mkdir "01/02/03/04" (in backup) failed: No such file or directory (2)
rsync error: error in file IO (code 11) at main.c(657) [Receiver=3.1.2]
[root@nfs01 xoxo]# 
[root@nfs01 xoxo]# rsync -avz /etc/hosts  rsync_backup@172.16.1.41::backup/01/02/ --password-file=/etc/rsync.password
sending incremental file list
created directory 01/02
hosts

sent 227 bytes  received 71 bytes  596.00 bytes/sec
total size is 371  speedup is 1.24


6.66实战内容

6.1 客户端推送 backup 目录下所有内容至 Rsync 服务端

export RSYNC_PASSWORD=123456
rsync -avz /backup/ rsync_backup@172.16.1.41::backup

6.2 客户端拉取 Rsync 服务端 backup 模块数据至本地客户端的 /backup 目录

export RSYNC_PASSWORD=123456
rsync -avz rsync_backup@172.16.1.41::backup /backup/

6.3 Rsync 实现数据无差异同步

拉取远端数据:远端与本地保持一致,远端没有本地有会被删除, 造成客户端数据丢失

export RSYNC_PASSWORD=123456
rsync -avz --delete rsync_backup@172.16.1.41::backup /data/

推送数据至远端:本地与远端保持一致, 本地没有远端会被删除, 造成服务器端数据丢失

export RSYNC_PASSWORD=123456
rsync -avz --delete /data/ rsync_backup@172.16.1.41::backup

6.4 Rsync 的 Limit 限速

企业案例: 某 DBA 使用 rsync 拉取备份数据时,由于文件过大导致内部交换机带宽被沾满,导致用户的请求无法响应

export RSYNC_PASSWORD=123456
rsync -avz --bwlimit=1 rsync_backup@172.16.1.41::backup /data/

7.77 全网备份案例

7.1 客户端需求:

客户端需求:

  • 1.客户端 每天凌晨1点在服务器本地打包备份(系统配置文件日志文件其他目录应用配置等文件)
  • 2.客户端备份的数据必须存放至以主机名ip地址当前时间命名的目录中
  • 3.客户端最后通过rsync推送本地已经打包好的备份文件至backup服务器
  • 4.客户端服务器本地保留最近7天的数据,避免浪费磁盘空间

7.2任务 拆解

1.客户端 每天凌晨1点在服务器本地打包备份(系统配置文件日志文件其他目录应用配置等文件)
系统配置文件:

/etc/fstab
/etc/passwd

日志文件:

/var/log/messages
/var/log/secure

打包压缩:

cd / && tar zcvf /backup/sys.tar.gz etc/fstab etc/passwd
cd / && tar zcvf /backup/log.tar.gz var/log/messages var/log/secure

2.客户端备份的数据必须存放至以主机名ip地址当前时间命名的目录中
命名要求:

nfs_172.16.1.31_2019-07-17

主机名:

hostname

ip地址:

ifconfig eth1|awk 'NR==2{print $2}'或者hostname -i (前提需要定义好hosts文件)

时间:

date +%F

拼接在一起:

[root@nfs ~]# echo "$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date
+%F)"
nfs_172.16.1.31_2019-07-17

3.客户端最后通过rsync推送本地已经打包好的备份文件至backup服务器的/backup

rsync -avzP /backup/ oldzhang@172.16.1.41::backup

4.创建测试数据

[root@nfs /backup]# cat date.sh
#!/bin/bash
for i in {1..30}
do
Backup="/backup/$(hostname)_$(ifconfig eth1|awk 'NR==2{print $2}')_$(date
+%F)"
date -s 2019/07/${i}
mkdir -p ${Backup}
cd / && tar zcvf ${Backup}/sys.tar.gz etc/fstab etc/passwd
cd / && tar zcvf ${Backup}/log.tar.gz var/log/messages var/log/secure
done

5.客户端服务器本地保留最近7天的数据,避免浪费磁盘空间

find /backup/ -mtime +7 |xargs rm -rf

6.调试脚本参数

bash -x xxx.sh

7.最终脚本

[root@nfs /server/scripts]# cat push_rsync.sh
#!/bin/bash
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
BACKUP=/backup
HOST=$(hostname)
TIME=$(date +%F)
IP=$(ifconfig eth1|awk 'NR==2{print $2}')
DEST=${HOST}_${IP}_${TIME}
#1.创建目录
mkdir ${BACKUP}/${DEST} -p
#2.打包数据
cd / && tar zcvf ${BACKUP}/${DEST}/sys.tar.gz etc/fstab etc/passwd
cd / && tar zcvf ${BACKUP}/${DEST}/log.tar.gz var/log/messages
var/log/secure

7.3推送

export RSYNC_PASSWORD=123456
rsync -avzP ${BACKUP}/ rsync_backup@172.16.1.41::backup

删除7天前文件

find ${BACKUP}/ -mtime +7 |xargs rm -rf

8.注意踩坑
我们的备份脚本最终会以定时任务的形式实现,而定时任务能识别的PATH变量有限,所以最好在脚本里添加PATH变量,或者脚本里命令写绝对路径。

7.4 服务端需求:

1.服务端部署 rsync,用于接收客户端推送过来的备份数据
2.服务端需要每天校验客户端推送过来的数据是否完整
3.服务端需要每天校验的结果通知给管理员
4.服务端仅保留 6 个月的备份数据,其余的全部删除
注意:所有服务器的备份目录必须都为/backup

7.5 服务端步骤:

服务端需要每天校验客户端推送过来的数据是否完整
1.要在客户端做
2.做一个标记,贴一个防撕贴
第一种

cd nfs_172.16.1.31_2019-07-23/ && md5sum log.tar.gz > md5.txt

第二种

md5sum log.tar.gz sys.tar.gz >md5.txt

第三种

md5sum *.tar.gz >md5.txt

实现命令:
1.客户端增加md5校验的步骤:

md5sum ${BACKUP}/${DEST}/*.tar.gz > ${BACKUP}/${DEST}/md5.txt

2.服务端校验命令:

find /backup/*_$(date +%F) -name "md5.txt"|xargs md5sum -c

服务端需要每天邮件校验的结果通知给管理员

1.安装配置mailx:

yum install mailx -y

2.邮件配置文件

[root@backup /server/scripts]# cat /etc/mail.rc 
set from=38867033@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=38867033@qq.com
set smtp-auth-password=xxxxxxxxSMTP授权码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/

3.服务端生成校验结果文件:

find /backup/*_$(date +%F) -name "md5.txt"|xargs md5sum -c >
/backup/check.txt

4.校验发送命令:

mail -s "check-rsync-$(date +%F)" 38867033@qq.com < /backup/check.txt

第八章 配置文件汇总

8.1 客户端脚本:

[root@nfs01 /server/scripts]# cat push_rsync.sh 
#!/bin/bash

#1.定义变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
Host=$(hostname)
Addr=$(ifconfig eth1|awk 'NR==2{print $2}')
Date=$(date +%F)
Dest=${Host}_${Addr}_${Date}
Path=/backup
#2.创建备份目录
[ -d $Path/$Dest ] || mkdir -p $Path/$Dest
#3.备份对应的文件
cd / && \
    [ -f $Path/$Dest/system.tar.gz ] || tar czf $Path/$Dest/system.tar.gz etc/fstab etc/rsyncd.conf && \
    [ -f $Path/$Dest/log.tar.gz ] || tar czf $Path/$Dest/log.tar.gz var/log/messages var/log/secure && \
#4.携带 md5 验证信息
[ -f $Path/$Dest/flag ] || md5sum $Path/$Dest/*.tar.gz >$Path/$Dest/flag_$Date
#5.推送本地数据至备份服务器
export RSYNC_PASSWORD=123456
rsync -avz $Path/ rsync_backup@172.16.1.41::backup
#6.本地保留最近 7 天的数据
find $Path/ -type d -mtime +7|xargs rm -rf

8.2 服务端脚本:

[root@backup /server/scripts]# cat check_backup.sh 
#!/bin/bash

#1.定义全局的变量
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#2.定义局部变量
Path=/backup
Date=$(date +%F)
#3.查看 flag 文件,并对该文件进行校验, 然后将校验的结果保存至 result_时间
find $Path/ -type f -name "flag_$Date"|xargs md5sum -c >$Path/result_${Date}
#4.将校验的结果发送邮件给管理员
mail -s "Rsync Backup $Date" 38867033@qq.com <$Path/result_${Date}
#5.删除超过 7 天的校验结果文件, 删除超过 180 天的备份数据文件
find $Path/ -type f -name "result*" -mtime +7|xargs rm -f
find $Path/ -type d -mtime +180|xargs rm -rf

8.3 服务端rsync配置文件

[root@backup /server/scripts]# cat /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 = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[backup]
comment = welcome to 123456edu backup!
path = /backup

[data]
path = /data

[player id='712292593' type='collect' autoplay='true'/]

返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码