rsync各种备份

rsync介绍

# 什么是rsync
	同步工具,把一台机器上的文件传输到另一台。rsync是一款开源、快速、多功能、可实现全量及增量的本地或远程数据同步备份的优秀工具。rsync软件适用于Unix/linux/Windows等多种操作系统平台。这个功能类似于ssh带的scp命令,但是又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝。当然,rsync还可以在本地主机的不同分区或目录之间全量及曾量的复制数据,这又类似cp命令。但是同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝

# rsync官方地址 [TP](https://rsync.samba.org/)
# rsync监听端口:873
# rsync运行模式:c/s

# rsync特性
支持拷贝特殊文件,如连接文件、设备等。
可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。
可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变 –p。
可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高(tar-N)。
可以使用rcp、rsh、ssh等方式来配合传输文件(rsync本身不对数据加密)。
可以通过socket(进程方式)传输文件和数据(服务端和客户端)*****。
支持匿名的活认证(无需系统用户)的进程模式传输,可以实现方便安全的进行数据备份和镜像。

## 远程copy,scp
scp 源文件 目标

# 推文件
scp /tmp/yum.log root@10.0.0.41:/root
# 推目录
scp -r /etc root@10.0.0.41:/root

# 拉文件
scp root@10.0.0.41:/root /tmp/yum.log
# 拉目录
scp -r root@10.0.0.41:/root /etc

ssh:22
ftp:21
rsync:873

C/S 架构:
Client/Server								# 客户端/服务器

B/S	
Browser/Server								# 浏览器/服务器

端口的范围:1-65535

小提示:利用rsync还可以实现删除文件和目录的功能,这又相当于rm命令,一个rsync相当于scp、cp、rm,但是还优于他们的每一个命令。

rsync备份类型

- 全量备份(支持):将产生的所有需要备份的文件或目录全部进行备份
- 增量备份(支持):基于上一次备份做的数据备份
- 差异备份(不支持差异备份):基于全量备份做的数据备份,也就是上一次如果也是差异,则可以直接将上一次备份删除

Rsync的传输模式

本地传输模式(类似命令cp)

# 语法
Local:  rsync [OPTION...] SRC... [DEST]
## 拷贝文件
[root@backup ~]# rsync /root/3 /usr/local/src/
## 拷贝目录
[root@backup ~]# rsync -a /etc /usr/local/src/

远程传输模式(类似命令scp)

  • 这种模式是借助SSH的通道进行传输(ssh端口)
## Access via remote shell:
	Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
	# 拉:rsync [选项...] 用户名@主机IP:路径 本地文件或目录
	[root@backup ~]# rsync -avz root@172.16.1.7:/etc/hostname /usr/local/games/
	
	Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
	# 推:rsync [选项...] 本地文件或目录 用户名@主机IP:路径
	[root@backup ~]# rsync -avz /backup/2020-05-06_web01_etc.tar.gz root@10.0.0.7:/tmp/
  • 权限不足报错
rsync: mkstemp "/root/.host_ip.sh.nrcrr0" failed: Permission denied (13)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [sender=3.1.2]

守护进程模式(服务)

## 语法:(不管是推还是拉都是在客户端的操作)
## Access via rsync daemon:(通过rsync守护进程访问)
# 拉:rsync [-avz] zls_bak@10.0.0.41::[模块] 源文件 目标
方法一:	Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]	
例如:(将备份服务器对应(zls)模块中的文件拉取到本地/tmp中)
rsync -avz zls_bak@10.0.0.41::zls /tmp --password-file=/etc/rsync.pass
方法二:    rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST](忘记它)
         
# 推:rsync [-avz] 源文件 zls_bak@10.0.0.41::[模块] 目标	
方法一:	Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
例如:(将本地文件推送到备份服务器(zls_bak)虚拟用户,指定模块(zls)的对应路径中)
rsync -avz /etc/shadow zls_bak@10.0.0.41::zls --password-file=/etc/rsync.pass
方法二:	rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST(忘记它)
          
     注意:推和拉的区别,就是源文件的位置在哪里,拉:源文件在后面。


