Linux架构之rsync
Linux架构之rsync
1.rsync概述
rsync 是类 unix 系统下的数据镜像备份工具。一款支持快速完全备份和增量备份的工具,支持本地复制,远程同步等,类似于 scp 命令;rsync 命令在同步文件之前要先登录目标主机进行用户身份认证,认证过后才能进行数据同步,身份认证方式取决于所使用的协议类型,rsync 一般使用两种协议进行数据同步:ssh 协议和 rsync 协议。
为什么使用rsync不用scp
- 速度快: 初次同步时, rsync会全量拷贝从源文件或目录到目标位置. 第二次往后同步时, rsync 仅仅会拷贝变化的数据块或字节到目标位置这将使得文件传输非常迅速.
- 安全: rsync 可以使用ssh协议加密传输.
- 占用带宽少: rsync 在发送时会压缩数据块, 接收后再解压缩数据块. 所以和其他文件传输协议比起来, rsync在跨主机传输文件时会占用较小的带宽
- 不需要特殊权限: 安装和运行rsync 不需要特殊权限.
备份类型
- 全量备份
- 将数据全部备份出来
- 增量备份
- 基于上一次备份,新增部分的数据备份出来
- 差异备份
- 基于全量备份,新增部分的数据备份出来
2.rsync传输模式
- 本地模式(相当于cp)
- 远程模式(相当于scp)
- 守护进程模式
#注意:rsync拷贝目录时,加/和不加/是有区别的
/etc/ :将etc目录下的所有文件拷贝过去,不包括目录本身
/etc :将etc目录下的所有文件拷贝过去,不包括目录本身
本地模式(CP)
Local: rsync [OPTION...] SRC... [DEST]
cp [OPTION]... SOURCE DEST
rsync [选项] 源文件.. 目标路径
远程模式(SCP)
Access via remote shell:
Pull: 拉 rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: 推 rsync [OPTION...] SRC... [USER@]HOST:DEST
拉:rsync [选项] [用户@]主机IP:文件路径 本机目录
推:rsync [选项] 本机文件 [用户@]主机IP:目录
如果不加 用户@ 默认以当前系统登录的用户为用户名
守护进程模式(把rsync当成服务启动)
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协议,服务启动后,自带端口
- 守护进程可以设置匿名用户,不需要使用系统用户
3.rsync选项
"所以通常情况下我们只需要-avz即可"
-a # 归档模式传输,等于-tropgDl -t -r -o -p -g -D -l
-v # 详细模式输出,打印速率,文件数量等
# rsync -v ./2.txt root@172.16.1.41:/opt/
-z # 传输时进行压缩以提高效率
# rsync -vz ./2.txt root@172.16.1.41:/opt/
-r # 递归传输目录及子目录,即目录下的所有目录都同样传输
# rsync -vzr ./a root@172.16.1.41:/opt/
-t # 保持文件时间信息
# rsync -vzrt ./a/b/c/2.txt root@172.16.1.41:/opt/
-o # 保持文件属主信息
-g # 保持文件属组信息
-p # 保持文件权限
# rsync -vzrtgop ./a/b/c/2.txt root@172.16.1.41:/opt/
-l # 保留软链接
# rsync -vzrtgopl ./* root@172.16.1.41:/opt/
-P # 显示同步的过程及传输时的进度等信息
# rsync -vzrtgoplP ./* root@172.16.1.41:/opt/
-D # 保持设备文件信息
# rsync -vzrtgDopl /dev/tty1 root@172.16.1.41:/opt/
-L # 保留软链接指向的目标文件
-e # 使用的信道协议,指定替代rsh的shell程序
"非常重要的参数:"
--append # 指定文件接着上次传输中断处继续传输
--append-verify # 使用参数续传(在断点续传之后,验证一下文件,如果不同,修复文件重新再传一遍)
--exclude=PATTERN # 指定排除不需要传输的文件
# rsync -avzP --append-verify --exclude=2.txt ./* root@172.16.1.41:/opt/
--exclude-from=file # 按照文件指定内容排除
# rsync -avzP --append-verify --exclued-from=/tmp/exclued.txt ./* root@172.16.1.41:/opt/
--bwlimit=100 # 限速传输(单位:MB)
# rsync -avzP --append-verify --bwlimit=10 ./* root@172.16.1.41:/opt/
--delete # 让目标目录和源目录数据保持一致
--password-file=xxx # 使用密码文件
--port # 指定端口传输
4.rsync实现同步
rsycn是不支持实时同步的,通常我们借助于inotify这个软件来实时监控文件变化,一旦inotify监控到文件变化,则立即调用rsync进行同步。
1. 安装inotify(装在客户端)
yum -y install inotify-tools
2. inotify参数介绍
-m 持续监控
-r 持续递归
-q 静默,仅打印时间信息
--timefmt 指定输出时间格式
--format 指定事件输出格式
%Xe 动作
%w 目录
%f 文件
-e 指定监控的时间
access 访问
modify 内容修改
attrib 属性修改
close_write 修改真实文件内容
open 打开
create 创建
delete 删除
umount 卸载
3. 开始监控
/usr/bin/inotifywait -mrq --format '%Xe %w %f' -e create,modify,delete,attrib,close_write /root
4. 实时监控并同步
/usr/bin/inotifywait -mrq --format '%Xe %w %f' -e create,modify,delete,attrib,close_write /root | while read line;do
cd /root
rsync -avzP --delete --password-file=/etc/rsyncd.passwd ./* rsync_backup@172.16.1.41::backup
done
-
rsync 官方地址: http://rsync.samba.org
-
rsync 监听端口: 873(默认窗口,可以进行更换)
-
rsync 运行模式: C/S
#C/S(Client/Server或客户/服务器模式)结构
C/S结构,即客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销
#B/S(Browser/Server,浏览器/服务器模式)结构
B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件。这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用
5.rsync备份实战
1.备份环境准备
主机名 | WanIP | LanIP | 角色 |
---|---|---|---|
lw01 | 10.0.0.100 | 172.16.1.100 | rsync服务端 |
lw02 | 10.0.0.6 | 172.16.1.6 | rsync客户端 |
2.服务端操作
rsync服务端的作用:存储备份数据的
#1.安装
root@backup ~]# yum install -y rsync
#2.配置
[root@backup ~]# vim /etc/rsyncd.conf
#删除并粘贴以下内容
uid = rsync //服务的用户
gid = rsync //服务的用户组
port = 873 //该服务监听的端口
fake super = yes //不以root身份运行传输数据不使用系统用户
use chroot = no //禁锢目录,不允许获取到root权限
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.创建rsync系统用户
[root@backup ~]# useradd rsync -s /sbin/nologin -M
4.创建服务端的密码文件,修改密码权限为600
[root@backup ~]# vim /etc/rsync.passwd
rsync_backup:123
#用户名要以K:V键值对的方式存储
[root@backup ~]# chmod 600 /etc/rsync.passwd
#只有属主用户可读可写,这点是rsync服务默认要求的,不然会报错
5.创建备份目录,修改备份目录的属组和属主
[root@backup ~]# mkdir /backup
[root@backup ~]# chown rsync:rsync /backup/
6.启动rsync服务并加入开机自启
[root@backup ~]# systemctl start rsyncd
[root@backup ~]# systemctl enable rsyncd
7.检查服务进程,服务端口
[root@backup ~]# ps -ef|grep [r]sync
root 10917 1 0 03:17 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
[root@backup ~]# netstat -lntup|grep 10917
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 10917/rsync
tcp6 0 0 :::873 :::* LISTEN 10917/rsync
3.客户端操作
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 [option..] 原文件 [用户名@]主机IP::模块名
rsync -avz /etc/passwd rsync_backup@172.16.1.100::backup
[root@web01 ~]# rsync -avz /etc/shadow rsync_backup@172.16.1.6::backup --password-file=/etc/rsync.pass
5.使用环境变量免交互输入密码
[root@web01 ~]# export RSYNC_PASSWORD=123
[root@web01 ~]# rsync -avz /etc/shadow rsync_backup@172.16.1.41::backup
常见报错
## 用户密码认证失败
[root@web01 ~]# rsync -avz /etc/passwd rsync_backup@172.16.1.41::backup
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 ~]# rsync -avz /etc/passwd rsync_backup@172.16.1.41::bak
@ERROR: Unknown module 'bak'
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]
1.模块名不认识
[root@web01 ~]# rsync -avz /etc/passwd rsync_backup@172.16.1.41::backup
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]
无法和172.16.1.41rsync服务建立连接
1.防火墙没关闭
2.selinux没关闭
3.服务没启动
4.服务的端口改了
[root@web01 ~]# rsync -avz /etc/shadow rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass
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,否则报错
4.企业级备份案例
环境准备
主机名 | WanIP | LanIP | 角色 |
---|---|---|---|
lw01 | 172.16.1.100 | 10.0.0.100 | rsync服务端 |
lw02 | 172.16.1.6 | 10.0.0.6 | rsync客户端 |
lw03 | 172.16.1.12 | 10.0.0.12 | rsync客户端 |
1.时间同步
yum install -y ntp
#手动同步
ntpdate ntp4.aliyun.com
#创建定时任务
crontab -e
*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com >/dev/null
2.关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
3.关闭selinux
setenforce 0
sed -i 's#selinux=enforcing#selinux=disabled#g' /etc/sysconfig/selinux
客户端需求
- 客户端提前准备存放的备份的目录,目录规则如下: /client_backup
- 客户端在本地打包备份(系统配置文件、应用配置等)拷贝至 /client_backup 包名: nfs_172.16.1.31_2022-05- 16.tar.gz
- 客户端最后将备份的数据进行推送至备份服务器
- 客户端每天凌晨1点定时执行该脚本
- 客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间
脚本实现客户端需求
#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 passwd
#3.客户端最后将备份的数据进行推送至备份服务器
rsync -az /client_backup/ rsync_backup@172.16.1.100::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 ~]# vim /root/backup.sh
#!/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=123456
# 1.创建客户端的备份目录
mkdir -p $bak_dir
# 2.进入备份目录,压缩备份文件
cd /etc && \
tar zcf $bak_dir/${host_name}_${ip}_${date_time}.tar.gz passwd
# 3.生成校验文件
cd $bak_dir && \
md5sum ${host_name}_${ip}_${date_time}.tar.gz > ${host_name}_${ip}_${date_time}.md5
# 4.推送数据到rsync服务端
rsync -avz $bak_dir/ rsync_backup@172.16.1.41::backup
# 5.保留7天内的文件
find $bak_dir -type f ! -mtime -7|xargs rm -f
服务端需求
- 服务端部署rsync,用于接收客户端推送过来的备份数据
- 服务端需要每天校验客户端推送过来的数据是否完整
- 服务端需要每天校验的结果通知给管理员
- 服务端仅保留6个月的备份数据,其余的全部删除
脚本实现服务端需求
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
2.服务端需要每天校验客户端推送过来的数据是否完整
cd /backup/ && md5sum -c *2022-05-16.md5
3.服务端需要每天校验的结果通知给管理员
md5sum -c *2022-05-16.md5 |mail -s 'xxx' 123@qq.com
4.服务端仅保留180天的备份数据,其余的全部删除
find /backup -type f ! -mtime -180|xargs rm -f
## 编写脚本
[root@backup ~]# vim check_md5.sh
#!/bin/bash
bak_dir="/backup"
host_name=`hostname`
ip=`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
如何校验一个数据的完整性
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]# md5sum -c jiaoyan.txt
1.txt: OK
## 被篡改或不完整
[root@backup tmp]# md5sum -c jiaoyan.txt
1.txt: FAILED
md5sum: WARNING: 1 computed checksum did NOT match