⼀、备份
1.什么是备份?
备份就是把重要的数据或文件再次复制⼀份保存起来(给源⽂件增加⼀个副本)
2.为什么要备份?
数据很重要!!!
出现故障之后,需要恢复数据(软件服务出现问题⼏率很⼩,80%都是⼈为故障)
保证数据不丢失,便于快速恢复
3.能不能不做备份?
对于不重要的数据,我们可以不做备份
对于不必要的数据可以选择定时清理
4.备份常用工具?
本地复制 cp
远程传输 scp rsync
二、rsync服务概念
1.rsync简介
rsync英⽂称为remote synchronizetion
rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似于ssh带的scp命令,但是又优于scp命令的功能,scp每次都是全量拷贝,⽽rsync可以增量拷⻉。
默认情况下,仅同步大小或者最后修改时间发生变化的文件或目录,当然也可根据权限、属主等属性的变化同步,但是需要制定相应的参数,甚至可以实现只同步⼀个文件里有变化的内容部分,所以,可是实现快速的同步备份数据。
- rsync简称远程同步,可以实现不同主机之间的同步. 同时支持增量和全量的备份.
- 不同主机:
- windows --> linux
- linux --> linux
- mac --> linux
- mac --> windows
- rsync监听的端口:873
- rsync运⾏模式:C/S模式 client/server
三、核心功能与语法
1. 核心特性
- 增量同步:仅传输文件差异部分(首次全量,后续增量)。
- 元数据保留:通过
-a
选项保留权限、时间戳、符号链接等属性。 - 传输优化:支持压缩(
-z
)、带宽限制(--bwlimit
)、断点续传(--partial
)。
2. 基础语法
# 本地同步
rsync [选项] 源路径 目标路径
# 远程同步(SSH协议)
rsync [选项] 源路径 用户@远程主机:目标路径
# 远程同步(守护进程)
rsync [选项] rsync://远程主机/模块名/路径
四、常用选项速查表
选项 | 说明 |
---|---|
-a |
归档模式(递归+保留属性,等价于 -rlptgoD ) |
-v |
显示详细过程(-vv 更详细) |
-z |
传输时压缩数据(节省带宽) |
--delete |
删除目标中源不存在的文件(镜像同步) |
--exclude |
排除文件/目录(如 --exclude="*.log" ) |
-e ssh |
通过 SSH 加密传输(可指定端口 -e "ssh -p 2222" ) |
-P |
显示进度+断点续传(等价于 --partial --progress ) |
五、实战操作
1. 远程同步
SSH 加密传输:
# 本地到远程(标准端口)
rsync -avz /local/dir user@remote:/backup
# 远程到本地(非标准端口)
rsync -avz -e "ssh -p 10022" user@remote:/remote/dir /local/backup
守护进程模式:
服务端配置(/etc/rsyncd.conf
):
[module]
path = /data/backup
comment = Backup Module
read only = no
auth users = rsync
secrets file = /etc/rsyncd.secrets
客户端连接:
rsync -avz --password-file=/etc/rsync.pass rsync@remote::module /local/backup
2. 增量备份
基于硬链接:
# 首次全量备份
rsync -av /source /backup/full
# 后续增量备份
rsync -av --link-dest=/backup/full /source /backup/incremental
实时同步(inotify):
# 安装监控工具
yum install inotify-tools -y # CentOS
# 监控脚本
inotifywait -mrq -e modify,create,delete /source | while read; do
rsync -az --delete /source/ /backup/
done
3. 过滤与排除
排除单个文件:
rsync -av --exclude="*.log" --exclude="tmp/" /source /backup
使用排除列表文件:
# exclude.list
*.log
tmp/
rsync -av --exclude-from=exclude.list /source /backup
六、安全与性能优化
1. 安全实践
- 密码文件保护:
echo "密码" > /etc/rsync.pass
chmod 600 /etc/rsync.pass
2. 性能调优
- 带宽限制:
rsync -avz --bwlimit=1024 /source /backup # 1MB/s
- 校验和验证:
rsync -av --checksum /source /backup # 跳过时间戳比较
七、常见问题
错误信息 | 解决方案 |
---|---|
rsync: read error: Connection reset |
尝试 --partial 断点续传或检查防火墙 |
@ERROR: auth failed |
检查密码文件权限(chmod 600 )或用户名密码正确性 |
No space left on device |
清理目标磁盘或扩容 |
link_stat failed: No such file |
检查源路径是否存在 |
八、自动化脚本
每日定时备份:
#!/bin/bash
DATE=$(date +%Y%m%d)
rsync -avz --delete /data /backup/$DATE
Cron 配置:
crontab -e
0 2 * * * /path/to/backup.sh # 每天凌晨2点执行
九、对比与参考
工具 | 优势 | 劣势 |
---|---|---|
rsync | 增量同步、保留属性、支持SSH加密 | 配置较复杂,需命令行操作 |
scp | 简单易用,默认加密 | 全量传输,无增量功能 |
rclone | 支持云存储,跨平台兼容性好 | 依赖云服务API,配置繁琐 |
十、Rsync实战案例
1.安装 rsync
以下操作在root用户下进行
yum install rsync
2.常用操作
# 注意结尾加"/"表示目录中的内容同步,不加"/"表示同步这个目录本身。
# 在本地同步目录中的文件
rsync -avz /test /test1
rsync -avz /test/ /test1
# 将本地文件同步到远程服务器
rsync -avz --delete /root/test1/ root@192.168.8.31:/root/test1
# 将远程服务器文件同步到本地
rsync -avz --delete root@192.168.8.31:/root/test1/ /root/test3
3.配置 Rsync 服务器
# 准本两台机器
master 192.168.8.50
slave 192.168.8.60
# 修改master(192.168.8.50)的配置文件
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
#关闭防火墙及安装机制
yum install -y httpd rsync
#rsync系统一般已默认安装,安装httpd是为了生成/var/www/html目录(后续会用到作为共享目录)
mkdir -p /var/www/html #创建共享文件目录
chmod +r /var/www/html #给共享目录加上读的权限
编辑rsync配置文件
vim /etc/rsyncd.conf
uid = root
gid = root
use chroot = yes
address = 192.168.8.50
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 192.168.8.0/24
[myhtml]
path = /var/www/html
comment = this is rsync
read only = yes
dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z
auth users = tom
secrets file = /etc/rsyncd_users.db
配置详解
************************************************************************************
uid = root #用户id
gid = root #组id
use chroot = yes #开启,禁锢在源目录
address = 192.168.8.50 #监听地址,服务端IP地址
port 873 #默认端口号为873
log file = /var/log/rsyncd.log #日志文件存放位置
pid file = /var/run/rsyncd.pid #存放进程id的文件位置
hosts allow = 192.168.8.0/24 #允许访问的主机网段
[myhtml] #共享模块的名称
path = /var/www/html #源目录路径
comment = "this is myhtml" #配置说明信息
read only = yes #是否为只读
dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z #同步时不再压缩的文件类型
auth users = tom #授权用户,多个账户以空格隔开
secrets file = /etc/rsyncd_users.db #存放账号信息的数据文件,一行一个
# 主服务器创建用户账号和密码
vim /etc/rsyncd_users.db
tom:123123
#编辑用户账号文件,固定格式为[名称:密码],一行一个
#官方要求,最好只是赋权600!
chmod 600 /etc/rsyncd_users.db
# 主服务器开启服务
rsync --daemon
# 或者systemctl开启服务
systemctl restart rsyncd
#检测端口号,确认服务是否成功开启
netstat -natp | grep rsync
cd /var/www/html
#切换至共享目录下
echo "zuolaoshi 666" > index.html
#给共享文件夹下创建一个index.html文件输入内容
- 客户端查看内容
mkdir -p /opt/abc
rsync -avz tom@192.168.8.50::myhtml /opt/abc #用rsync登录
echo "123123"> /etc/server.pass #输入密码实现免交互
chmod 600 /etc/server.pass #给密钥文件赋权600
rsync -avz --delete --password-file=/etc/server.pass tom@192.168.8.50::myhtml /opt/abc/
# rsync,使用密钥文件/etc/server.pass对应tom用户,IP地址为192.168.8.50的共享模块文件进行压缩
# 并归档同步至当前服务器的/opt/abc目录下,同时删除差异内容,保持一致性
使用rsync+inotify实现触发式实时文件同步
实时同步能够在文件发生变化时立即进行同步,可以最大程度地减少数据丢失的风险,确保数据的及时性和准确性。相比之下,定时同步需要等待定时任务触发,可能会导致数据延迟,实时同步只在文件发生变化时进行同步操作,避免了定时同步可能存在的频繁无效同步,节省了系统资源和网络带宽。接下来具体介绍rsync+inotify模式如何实现触发式实时同步。 服务端安装inotify工具:
yum install -y inotify-tools
如果提示No package inotify-tools available,更新源后再尝试下载
yum install -y epel-release && yum -y update
inotify是一个Linux内核提供的机制,用于监视文件系统事件。它可以通过命令行工具inotifywait和inotifywatch来使用。inotifywait更侧重于等待文件系统事件的发生并执行操作,而inotifywatch更侧重于监视文件系统事件并显示统计信息,本文使用inotifywait来实现文件同步 inotifywait常见选项:
选项 | 说明 | 示例 |
---|---|---|
-m |
持续监控,不捕获到首个事件就退出 | inotifywait -m /path |
-r |
递归监控目录及其子目录 | inotifywait -r /path |
-q |
安静模式,减少输出详细度,-qq 更简洁 |
inotifywait -q /path |
-e |
指定监控的事件类型,多个用逗号分隔 | -e modify,create,delete |
--format |
自定义输出格式,可用 %w (目录)、%f (文件名)、%e (事件)占位符 |
--format '%w%f 发生 %e 事件' |
--timefmt |
指定时间格式,结合 --format 里的 %T 使用 |
--timefmt '%Y-%m-%d' --format '%T %e 发生' |
--exclude |
用正则表达式排除指定文件或目录 | --exclude '.*\.log$' |
--excludei |
同 --exclude ,但不区分大小写 |
--excludei '.*\.TXT$' |
接下来,我们将配置rsync和inotify来实现实时文件同步:
1.生成SSH密钥对并上传公钥 在服务端生成SSH密钥对,并将公钥上传到客户端,以便实现无密码的SSH连接。
2.创建同步脚本 在服务端创建一个名为sync.sh的脚本文件,并添加以下内容:
#!/bin/bash
while inotifywait -r -e modify,create,delete,move /data/;do
rsync -avz /data/ root@192.168.8.11:/opt/data/
done
3.授予脚本执行权限并执行
chmod +x sync.sh
./sync.sh ##脚本会一直运行,并在`/data/`目录中的文件发生变化时进行实时同步
4.测试同步
在服务端/data目录下新建名为12345的文件,服务端提示/data创建了12345文件,并开始发送增量文件。 切换到客户端可以看到/data/目录下所有文件已实时同步到客户端/opt/data