## rsync 重要选项(通常使用-avz即可满足大部分需求)
-a           #归档模式传输, 等于-tropgDl
-v           #详细模式输出, 打印速率, 文件数量等
-z           #传输时进行压缩以提高效率
--delete     #让目标目录和源目录数据保持一致
--password-file=xxx #使用密码文件,这里指服务端保存在客户端的密码文件路径

------------------- -a 包含 ------------------
-r           #递归传输目录及子目录,即目录下得所有目录都同样传输。
-t           #保持文件时间信息
-o           #保持文件属主信息
-p           #保持文件权限
-g           #保持文件属组信息
-l           #保留软连接
-D           #保持设备文件信息
----------------------------------------------

-L           #保留软连接指向的目标文件
-e           #使用的信道协议,指定替代rsh的shell程序
--exclude=PATTERN   #指定排除不需要传输的文件模式
--exclude-from=file #文件名所在的目录文件
--bwlimit=100       #限速传输
--partial           #断点续传
--delete            #让目标目录和源目录数据保持一致
--password-file=xxx #使用密码文件

--delte实现无差异同步

# 1. 在服务端配置文件中多增加一个模块(写在/etc/rsyncd.conf文件结尾)
    [tcy]
    comment = xixi
    path = /tcy

# 2. 对应路径进行创建
    [root@backup /backup]# mkdir /tcy

# 3. 对路径修改权限
	[root@backup /backup]# chown -R rsync.rsync /tcy

# 4. 对服务重启
	[root@backup /backup]# systemctl restart rsyncd

# 5. 对服务端模块路径模拟创建文件
	[root@backup /backup]# cd /tcy
	[root@backup /tcy]# touch aaa
	[root@backup /tcy]# touch bbb

# 6. 客户端操作
	[root@nfs /]# export RSYNC_PASSWORD=123			
    # delete后面只能接目录并且需要将目录后接"/" 如:/etc/
    # 如将/etc/换成一个文件,则直接将文件备份到服务端中,不会对服务端其他文件产生影响
	[root@nfs /]# rsync -avz --delete /etc/ rsync_backup@172.16.1.41::tcy	
  • 同步文件,发现原本服务端文件会删除

Rsync的Limit限速

#企业案例: 某DBA使用rsync拉取备份数据时,由于文件过大导致内部交换机带宽被沾满,导致用户的请求无法响应
[root@nfs01 ~]# export RSYNC_PASSWORD=zls
[root@nfs01 ~]# rsync -avz --bwlimit=1 rsync_backup@172.16.1.41::backup/ /data/

rsync+inotify

  • 扩展rsync结合inotify实现实时同步(详细操作见博客园nfs章节)
# 存在理由
- inotify可对目录实时监控,当产生文件或目录时将作出相应操作,一般结合rsync使用

# 参数
-m 持续监控
-r 递归
-q 静默,仅打印时间信息
--timefmt 指定输出时间格式
--format 指定事件输出格式
%Xe 事件
%w 目录
%f 文件
-e 指定监控的事件
access 访问
modify 内容修改
attrib 属性修改
close_write 修改真实文件内容
open 打开
create 创建
delete 删除
umount 卸载

# 服务安装(对客户端安装)
yum -y install inotify-tools

# 命令测试
- 当/backup目录出现创建,修改,删除,修改属性,写入内容时,将在屏幕输出信息
/usr/bin/inotifywait  -mrq  --format '%Xe  %w  %f' -e create,modify,delete,attrib,close_write  /backup

# 书写脚本(监控目录,当发生变化则及时进行同步到备份服务器,脚本需要手动执行,脚本运行后就放后台处理了)
[root@backup ~]# vim rsyn-inotify.sh
#!/bin/bash
dir=/backup
/usr/bin/inotifywait  -mrq  --format '%w %f' -e create,delete,attrib,close_write  $dir | while read line;do
        cd  $dir  && rsync -az -R  --delete  .  rsync_backup@172.16.1.31::backup --password-file=/etc/rsync.passwd >/dev/null 2>&1
done  &

案例操作①

要求:

web01,web02 都是客户端

