rsync数据备份 环境准备
主机名
内网IP
外网IP
角色
web01
172.16.1.7
10.0.0.7
备份客户端
backup
172.16.1.41
10.0.0.41
备份服务端
rsync概述 rsync是一款开源、快速、多功能、可实现全量及增量 的本地或远程数据同步 备份的优秀工具。rsync软件适用于Unix、linux、windows等多种操作平台
为什么使用rsync不用scp?
scp是基于ssh协议的命令,不是一个服务
scp每次都基于全量拷贝,rsync支持增量拷贝
备份类型
全量备份
将数据全部备份出来
增量备份
基于上一次备份,新增部分的数据备份出来
差异备份
rsync应用场景
推:所有主机推送本地数据至rsync备份服务器,会导致数据同步缓慢(适合少量数据备份)
拉:rsync备份服务端拉去所有主机上的数据,会导致备份服务器开销过大
rsync传输模式 注意:rsync拷贝目录时,加/和不加/是有区别的
/etc/ :将etc目录下的所有文件拷贝过去,不包括目录本身
/etc :将etc目录本身和目录下的所有文件一并拷贝过去
1 2 3 4 5 Local: rsync [OPTION...] SRC... [DEST] cp [OPTION]... SOURCE DEST rsync [选项] 源文件.. 目标路径
1 2 3 4 5 6 7 8 9 Access via remote shell: Pull: 拉 rsync [OPTION...] [USER@]HOST:SRC... [DEST] Push: 推 rsync [OPTION...] SRC... [USER@]HOST:DEST 拉:rsync [选项] [用户@]主机IP:文件路径 本机目录 推:rsync [选项] 本机文件 [用户@]主机IP:目录 注意:如果不加 用户@ 默认以当前系统登录的用户为用户名
1 2 3 4 5 6 Access via rsync daemon: Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST::DEST 拉:rsync [选项..] [用户名@]主机IP::配置文件中的模块名 本机目录 推:rsync [选项..] 本机文件 [用户名@]主机IP::配置文件中的模块名
企业中为啥使用守护进程模式?
远程模式和scp差不多,基于ssh协议
需要知道系统的用户名和密码
守护进程不需要ssh协议,服务启动后,自带端口
守护进程可以设置匿名用户,不需要使用系统用户
rsync选项 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 -a:归档模式传输, 等于-tropgDl -v:显示同步过程 -z:压缩,提高传输效率 ============================== -t:time 保持文件的时间信息 -r:拷贝目录时,递归拷贝 -o:owner 保持文件的属主信息 -g:group 保持文件的属组信息 -p:perm 保持文件的权限信息 -D:device 保持设备文件的信息 -l:link 保留软链接 ============================== -P:显示进度 -L:保留软链接指向的目标文件 --exclude=PATTERN 指定排除不需要传输的文件模式 --exclude-from=file 指定排除文件 --bwlimit=1 限速传输 --partial 断点续传 --delete 决定数据是否要同步 rm --password-file= 指定密码文件
rsync环境准备
主机名
WanIP
LanIP
角色
web01
10.0.0.7
172.16.1.7
rsync客户端
backup
10.0.0.41
172.16.1.41
rsync服务端
rsync工作模式
本地模式(cp)
远程模式(scp)
守护进程模式
rsync官网:https://rsync.samba.org/
rsync监听端口:873
rsync运行架构:C/S Client/Server
架构类型
C/S Client/Server
B/S Browser/Server
rsync服务端的作用:存储备份数据的
服务端操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 [root@backup ~] [root@backup ~] 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 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 端口的范围:1 ~65535 [root@backup ~] [root@backup ~] rsync_backup:123 或 [root@backup ~] [root@backup ~] [root@backup ~] [root@backup ~] [root@backup ~] [root@backup ~] [root@backup ~] root 7787 1 0 05:58 ? 00:00:00 /usr/bin/rsync --daemon --no-detach [root@backup ~] tcp 0 0 0.0 .0 .0 :873 0.0 .0 .0 :* LISTEN 7787 /rsync tcp6 0 0 :::873 :::* LISTEN 7787 /rsync
客户端操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 推:rsync [option..] 原文件 [用户名@]主机IP::模块名 rsync -avz /etc/passwd rsync_backup@172.16.1.41::backup [root@web01 ~] Password: @ERROR: auth failed on module backup rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2] 原因:1.用户输入错误 2.密码输入错误 3.密码文件的权限不是600 [root@web01 ~] @ERROR: Unknown module 'bak' rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2] [root@web01 ~] rsync: failed to connect to 172.16.1.41 (172.16.1.41): No route to host (113) rsync error: error in socket IO (code 10) at clientserver.c(125) [sender=3.1.2] 原因:1.防火墙 2.selinux 3.服务没启动 4.服务的端口改了 [root@web01 ~] ERROR: password file must not be other-accessible rsync error: syntax or usage error (code 1) at authenticate.c(196) [sender=3.1.2] [root@web01 ~] [root@web01 ~] 123456 [root@web01 ~] [root@web01 ~] [root@web01 ~] [root@web01 ~]
排错过程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [root@backup ~] [root@backup ~] -rw------- 1 root root 20 May 16 17:37 /etc/rsync.passwd 检查用户名是否和配置文件中的用户名一致 模块目录的权限,必须是rsync配置文件中指定的uid和gid的权限 命令中的用户名要跟服务端配置文件和密码文件中的用户名一致 rsync_backup 命令中的模块名要跟服务端配置文件中的模块名一致 backup 600 root root 只需要写密码 [root@web01 ~] 123456 密码是否和服务端密码文件保持一致
rsync企业实战 环境准备
主机名
WanIP
LanIP
角色
backup
10.0.0.41
172.16.1.41
rsync服务端
web01
10.0.0.7
172.16.1.7
rsync客户端
nfs
10.0.0.31
172.16.1.31
rsync客户端
先决条件 1 2 3 4 5 6 7 8 9 10 11 12 13 yum install -y ntpdate crontab -e */5 * * * * /usr/sbin/ntpdate time1.aliyun.com >/dev/null systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i 's#selinux=enforcing#selinux=disabled#g' /etc/sysconfig/selinux
客户端需求 1.客户端提前准备存放的备份的目录,目录规则如下: /client_backup
2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至 /client_backup 包名:nfs_172.16.1.31_2022-05- 16.tar.gz
3.客户端最后将备份的数据进行推送至备份服务器
4.客户端每天凌晨1点定时执行该脚本
5.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间
服务端需求 1.服务端部署rsync
,用于接收客户端推送过来的备份数据
2.服务端需要每天校验客户端推送过来的数据是否完整
3.服务端需要每天校验的结果通知给管理员
4.服务端仅保留6个月的备份数据,其余的全部删除
如何校验一个数据的完整性 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1.备份打包后,给压缩包做一个MD5加密 /client_backup/nfs_172.16.1.31_2022-05-16.tar.gz md5sum nfs_172.16.1.31_2022-05-16.tar.gz > jiaoyan.txt 2.将校验文件,和压缩包一并传递到服务端 3.在服务端使用md5sum -c检查校验 [root@backup tmp] 1.txt: OK [root@backup tmp] 1.txt: FAILED md5sum: WARNING: 1 computed checksum did NOT match
脚本实现客户端需求 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 1.客户端提前准备存放的备份的目录,目录规则如下:/client_backup mkdir /client_backup 2.客户端在本地打包备份(/etc/passwd)拷贝至/client_backup,包名:nfs_172.16.1.31_2022-05- 16.tar.gz cd /etc && tar zcf /client_backup/nfs_172.16.1.31_2022-05-16.tar.gz passwd3.客户端最后将备份的数据进行推送至备份服务器 rsync -az /client_backup/ rsync_backup@172.16.1.41::backup 4.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间 find /client_backup -type f ! -mtime -7|xargs rm -f 5.客户端每天凌晨1点定时执行该脚本 crontab -e 00 01 * * * /bin/sh /root/bakup.sh >/dev/null [root@web01 ~] #!/bin/bash bak_dir="/client_backup" host_name=`hostname` ip=`/usr/sbin/ifconfig eth1|awk 'NR==2{print $2}' ` date_time=`date +%F` export RSYNC_PASSWORD=123456mkdir -p $bak_dir cd /etc && \tar zcf $bak_dir /${host_name} _${ip} _${date_time} .tar.gz passwd cd $bak_dir && \md5sum ${host_name} _${ip} _${date_time} .tar.gz > ${host_name} _${ip} _${date_time} .md5 rsync -avz $bak_dir / rsync_backup@172.16.1.41::backup find $bak_dir -type f ! -mtime -7|xargs rm -f
脚本实现服务端需求 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 [root@backup ~] 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 cd /backup/ && md5sum -c *2022-05-16.md5 md5sum -c *2022-05-16.md5 |mail -s 'xxx' 123@qq.com find /backup -type f ! -mtime -180|xargs rm -f [root@backup ~] [root@backup ~] set from=253097001@qq.com set smtp=smtps://smtp.qq.com:465 set smtp-auth-user=管理员邮箱set smtp-auth-password=授权码 set smtp-auth=login set ssl-verify=ignore set nss-config-dir=/etc/pki/nssdb/[root@backup ~] #!/bin/bash bak_dir="/backup" host_name=`hostname` ip=`/usr/sbin/ifconfig eth1|awk 'NR==2{print $2}' ` date_time=`date +%F` cd ${bak_dir} && \md5sum -c *${date_time} .md5|mail -s "${date_time} _数据备份校验" 管理员邮箱 >/dev/null find /backup -type f ! -mtime -180|xargs rm -f
测试crontab 1 2 3 4 5 6 7 8 9 crontab -e 00 01 * * * /bin/sh /root/backup.sh &>/dev/null crontab -e 01 01 * * * /bin/sh /root/check_md5.sh &>/dev/null
rsync结合inotify实时同步 如果只是做备份,不需要实时备份
定时任务最小单位是分钟级别
数据需要实时同步该如何解决?
inotify概述 inotify其实是一个监控命令,监控一个文件或目录的状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 [root@web01 ~] [root@nfs ~] -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 /client_backup #!/bin/bash dir=/client_backup/ export RSYNC_PASSWORD=123456inotifywait -mrq --format '%w %f' -e create,delete,attrib,close_write $dir |while read line;do rsync -az --delete $dir rsync_backup@172.16.1.41::backup done &
rsync总结 rsync作用: 数据备份,数据同步
备份类型:
rsync三种工作模式:
本地模式(local)
1 2 3 4 5 6 语法: rsync [选项] 源文件 目标路径 rsync /root/1.txt /tmp 当需要拷贝比较大的目录,或者文件比较多的目录,建议使用rsync
远程模式(remote)
1 2 3 4 5 6 7 语法: 推: rsync [选项] 源文件 系统用户@IP地址:/目标路径 rsync -avz /root/1.txt root@172.16.1.41:/tmp 拉: rsync [选项] 系统用户@IP地址:/远端文件 本地路径 rsync -avz root@172.16.1.41:/etc/passwd .
守护进程模式(daemon)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 优势: 1.不受到ssh协议影响 2.不需要知道系统用户的密码 [root@backup ~] 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 = This directory for backup Nginx ! path = /backup [backup] comment = This directory for backup Nginx ! path = /backup [zls] comment = xxx [zls] comment = xxx path = /bak 1.密码文件(权限600,内容只有密码,不能写用户,属主和属组必须是root) 2.手动输入密码 3.export RSYNC_PASSWORD=123456(推荐)
数据校验:
1 2 3 4 md5加密算法 md5sum 文件名 校验文件:-c md5sum -c 校验文件
实时同步:
1 2 3 作用:为了保证数据的一致性 inotify:了解 sersync:实时同步,底层inotify