rsync数据同步


⼀、备份

1.什么是备份?

备份就是把重要的数据或文件再次复制⼀份保存起来(给源⽂件增加⼀个副本)

2.为什么要备份?

数据很重要!!!

出现故障之后,需要恢复数据(软件服务出现问题⼏率很⼩,80%都是⼈为故障)

保证数据不丢失,便于快速恢复

3.能不能不做备份?

对于不重要的数据,我们可以不做备份

对于不必要的数据可以选择定时清理

4.备份常用工具?

本地复制 cp

远程传输 scp rsync

二、rsync服务概念

1.rsync简介

rsync英⽂称为remote synchronizetion

rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似于ssh带的scp命令,但是又优于scp命令的功能,scp每次都是全量拷贝,⽽rsync可以增量拷⻉。

默认情况下,仅同步大小或者最后修改时间发生变化的文件或目录,当然也可根据权限、属主等属性的变化同步,但是需要制定相应的参数,甚至可以实现只同步⼀个文件里有变化的内容部分,所以,可是实现快速的同步备份数据。

  1. rsync简称远程同步,可以实现不同主机之间的同步. 同时支持增量和全量的备份.
  2. 不同主机:
    • windows --> linux
    • linux --> linux
    • mac --> linux
    • mac --> windows
  3. rsync监听的端口:873
  4. 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