写脚本,每天晚上23:00备份,给etc目录打包,推送到backup服务器的/backup目录下

文件名:2020-05-06_web01_etc.tar.gz  2020-05-06_web02_etc.tar.gz
主机名 wanIP lanIP 角色
web01 10.0.0.7 172.16.1.7 客户端
web02 10.0.0.8 172.16.1.8 客户端
backup 10.0.0.41 172.16.1.41 服务端

安装服务端

服务端:我们把备份的文件放在谁磁盘上,谁就是服务端

# 1. 安装rsync
[root@backup ~]# yum install -y rsync
# 2.修改配置文件(一般来说是以.conf 或 .cnf 或 .cfg结尾)
[root@backup ~]# vim /etc/rsyncd.conf
## 指定进程启动uid
uid = rsync
## 指定进程启动gid
gid = rsync
## rsync服务的端口
port = 873
## 无需让rsync以root身份运行,允许接收文件的完整属性
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
#####################################
## 模块名
[zls]
## 注释,没啥用
comment = 123
## 备份的目录
path = /backup

# 3.根据配置文件内容,创建出来需要的用户,目录,密码文件...
# 3.1 创建用户
[root@backup ~]# useradd rsync -s /sbin/nologin -M
# 3.2 创建备份目录
[root@backup ~]# mkdir /backup
# 3.3 修改属组和属主
[root@backup ~]# chown -R rsync.rsync /backup/
# 3.4 创建用户名和密码存放的文件
[root@backup ~]# vim /etc/rsync.passwd
rsync_backup:123

# 3.5 修改密码文件的权限为600
[root@backup ~]# chmod 600 /etc/rsync.passwd

# 4.启动服务并且加入开机自启
[root@backup ~]# systemctl start rsyncd
[root@backup ~]# systemctl enable rsyncd

# 5.检测端口
[root@backup ~]# netstat -lntup|grep 873
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      18373/rsync         
tcp6       0      0 :::873                  :::*                    LISTEN      18373/rsync        
# 6.检测进程
[root@backup ~]# ps -ef|grep [r]sync
root      18373      1  0 20:48 ?        00:00:00 /usr/bin/rsync --daemon --no-detach

查看服务端端口是否开启

安装客户端

  • rsync客户端不用修改配置文件
# 1.安装rsync
[root@web01 ~]# yum install -y rsync
# 2.客户端需要创建一个密码文件
[root@web01 ~]# vim /etc/rsync.pass							# 密码是服务端存放的密码
123
# 3.修改密码文件的权限为600
[root@web01 ~]# chmod 600 /etc/rsync.pass 

# 4.从客户端往服务端推送重要备份文件
rsync [-avz] 源文件 zls_bak@10.0.0.41::[模块]
rsync -avz /etc/shadow rsync_backup@10.0.0.41::zls --password-file=/etc/rsync.pass

# 5.从客户端拉取重要备份文件
rsync -avz rsync_backup@10.0.0.41::zls /tmp/ --password-file=/etc/rsync.pass 

# 方式二:脚本中使用,强烈推荐方式
[root@nfs01 ~]# export RSYNC_PASSWORD=zls
  1. 客户端web02安装服务,(web01同样操作)

  2. 客户端新建一个文件,保存服务端连接的密码,(web01同样操作)

  3. 修改密码文件权限为600,(web01同样操作)

  4. 写脚本,内容为打包etc目录 为此格式:2020-05-06_web02_etc.tar.gz,然后进行推送到backup中,(web01同样操作)

  5. 书写定时任务,(web01同样操作),每晚23点执行此脚本

案例操作②

需求

# Rsync备份案例
使用3台服务器主机名分别为web01、backup 、nfs主机信息见下表:

角色	外网IP(WAN)	内网IP(LAN)	主机名
WEB	eth0:10.0.0.7	eth1:172.16.1.7	web01
NFS	eth0:10.0.0.31	eth1:172.16.1.31	nfs01
Rsync	eth0:10.0.0.41	eth1:172.16.1.41	backup

