rsync 软件介绍
rsync是一款开源、快速、多功能、可实现全量及增量的本地或远程数据同步备份的优秀工具。rsync软件适用于Unix/linux/Windows等多种操作系统平台。
rsync官方地址:https://rsync.samba.org/
rsync默认监听端口:873
rsync运行模式:C/S
rsync本身不对数据加密
- 实现本地备份传输数据(在本地对目录传输要加参数)
[root@backup ~]# cp -a /etc/hosts /tmp/
[root@backup ~]# ls /tmp/hosts
[root@backup ~]# \rm /tmp/hosts
[root@backup ~]# rsync /etc/hosts /tmp/
[root@backup ~]# ls /tmp/hosts
/tmp/hosts
- 远程备份传输数据
[root@backup ~]# ls /tmp/hosts
/tmp/hosts
[root@backup ~]# scp -rp /etc/hosts 10.0.0.31:/tmp/
The authenticity of host ‘10.0.0.31 (10.0.0.31)’ can’t be established.
RSA key fingerprint is d3:41:bb:0d:43:88:da:a3:2c:e8:36:91:11:c9:e4:9c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘10.0.0.31’ (RSA) to the list of known hosts.
root@10.0.0.31’s password:
hosts
[root@backup ~]# rsync -rp /etc/hosts 10.0.0.31:/tmp/
root@10.0.0.31’s password:
- 实现无差异同步备份(跟源文件保持一致)
[root@backup znix]# ll
total 4
-rw-r–r-- 1 root root 357 Oct 11 15:21 hosts
[root@backup ~]# mkdir /null
root@backup ~]# rsync -a == --delete == /null/ /znix/
[root@backup ~]# ll /znix/
total 0
-本地文件信息查看
[root@backup ~]# ls -l install.log
-rw-r–r--. 1 root root 21736 Sep 25 08:38 install.log
[root@backup ~]# rsync install.log
-rw-r–r-- 21736 2017/09/25 08:38:28 install.log
- 可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能( tar zcvf backup_1.tar.gz /opt/data -exclude=man )
[root@tecmint]# rsync -avze ssh --include ‘R*’ --exclude ‘*’ root@192.168.0.101:/var/lib/rpm/ /root/rpm
- 使用==–exclude和–include==
传输R开头的文件、目录,派出其他情况的文件、目录
root@192.168.0.101’s password:
receiving incremental file list
created directory /root/rpm
./
Requirename
Requireversion
sent 67 bytes received 167289 bytes 7438.04 bytes/sec
total size is 434176 speedup is 2.59
-
–max-size用于限制传输时文件的大小,只有≤max-size的文件才会被传输
[root@tecmint]# rsync -avzhe ssh --max-size=‘200k’ /var/lib/rpm/
[root@tecmint]# rsync –remove-source-files -zvh backup.tar /tmp/backups/
[root@tecmint]# ll backup.tar
ls: backup.tar: No such file or directory
- 如果你对rsync不熟悉,贸然使用rsync可能会搞乱对端文件、目录。借助–dry-run可以让你知道会传输些什么东西,但实际上并没有传输任何东西。如果输出结果与你的预期吻合,可以去掉–dry-run,进行实际的传输工作。
root@tecmint]# rsync –dry-run --remove-source-files -zvh backup.tar /tmp/backups/
backup.tar
sent 35 bytes received 15 bytes 100.00 bytes/sec
total size is 16.18M speedup is 323584.00 (DRY RUN)
- 使用==–bwlimit==可以设置同步时网络带宽上限
[root@tecmint]# rsync --bwlimit=100 -avzhe ssh /var/lib/rpm/ root@192.168.0.100:/root/tmprpm/
root@192.168.0.100’s password:
sending incremental file list
sent 324 bytes received 12 bytes 61.09 bytes/sec
total size is 38.08M speedup is 113347.05
- rsync由于采用远程更新协议( remote-update protocol ),默认是同步变化的字节或块。使用==-W==可以取消这种机制,整个文件同步
[root@tecmint]# rsync -zvhW backup.tar /tmp/backups/backup.tar
backup.tar
sent 14.71M bytes received 31 bytes 3.27M bytes/sec
total size is 16.18M speedup is 1.10
- 注意:
/tmp --表示将tmp目录本身及目录下的内容进行传输
/tmp/ --表示只传输tmp目录下面的内容信息
备份类型
完全备份
就是指对某一个时间点上的所有数据或应用进行的一个完全拷贝。实际应用中就是用一盘磁带对整个系统进行完全备份,包括其中的系统和所有数据。
增量备份
指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加和者被修改的文件;这就意味着,第一次增量备份的对象是进行全备后所产生的增加和修改的文件;第二次增量备份的对象是进行第一次增量备份后所产生的增加和修改的文件,如此类推。
差异备份: 在全备的基础上,对新增的数据进行备份。
Rsync传输模式
本地方式(类似于使用cp命令,但请注意,虽然rsync和cp能达到相同的目的,但它们的实现方式是不一样的)
远程方式(通过网络传输)
守护进程(运行一个服务一直在后台)
参数
-a #归档模式传输, 等于-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守护进程方式(需要有服务端与客户端)
规划:
1、backup服务器作为rsync服务端
2、以rysnc客户端作为参照物,将数据推到rsync服务器上
配置rsync服务端(将服务端配置到 backup 服务器上)
检测软件是否存在
3.进行软件服务配置
4.创建rsync用户
5.创建数据备份储存目录,目录修改属主
6.创建认证用户密码文件
7.启动rsync服
rsync --daemon
至此服务端配置完成
配置rsync客户端(其他服务器为客户端)
1.软件是否存在
2.创建认证文件
客户端的认证文件只需要有密码即可
3.实现数据传输
交互式:
免交互式:
rsync 命令同步参数选项&特殊参数
目录参数 |
参数说明 |
-v,–verbose |
详细模式输出,传输时的信息 |
-z,–compress |
传输时进行压缩以提高传输效率–compress-level=NUM 可按级别压缩局域网可以不用压缩 |
-a,–archive (主要) |
归档模式,表示以递归方式传输文件,并保持文件属性。等于-rtopgDl |
-r,–recursive 归档于-a |
对子目录以递归模式,即目录下的所有目录都同样传输。小写r |
-t,–times 归档于-a |
保持文件时间信息 |
-o,–owner 归档于-a |
保持文件属主信息 |
-p,–perms 归档于-a |
保持文件权限 |
-g,–group 归档于-a |
保持文件属组信息 |
-P,–progress |
显示同步的过程及传输时的进度等信息(大P) |
-D,–devices 归档于-a |
保持设备文件信息 |
-l,–links 归档于-a |
保留软连接(小写字母l) |
-e,–rsh=COMMAND |
使用的信道协议(remote shell),指定替代rsh的shell程序。例如 ssh |
–exclude-from=file |
文件名所在目录文件,即可以实现排除多个文件 |
–bwlimit=RATE |
限速功能 |
实例:
指定IP
指定配置文件路径:
服务端指定服务端口:
定义变量信息实现免秘钥交互
通过man 手册获得方法:
Some modules on the remote daemon may require authentication. If so, you will receive a password prompt when you connect. You can avoid the password prompt by setting the environment variable RSYNC_PASSWORD to the password you want to use or using the --password-file option. This may be useful when scripting rsync.
WARNING: On some systems environment variables are visible to all users. On those systems using --password-file is recommended.
rsync服务端多模块配置实践
只能有一个虚拟用户
== 第一个历程:编写rsync服务端配置文件 添加多模块==
[backup]
comment = “backup dir by oldboy”
path = /backup
[backupdba]
comment = “backup dir by oldboy”
path = /backupdba
[backupdev]
comment = “backup dir by oldboy”
path = /backupdev
第二个历程:rsync服务端创建备份目录
服务端:
命令:
mkdir /{backupdev,backupdba,backupsa}
chown -R rsync.rsync /{backupdev,backupdba,backupsa}
ll -d /{backupdev,backupdba,backupsa}
[root@backup ~]# mkdir /backupdba
[root@backup ~]# mkdir /backupsa
[root@backup ~]# mkdir /backupdev
[root@backup ~]# chown -R rsync.rsync /backupdba
[root@backup ~]# chown -R rsync.rsync /backupsa
[root@backup ~]# chown -R rsync.rsync /backupdev
第三个历程:重启rsync服务
分步式:
killall rsync 杀掉进程
rsync --daemon 重启服务
一键式:
killall rsync;sleep 3;rsync --daemon — 服务重启脚本中的命令
[root@backup ~]# killall rsync;sleep 2; rsync --daemon
第四个历程:进行测试
[root@nfs01 ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backupdba --password-file=/etc/rsync.password
sending incremental file list
hosts
sent 202 bytes received 27 bytes 458.00 bytes/sec
total size is 379 speedup is 1.66
[root@nfs01 ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backupsa --password-file=/etc/rsync.password
sending incremental file list
hosts
sent 202 bytes received 27 bytes 458.00 bytes/sec
total size is 379 speedup is 1.66
[root@nfs01 ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backupdev --password-file=/etc/rsync.password
sending incremental file list
hosts
sent 202 bytes received 27 bytes 458.00 bytes/sec
total size is 379 speedup is 1.66
注意:此处是copy到一个目录下的子目录;注意要逐层创建,如果backupdev/1/2 必须要建立在backupdev/1/有的前提下
[root@nfs01 ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backupdev/1/ --password-file=/etc/rsync.password
sending incremental file list
created directory 1
hosts
sent 202 bytes received 27 bytes 152.67 bytes/sec
total size is 379 speedup is 1.66
[root@backup ~]# ls /backup*
/backup:
history
/backupdba:
hosts
/backupdev:
1 hosts
/backupsa:
hosts
3. rsync服务端自动创建目录信息
[root@nfs01 ~]# rsync -avz /etc/hosts rsync_backup@172.16.1.41::backupdev/1/ --password-file=/etc/rsync.password
sending incremental file list
created directory 1
hosts
sent 200 bytes received 27 bytes 454.00 bytes/sec
total size is 379 speedup is 1.67
强调:不能创建多级目录;
注意:此处是copy到一个目录下的子目录;注意要逐层创建,如果backupdev/1/2 必须要建立在backupdev/1/有的前提下
Rsync服务实践
主机角色 |
外围IP(NAT) |
内网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 data]# rpm -qa rsync #使用命令rpm -qa rsync
rsync-3.1.2-6.el7_6.1.x86_64
[root@mumu ~]# yum install -y rsync
- 配置Rsync配置文件 /etc/rsyncd.conf
uid = rsync # 运行进程的用户
gid = rsync # 运行进程的用户组
port = 873 # 监听端口
fake super = yes # 无需让rsync以root身份运行,允许接收文件的完整属性
use chroot = no # 禁锢推送的数据至某个目录, 不允许跳出该目录
max connections = 200 # 最大连接数
timeout = 600 # 超时时间
ignore errors # 忽略错误信息
read only = false # 对备份数据可读写
list = false # 不允许查看模块信息
auth users = rsync_backup # 定义虚拟用户,作为连接认证用户
secrets file = /etc/rsync.passwd # 定义rsync服务用户连接认证密码文件路径
[backup] # 定义模块信息
comment = commit # 模块注释信息
path = /backup # 定义接收备份数据目录
[root@backup ~]# useradd rsync -M -s /sbin/nologin
[root@backup ~]# id rsync
uid=1000(rsync) gid=1000(rsync) groups=1000(rsync)
[root@backup ~]# mkdir /backup
[root@backup ~]# ll -d /backup
[root@backup ~]# chown -R rsync.rsync /backup/ #把属主、属组修改为rsync
[root@backup ~]# ll -d /backup/
drwxr-xr-x 3 rsync rsync 37 Jul 16 15:30 /backup/
- 创建密码文件,在密码文件中写入对应的虚拟用户以及虚拟用户的密码
/etc/rsync.passwd---> rsync虚拟用户以及rsync虚拟用户的密码
[root@backup ~]# echo "rsync_backup:123456" > /etc/rsync.passwd
[root@backup ~]# cat /etc/rsync.passwd
rsync_backup:123456
[root@backup ~]# ll /etc/rsync.passwd
-rw-r--r-- 1 root root 20 Jul 16 16:31 /etc/rsync.passwd
[root@backup ~]# chmod 600 /etc/rsync.passwd #设置权限为:仅属主可读可写
[root@backup /]# ll /etc/rsync.passwd
-rw------- 1 root root 20 Jul 16 16:31 /etc/rsync.passwd
[root@backup ~]# systemctl start rsyncd.service
[root@backup ~]# systemctl enable rsyncd
[root@backup /]# netstat -lntp #检查rsync的873端口是否存在
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN
8472/rsync
客户端
- 在客户端的服务器上编辑密码文件,输入密码为:123
[root@nfs ~]# echo "123456" > /etc/rsync.passwd
[root@nfs ~]# cat /etc/rsync.passwd
123456
[root@nfs ~]# ll /etc/rsync.passwd
-rw-r--r-- 1 root root 7 Jul 16 16:53 /etc/rsync.passwd
[root@nfs ~]# chmod 600 /etc/rsync.passwd #设置权限位:仅属主可读可写
[root@nfs ~]# ll /etc/rsync.passwd
-rw------- 1 root root 7 Jul 16 16:53 /etc/rsync.passwd
[root@nfs ~]# rsync -avz /etc/ rsync_backup@172.16.1.41::backup #推送/etc/下面的内容
[root@nfs ~]# rsync -avz /etc rsync_backup@172.16.1.41::backup #推送/etc这个目录
[root@nfs ~]# rsync -avz rsync_backup@172.16.1.41::backup /opt
拉取服务端172.16.1.41的backup目录下面的所有内容至本地的 /opt目录
Rsync无差异同步
推送方式实现无差异
客户端:
[root@nfs nfs]# pwd
/nfs
[root@nfs nfs]# ll service/
total 0
-rw-r--r-- 1 root root 0 Jul 16 18:04 111
-rw-r--r-- 1 root root 0 Jul 16 18:02 222
-rw-r--r-- 1 root root 0 Jul 16 18:02 333
[root@nfs nfs]# rsync -avz ./service rsync_backup@172.16.1.41::backup
Password:
sending incremental file list
service/
service/111
service/222
service/333
sent 232 bytes received 85 bytes 126.80 bytes/sec
total size is 0 speedup is 0.00
[root@nfs nfs]#
服务端:
[root@backup backup]# pwd
/backup
[root@backup backup]# ll
total 0
drwxr-xr-x 2 rsync rsync 39 Jul 16 18:04 service
[root@backup backup]# ll service/
total 0
-rw-r--r-- 1 rsync rsync 0 Jul 16 18:04 111
-rw-r--r-- 1 rsync rsync 0 Jul 16 18:02 222
-rw-r--r-- 1 rsync rsync 0 Jul 16 18:02 333
[root@backup backup]#
客户端:
[root@nfs nfs]# rm -rf service/111
[root@nfs nfs]# ll service/
total 0
-rw-r--r-- 1 root root 0 Jul 16 18:02 222
-rw-r--r-- 1 root root 0 Jul 16 18:02 333
[root@nfs nfs]#rsync -avz --delete ./service rsync_backup@172.16.1.41::backup
Password:
sending incremental file list
deleting service/111
service/
sent 106 bytes received 43 bytes 59.60 bytes/sec
total size is 0 speedup is 0.00
[root@nfs nfs]#
服务端:
[root@backup backup]# ll service/
total 0
-rw-r--r-- 1 rsync rsync 0 Jul 16 18:02 222
-rw-r--r-- 1 rsync rsync 0 Jul 16 18:02 333
[root@backup backup]#
拉取方式实现无差异
服务端:
[root@backup backup]# ll service/
total 0
-rw-r--r-- 1 root root 0 Jul 16 18:20 111
-rw-r--r-- 1 root root 0 Jul 16 18:20 222
-rw-r--r-- 1 root root 0 Jul 16 18:20 333
-rw-r--r-- 1 root root 0 Jul 16 18:20 444
[root@backup backup]#
客户端:
[root@nfs nfs]# ll service/
total 0
[root@nfs nfs]# rsync -avz rsync_backup@172.16.1.41::backup ./
Password:
receiving incremental file list
service/
service/111
service/222
service/333
service/444
sent 108 bytes received 310 bytes 167.20 bytes/sec
total size is 0 speedup is 0.00
[root@nfs nfs]# ll service/
total 0
-rw-r--r-- 1 root root 0 Jul 16 18:20 111
-rw-r--r-- 1 root root 0 Jul 16 18:20 222
-rw-r--r-- 1 root root 0 Jul 16 18:20 333
-rw-r--r-- 1 root root 0 Jul 16 18:20 444
[root@nfs nfs]#
服务端:
[root@backup backup]# rm -rf service/111
[root@backup backup]# rm -rf service/222
[root@backup backup]# ll service/
total 0
-rw-r--r-- 1 root root 0 Jul 16 18:20 333
-rw-r--r-- 1 root root 0 Jul 16 18:20 444
[root@backup backup]#
客户端:
[root@nfs nfs]# rsync -avz --delete rsync_backup@172.16.1.41::backup ./
Password:
receiving incremental file list
deleting service/222
deleting service/111
sent 25 bytes received 133 bytes 63.20 bytes/sec
total size is 0 speedup is 0.00
[root@nfs nfs]# ll service/
total 0
-rw-r--r-- 1 root root 0 Jul 16 18:20 333
-rw-r--r-- 1 root root 0 Jul 16 18:20 444
[root@nfs nfs]#
Rsync传输限速
对传输时候进行限速:
[root@nfs ~]# dd if=/dev/zero of=./size.disk bs=1M count=500 生成大文件
限制传输的速率为1MB
[root@nfs ~]# rsync -avzP --bwlimit=1 ./size.disk rsync_backup@172.16.1.41::backup
Password:
sending incremental file list
size.disk
118,358,016 22% 1.01MB/s 0:06:33
rsync参数:-avz
-a #归档模式传输, 等于-tropgDl
-v #详细模式输出, 打印速率, 文件数量等
-z #传输时进行压缩以提高效率
-r #递归传输目录及子目录,即目录下得所有目录都同样传输。
-t #保持文件时间信息
-o #保持文件属主信息
-p #保持文件权限
-g #保持文件属组信息
-l #保留软连接
-P #显示同步的过程及传输时的进度等信息
-D #保持设备文件信息
-L #保留软连接指向的目标文件
-e #使用的信道协议,指定替代rsh的shell程序 ssh
--exclude=PATTERN #指定排除不需要传输的文件模式
--exclude-from=file #文件名所在的目录文件
--bwlimit=100 #限速传输
--partial #断点续传
--delete #让目标目录和源目录数据保持一致
Rsync备份案例
已知3台服务器主机名分别为 web01、backup、nfs 主机信息如下:
主机角色 |
外网IP(NAT) |
内网(LAN) |
主机名称 |
WEB |
10.0.0.7 |
172.16.1.7 |
web01 |
NFS |
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_2019-07-17
2、客户端在本地打包备份(系统配置文件、应用配置文件等)拷贝至/backup/nfs_172.16.1.31_2019-07-17
3、客户端最后将备份的数据进行推送至备份服务器
4、客户端每天凌晨一点定时执行该脚本
5、客户端服务器本地保留最近7天的数据,避免磁盘浪费空间
服务端
1、服务端部署rsync,用于接收客户端推送过来的备份数据
2、服务器需要每天管理员校验客户端推送过来的数据是否完整
3、服务端每天校验结果给管理员
4、服务端仅保留6个月的备份数据,其余的全部删除
客户端
#目录格式为 "主机名_ip_当天日期"
[root@nfs ~]# hostname #主机名获取
nfs
[root@nfs ~]# ifconfig eth1 | awk 'NR==2 {print $2}' #本机ip获取
172.16.1.31
[root@nfs ~]# date +%F #当天日期获取
2019-07-17
#获取指定格式的目录名称:
[root@nfs ~]# echo `hostname`_`ifconfig eth1 | awk 'NR==2 {print $2}'`_`date +%F`
nfs_172.16.1.31_2019-07-17
#或者
[root@nfs ~]# echo $(hostname)_$(ifconfig eth1 | awk 'NR==2 {print $2}')_$(date +%F)
nfs_172.16.1.31_2019-07-17
[root@nfs ~]#
#创建指定格式的目录:
[root@nfs ~]# mkdir /backup/`hostname`_`ifconfig eth1 | awk 'NR==2 {print $2}'`_`date +%F`
[root@nfs ~]# ll /backup/
total 0
drwxr-xr-x 2 root root 6 Jul 17 17:20 nfs_172.16.1.31_2019-07-17
#或者
[root@nfs ~]# rm -rf /backup/*
[root@nfs ~]# ll /backup/
total 0
[root@nfs ~]# mkdir -p /backup/$(hostname)_$(ifconfig eth1 | awk 'NR==2 {print $2}')_$(date +%F)
[root@nfs ~]# ll /backup/
total 0
drwxr-xr-x 2 root root 6 Jul 17 17:21 nfs_172.16.1.31_2019-07-17
[root@nfs ~]#
[root@nfs ~]# cp -ar /etc/fstab /var/spool/cron/ /tmp/yum.log /backup/nfs_172.16.1.31_2019-07-17
[root@nfs ~]# ll /backup/nfs_172.16.1.31_2019-07-17/
total 4
drwx------. 2 root root 6 Apr 11 2018 cron
-rw-r--r--. 1 root root 501 Jul 13 10:45 fstab
-rw-------. 1 root root 0 Jul 13 10:45 yum.log
[root@nfs ~]# rsync -avz /backup/nfs_172.16.1.31_2019-07-17 rsync_backup@172.16.1.41::backup
Password:
sending incremental file list
nfs_172.16.1.31_2019-07-17/
nfs_172.16.1.31_2019-07-17/fstab
nfs_172.16.1.31_2019-07-17/sys.tar.gz
nfs_172.16.1.31_2019-07-17/yum.log
nfs_172.16.1.31_2019-07-17/cron/
sent 1,062 bytes received 93 bytes 256.67 bytes/sec
total size is 958 speedup is 0.83
[root@nfs ~]#
#将前几步写成脚本
[root@nfs ~]# cat /server/scripts/client_push_data.sh
#!/bin/bash
mkdir /backup/`hostname`_`ifconfig eth1 | awk 'NR==2 {print $2}'`_`date +%F`
cp -ar /etc/fstab /var/spool/cron/ /tmp/yum.log /backup/nfs_172.16.1.31_2019-07-17
export RSYNC_PASSWORD=123456
rsync -avz /backup/nfs_172.16.1.31_2019-07-17 rsync_backup@172.16.1.41::backup
[root@nfs ~]# crontab -l
#每天凌晨一点推送数据
00 01 * * * /bin/bash /server/scripts/client_push_data.sh
#数据太少,生成30天的文件
[root@nfs ~]# for i in {1..30};do date -s 2018/12/$i;sh /server/scripts/client_push_data.sh ;done
[root@nfs ~]# ls /backup/
nfs_172.16.1.31_2018-12-01 nfs_172.16.1.31_2018-12-12 nfs_172.16.1.31_2018-12-23
nfs_172.16.1.31_2018-12-02 nfs_172.16.1.31_2018-12-13 nfs_172.16.1.31_2018-12-24
nfs_172.16.1.31_2018-12-03 nfs_172.16.1.31_2018-12-14 nfs_172.16.1.31_2018-12-25
nfs_172.16.1.31_2018-12-04 nfs_172.16.1.31_2018-12-15 nfs_172.16.1.31_2018-12-26
nfs_172.16.1.31_2018-12-05 nfs_172.16.1.31_2018-12-16 nfs_172.16.1.31_2018-12-27
nfs_172.16.1.31_2018-12-06 nfs_172.16.1.31_2018-12-17 nfs_172.16.1.31_2018-12-28
nfs_172.16.1.31_2018-12-07 nfs_172.16.1.31_2018-12-18 nfs_172.16.1.31_2018-12-29
nfs_172.16.1.31_2018-12-08 nfs_172.16.1.31_2018-12-19 nfs_172.16.1.31_2018-12-30
nfs_172.16.1.31_2018-12-09 nfs_172.16.1.31_2018-12-20 nfs_172.16.1.31_2019-07-17
nfs_172.16.1.31_2018-12-10 nfs_172.16.1.31_2018-12-21
nfs_172.16.1.31_2018-12-11 nfs_172.16.1.31_2018-12-22
[root@nfs ~]# find /backup/ -type d -mtime +7 | xargs rm -rf
[root@nfs ~]# ls /backup/
nfs_172.16.1.31_2018-12-23 nfs_172.16.1.31_2018-12-26 nfs_172.16.1.31_2018-12-29
nfs_172.16.1.31_2018-12-24 nfs_172.16.1.31_2018-12-27 nfs_172.16.1.31_2018-12-30
nfs_172.16.1.31_2018-12-25 nfs_172.16.1.31_2018-12-28 nfs_172.16.1.31_2019-07-17
#md5sum只能针对文件做标记
[root@nfs ~]# tar zcf /backup/nfs_172.16.1.31_2019-07-17/sys.tar.gz /etc/fstab /var/spool/cron/ /tmp/yum.log
[root@nfs ~]# ll /backup/nfs_172.16.1.31_2019-07-17/
total 8
drwx------. 2 root root 18 Jul 17 20:16 cron
-rw-r--r--. 1 root root 501 Jul 13 10:45 fstab
-rw-r--r-- 1 root root 544 Jul 17 21:29 sys.tar.gz
-rw-------. 1 root root 0 Jul 13 10:45 yum.log
[root@nfs ~]# md5sum /backup/nfs_172.16.1.31_2019-07-17/sys.tar.gz > /backup/nfs_172.16.1.31_2019-07-17/flag_2019-07-17
[root@nfs ~]# ll /backup/nfs_172.16.1.31_2019-07-17/
total 12
drwx------. 2 root root 18 Jul 17 20:16 cron
-rw-r--r-- 1 root root 80 Jul 17 21:32 flag_2019-07-17
-rw-r--r--. 1 root root 501 Jul 13 10:45 fstab
-rw-r--r-- 1 root root 544 Jul 17 21:29 sys.tar.gz
-rw-------. 1 root root 0 Jul 13 10:45 yum.log
md5sum -c /backup/nfs_172.16.1.31_2019-07-17/flag_2019-07-17
/backup/nfs_172.16.1.31_2019-07-17/sys.tar.gz: OK
#!/bin/bash
#1.定义变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
SRC=/backup
HOST=$(hostname)
ADDR=$(ifconfig eth1|awk 'NR==2 {print $2}')
DATE=$(date +%F)
DEST=${HOST}_${ADDR}_${DATE}
#2.创建目录
mkdir -p $SRC/$DEST
#3.备份文件
cd / && \
[ -f $SRC/$DEST/sys.tar.gz ] || tar czf $SRC/$DEST/sys.tar.gz etc/fstab etc/passwd && \
[ -f $SRC/$DEST/other.tar.gz ] || tar czf $SRC/$DEST/other.tar.gz var/spool/cron/ server/scripts && \
#4.使用md5sum做标记
[ -f $SRC/$DEST/flag_$DATE ] || md5sum $SRC/$DEST/*.tar.gz > $SRC/$DEST/flag_$DATE
#5.本地推送到备份服务器
export RSYNC_PASSWORD=123456
rsync -avz $SRC/$DEST rsync_backup@172.16.1.41::backup
#6.保留最近七天数据
find $SRC/ -type d -mtime +7|xargs rm -rf
服务端
[root@nfs ~]# md5sum -c nfs_172.16.1.31_2019-07-17/flag_2019-07-17
/backup/nfs_172.16.1.31_2019-07-17/other.tar.gz: OK
/backup/nfs_172.16.1.31_2019-07-17/sys.tar.gz: OK
[root@backup ~]# yum install mailx -y
[root@backup ~]# vim /etc/mail.rc
set from=123@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=123@qq.com
set smtp-auth-password=客户端授权码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
#验证发送邮件
[root@backup ~]# mail -s "数据备份校验结果" 1240206455@qq.com < backup/result_2019-07-18
#!/bin/bash
#1.定义变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
SRC=/backup
DATE=$(date +%F)
#2.使用md5sum进行校验,并保存校验结果
md5sum -c $SRC/*_$DATE/flag_$DATE > $SRC/result_$DATE
#3.将保存的结果文件发送给管理员
mail -s "Rsync Backup $DATE" 1240206455@qq.com <$SRC/result_$DATE
#4.保留最近180天的数据
find $SRC/ -type d -mtime +180|xargs rm -rf
[root@web01 ~]# hostname
web01
[root@web01 ~]# rsync -avz root@172.16.1.31:/server /
root@172.16.1.31's password:
receiving incremental file list
server/
server/scripts/
server/scripts/client_push_data.sh
sent 55 bytes received 682 bytes 491.33 bytes/sec
total size is 776 speedup is 1.05
[root@web01 ~]#
[root@web01 ~]# sh /server/scripts/client_push_data.sh
sending incremental file list
web01_172.16.1.7_2019-07-18/
web01_172.16.1.7_2019-07-18/flag_2019-07-18
web01_172.16.1.7_2019-07-18/other.tar.gz
web01_172.16.1.7_2019-07-18/sys.tar.gz
sent 1,940 bytes received 85 bytes 4,050.00 bytes/sec
total size is 1,705 speedup is 0.84
[root@web01 ~]#
#服务端查看
[root@backup ~]# hostname
backup
[root@backup ~]# ll /backup/
total 8
drwxr-xr-x 2 rsync rsync 67 Jul 17 22:17 nfs_172.16.1.31_2019-07-17
drwxr-xr-x 2 rsync rsync 67 Jul 18 09:06 nfs_172.16.1.31_2019-07-18
-rw-r--r-- 1 root root 102 Jul 17 22:29 result_2019-07-17
-rw-r--r-- 1 root root 102 Jul 18 09:07 result_2019-07-18
drwxr-xr-x 2 rsync rsync 67 Jul 18 10:13 web01_172.16.1.7_2019-07-18
[root@backup ~]#
1、客户端准备存储文件目录(/backup/主机名_ip_时间)
2、客户端将要备份的文件打包并放到存储目录下(/backup/主机名_ip_时间/*.tar.gz)
3、客户端使用md5给每个打包文件增加校验标记(flag_时间)
4、客户端通过rsync将数据推送至备份服务器的指定目录下(/backup)
5、客户端定时清理,只保留最近7天数据
6、服务端创建接收客户端数据的目录(/backup)
7、服务端使用md5校验客户端每天推过来的数据是否正确(md5sum -c flag_时间)
8、服务端将校验结果存储至指定文件(result_时间)
9、服务端定时将校验结果以邮件形式发送给管理员
10、服务端定时清理数据,只保留最近180天的数据
Rsync结合inotify[扩展]
yum -y install inotify-tools
-m 持续监控
-r 递归
-q 静默,仅打印时间信息
--timefmt 指定输出时间格式
--format 指定事件输出格式
%Xe 事件
%w 目录
%f 文件
-e 指定监控的事件
access 访问
modify 内容修改
attrib 属性修改
close_write 修改真实文件内容
open 打开
create 创建
delete 删除
umount 卸载
/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 &
精油版:
#!/bin/bash
src=/data
des=backup
rsync_passwd_file=/etc/rsync.passwd
ip1=172.16.1.41
user=rsync_backup
cd ${src}
/usr/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file
do
INO_EVENT=$(echo $file | awk '{print $1}')
INO_FILE=$(echo $file | awk '{print $2}')
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]
then
rsync -azcR --password-file=${rsync_passwd_file} ${INO_FILE} ${user}@${ip1}::${des}
fi
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
then
rsync -azR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} >/dev/null 2>&1
fi
if [[ $INO_EVENT =~ 'ATTRIB' ]]
then
if [ ! -d "$INO_FILE" ]
then
rsync -azcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} >/dev/null 2>&1
fi
fi
done &