# 客户端需求
1.客户端提前准备存放的备份的目录,目录规则如下:/backup/nfs_172.16.1.31_2018-09-02 
2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至/backup/nfs_172.16.1.31_2018-09-02
3.客户端最后将备份的数据进行推送至备份服务器
4.客户端每天凌晨1点定时执行该脚本
5.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间

# 服务端需求
1.服务端部署rsync,用于接收客户端推送过来的备份数据
2.服务端需要每天校验客户端推送过来的数据是否完整
3.服务端需要每天校验的结果通知给管理员
4.服务端仅保留6个月的备份数据,其余的全部删除

总流程

0. 准备客户端和服务端机器
1. 在客户端和服务端均安装rsync服务,在服务端安装mailx服务
	· 将rsync和mailx的配置文件均进行对应修改
2. 客户端编写脚本,内容如下:(每个步骤都需在命令行进行测试)
	· 准备存放备份的目录,按要求修改目录名称
	· 将备份文件打包至方才创建目录底下,打包文件命名格式为:主机名_ip_时间_包名.tar.gz
	· 使用md5方式对备份文件生成校验码和备份文件一起保存在备份目录中
	· 推送备份文件和md5文件至服务端
	· 只为本地保留7天数据,使用find进行删除7天前数据
3. 服务端编写脚本,内容如下:(每个步骤都需在命令行进行测试)
	· 对推送文件进行效验
	· 将效验结果通过邮件发送给管理员
	· 查找备份目录中6个月之前的数据进行删除
4. 分别对客户端和服务端书写定时任务(首先用每分钟执行一次定时任务对脚本进行测试)
	· 客户端在晚上23点执行
	· 服务端在晚上23点零2分执行(因需要等客户端备份文件推送过来)
5. 修改当前时间,测试定时任务

总流程细节化

0 .准备环境

角色 外网IP(WAN) 内网IP(LAN) 主机名
WEB eth0:10.0.0.7 eth1:172.16.1.7 web01
NFS eth0:10.0.0.31 eth1:172.16.1.31 nfs01
Rsync eth0:10.0.0.41 eth1:172.16.1.41 backup

1.安装服务,修改配置文件

# 1. 客户端和服务端三台机器都安装rsync服务,服务端安装mailx服务
	[root@nfs ~]# yum install -y rsync
	[root@backup ~]# yum install -y rsync
	[root@web01 ~]# yum install -y rsync
	[root@backup ~]# yum install -y mailx

# 2. 对服务端配置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


# 3. 根据配置文件在backup中创建对应目录和应用等其他信息并启动服务
	[root@backup ~]# useradd rsync -s /sbin/nologin -M
	[root@backup ~]# mkdir /backup
	[root@backup ~]# chown -R rsync.rsync /backup/
	[root@backup ~]# vim /etc/rsync.passwd
	rsync_backup:123
	[root@backup ~]# chmod 600 /etc/rsync.passwd
	[root@backup ~/.certs]# systemctl start rsyncd
	[root@backup ~]# systemctl enable rsyncd


# 4. 修改mailx配置文件
	[root@backup ~]# vim /etc/mail.rc 					# 在配置文件最末尾写入以下内容
	set from=1213261357@qq.com
    #邮件服务器
    set smtp=smtp.qq.com
    #发件人用户名
    set smtp-auth-user=1213261357@qq.com
    #发件人密码(QQ邮箱不可以使用密码,只能使用授权码)
    set smtp-auth-password=kvbjogkbhirwjcfg
    #登录方式
    set smtp-auth=login
    #邮件服务器协议及端口
    set smtp=smtps://smtp.qq.com:465
    #忽略证书
    set ssl-verify=ignore
    #指定证书位置
    set nss-config-dir=/root/.certs
    
# 5. 根据mailx配置文件,创建对应证书目录并获取证书
	[root@backup ~]# mkdir -p /root/.certs
	[root@backup ~]# cd /root/.certs
	[root@backup ~]#echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN 			CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt
	[root@backup ~]#certutil -A -n "GeoTrust SSL CA" -t "C,,"  -d  ~/.certs  -i  ~/.certs/qq.crt
	[root@backup ~]#certutil -A -n "GeoTrust Global CA" -t "C,,"  -d  ~/.certs  -i  			~/.certs/qq.crt
	[root@backup ~]#certutil -L -d /root/.certs
	[root@backup ~]#certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ~/.certs -i 	~/.certs/qq.crt

# 6. 发送一封测试邮件到自己邮箱,看邮件服务器是否有搭建成功
 	[root@backup ~/.certs]# echo '123'|mail -s '大哥的测试邮件' 1213261357@qq.com
  • 查看qq邮箱是否收到邮件

2.客户端编写脚本

# 1.在客户端nfs主机中编写脚本
    [root@nfs /]# vim /rsync_backup.sh 
    # 根据命令或者路径书写变量
    back_dir="/backup"
    NAME=$(/usr/bin/hostname)
    IP=$(/usr/bin/hostname -I|awk '{print $2}')
    DATE=$(date +%F)
    ALL="$back_dir/${NAME}_${IP}_${DATE}/${NAME}_${IP}_${DATE}_etc.tar.gz"

    # 创建备份文件,首先判断是否存在,不存在则创建
    if [ ! -d $back_dir/${NAME}_${IP}_${DATE} ];then
            mkdir -p $back_dir/${NAME}_${IP}_${DATE}
    fi

    # 打包/etc目录到上一步创建目录中
    cd $back_dir/${NAME}_${IP}_${DATE} && \
    tar zcf ${NAME}_${IP}_${DATE}_etc.tar.gz /etc &>/dev/null

    # 为客户端rsync密码配置环境变量
    export RSYNC_PASSWORD=123

    # 生成MD5效验码
    md5sum $ALL > $back_dir/${NAME}_${IP}_${DATE}/pass.txt


    # 推送到备份服务器中
    rsync -az $back_dir/${NAME}_${IP}_${DATE} rsync_backup@172.16.1.41::backup

    # 保留最近7天的数据
    find $back_dir -type d ! -mtime -7 |xargs rm -rf

# 2. 将nfs脚本发送到web01
	[root@nfs /]# scp rsync_backup.sh 10.0.0.7:/

# 3. 在web01中进行脚本测试
	[root@web01 /]# sh rsync_backup.sh 

  • 查看手动执行脚本是否成功

3.服务端编写脚本

# 1. 服务端编写脚本文件
    [root@backup /]# vim md5.sh 
    # 根据命令或者路径书写变量
    back_dir="/backup"
    NAME=$(/usr/bin/hostname)
    IP=$(/usr/bin/hostname -I|awk '{print $2}')
    DATE=$(date +%F)
    ALL="$back_dir/${NAME}_${IP}_${DATE}/${NAME}_${IP}_${DATE}_etc.tar.gz"

    # 对校验码文件进行效验,并且将结果通过邮件服务器发送到自己邮箱
    md5sum -c `find ${back_dir}/*_${DATE}/ -type f -name '*.txt'` \
    |mail -s "${NAME}_${IP}_${DATE}校验" 1213261357@qq.com

    # 将半年前的文件进行删除
    find ${back_dir} -type d ! -mtime -182 ! -name 'backup'|xargs rm -rf

# 2. 手动执行备份文件查看效果
	[root@backup /]# sh md5.sh 
  • 手动执行脚本结果

4.编写定时任务

#1. 服务器定时任务
    [root@backup /]# crontab -l
    # backup和web校验码发送邮件 by:tcy
    01 23 * * * /usr/bin/sh /md5.sh &>/dev/null
#2. 客户端定时任务(两台客户端均需操作)
	[root@nfs /]# crontab -l
	# 定时对当天数据进行备份,并推送到服务端 by:tcy
	00 23 * * * /usr/bin/sh /rsync_backup.sh &>/dev/null
  1. 测试定时任务

  • 三台主机同时修改当前时间(可利用xshell同时对三台操作)

     date -s '2020-05-01  22:59:50' && tail -f /var/log/cron 
    

  • 收到邮件

  • 查看邮件内容

posted @ 2020-05-06 21:52  元气少女郭德纲!!  阅读(521)  评论(0编辑  收藏  举报