1. 数据同步服务基本介绍
在Ubuntu20.04中,数据同步服务Rsync是一个开源的多功能的用于在本地和远程系统之间高效同步和备份文件的工具,通过只传输变化的数据来节省带宽和时间。
主要特点:
- 支持增量同步:只传输发生变化的数据部分。
- 支持 SSH 加密传输。
- 可保持文件权限、时间戳、连接和等元数据。
核心原理:|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Rsync的基本原理是通过使用 "差异算法" 来仅同步源文件和目标文件之间的差异部分,而不是重新传输整个文件 这一过程的核心是: 1:分块比较:Rsync将文件分为多个小块(通常是固定大小的块),然后对比源文件和目标文件中每个块的内容 2:校验和计算:对于每个块,Rsync计算出一个校验和(checksum),然后将源文件和目标文件的校验和进行比较,判断哪些块发生了变化 3:传输差异部分:如果某块在源文件和目标文件中不同,则只传输这一部分的差异数据,而不是整个文件 4:优化:Rsync还支持压缩(通过-z选项)和增量传输,使得同步过程更加高效,尤其在带宽有限的情况下 通过这种机制,Rsync大大减少了传输的数据量,从而提高了文件同步的效率,特别是在大文件和大规模目录结构中 |
数据同步任务背景:
- 数据同步的重要性:
- 确保多台服务器之间数据一致性。
- 实现快速备份与恢复。
- 提升运维效率,减少人为干预。
- 常见应用场景:
- 网站内容同步。
- 配置文件备份。
- 数据迁移与灾备。
同步方式:定时同步和实时同步
2. 安装数据同步服务
bashapt apt install rsync -y注意: 需要数据同步双方均安装rsync,同时配置了SSH密钥(否则需要输入密码)

bashrsync --version
3. RSYNC基本语法
rsync [选项] 源路径... 目标路径
常用选项:
- -v:详细模式输出,显示传输过程中的文件信息。
- -a:归档模式,表示递归传输文件,并保持所有文件属性。
- -z:对备份的文件在传输时进行压缩处理。
- -P:显示进度条。
- --delete:删除目标目录中源目录中没有的文件(可选,用于实现双向同步)
- -e :用于指定用于传输文件的远程 shell 程序 默认为 ssh,也可以选择其他如rsh或者自定义的ssh端口
常见用户示例:|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 本地同步: rsync -av /src/directory/ /dest/directory/ 远程同步: rsync -avz /src/directory/ root@192.168.132.101:/dest/directory/ 拉取远程数据到本地: rsync -avz user@192.168.132.101:/src/directory/ /dest/directory/ |
案例说明:
- 本地同步操作:
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 准备工作 1- 在master节点的 /usr/local目录下,创建一个nginx-1.8.0目录,并在此目录下构建一个html目录 2- 在html目录下,创建index.html、favicon.ico、logo.png文件,以及assets目录 3- 在assets目录下,创建index.js、index.css文件 4- 给各个文件随机写入一些内容 |
bashcd /usr/local mkdir -p ./nginx-1.8.0/html cd /usr/local/nginx-1.8.0/html touch ./index.html ./favicon.ico ./logo.png mkdir ./assets cd ./assets touch index.js index.css cd /usr/local/nginx-1.8.0/html echo "11111 index.html" >> ./index.html echo "22222 favicon.ico" >> ./favicon.ico echo "33333 logo.png" >> ./logo.png cd /usr/local/nginx-1.8.0/html/assets echo "44444 index.js" >> ./index.js echo "55555 index.css" >> ./index.css
bash# 校验: tree /usr/local/nginx-1.8.0/ nginx-1.8.0/ └── html ├── assets │ ├── index.css │ └── index.js ├── favicon.ico ├── index.html └── logo.png
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 注意: 如果提示 tree命令 不存在, 需要进行下载 (comment not find 命令找不到) 执行:dnf -y install tree 需求:对html目录进行同步操作。 将其同步到 /usr/local/nginx-1.8.0/backup/ 下,并且如果源目录下已经删除的,在目标目录下也应该被删除 分析: 数据源是什么:/usr/local/nginx-1.8.0/html 目的地是什么:/usr/local/nginx-1.8.0/backup/ 发现, 目标路径是不存在的, 所以先在master创建目标路径 mkdir -p /usr/local/nginx-1.8.0/backup/ rsync -av --delete /usr/local/nginx-1.8.0/html /usr/local/nginx-1.8.0/backup/ |

bash# 校验: tree /usr/local/nginx-1.8.0/backup/ 结果: backup/ ├── assets │ ├── index.css │ └── index.js ├── favicon.ico ├── index.html └── logo.png|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 说明: 部分在演示的时候, 发现没有html目录 直接就是html目录里面的内容 可能看到的是这个结果 backup/ ├── assets │ ├── index.css │ └── index.js ├── favicon.ico ├── index.html └── logo.png 问题:什么原因导致的呢? 答:其实是因为在写数据源路径的时候, 目录最后面带了一个 / 导致, 一旦携带了斜杠, 相当于同步是该目录下的所有内容, 并不是该目录 |
- 远程同步操作:
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 需求:对/usr/local/nginx-1.8.0/html目录进行操作,将其同步到node1的家目录的backup的目录中 注意: 需要双方均安装rsync,同时配置了SSH密钥(否则需要输入密码) 分析: 数据源是什么:本地 /usr/local/nginx-1.8.0/html 目的地是什么:远端 root@192.168132.101:~/backup/ 目标路径是否存在呢? 需要创建 |
bash# 方式一: 直接在node1执行 mkdir -p ~/backup ll ~ # 方式二: 在master通过远程执行命令的方式 ssh root@192.168.132.101 "mkdir -p ~/backup; ls -l ~" 编写同步代码: rsync -avz /usr/local/nginx-1.8.0/html root@192.168.132.101:~/backup/|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 校验:master执行 ssh root@192.168.132.101 "tree ~/backup" 结果为: /root/backup └── html ├── assets │ ├── index.css │ └── index.js ├── favicon.ico ├── index.html └── logo.png |
4. 【综合案例】实现定时与增量备份
需求说明:
在ubuntu20.04的 /var/log 目录下, 存储了大量的关于系统的日志:如messages文件存储大量的系统日志信息,secure日志文件存储了大量的与系统安全的日志。请对此目录中的messages、secure日志文件进行定时的备份到master节点的**/export/data/master_backup_system_log**目录中, 要求每日凌晨2点进行备份一次。
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 数据同步 数据源:master本地 /var/log/messages /var/log/secure 目的地:远端 node1 root@192.168.132.101:/export/data/master_backup_system_log 确认目的地路径是否存在:没有就创建 在master远程执行命令 ssh root@192.168.132.101 "mkdir -p /export/data/master_backup_system_log;tree /export" 同步命令: rsync -avz /var/log/syslog root@192.168.132.101:/export/data/master_backup_system_log ||-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 定时操作: 技术点: crontab 回顾: crontab 基本使用格式 格式: crontab [选项] 选项: -l 查看当前有哪些定时的任务 -e 打开定时任务编辑窗口, 设置定时任务 如何编写定时任务: 分 时 日 月 周 执行的命令(命令建议是绝对路径) 取值范围: 分: 0~59 时: 0~23 日: 1~31 月: 1~12 周: 0~7 其中0 和 7 表示周日 相关符号: *: 任意 /: 每搁多少时间 -: 一段连接的周期 ,: 表示某个时间内的多个值 如何获取命令的绝对路径: which 命令 |执行定时操作:
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 在master执行,编写定时任务:要求每日凌晨2点进行备份一次 方式一: cat > /tmp/mycron.bak << "EOF" 0 2 * * * /usr/bin/rsync -avz /var/log/messages /var/log/secure root@192.168.132.101:/export/data/master_backup_system_log EOF crontab /tmp/mycron.bak 方式二: crontab -e 输入 i 进入插入模式, 填写以下内容 0 2 * * * /usr/bin/rsync -avz /var/log/messages /var/log/secure root@192.168.132.101:/export/data/master_backup_system_log 输入完成后, 按下 ecs键, 输入:x 保存退出 |
Ubuntu 20.04 实现实时同步(inotify + rsync)
1. 需求说明
-
主节点(master) :日志源目录
/export/data/logs -
副节点(node1) :备份目录
/export/data/master_exe_backup_log -
要求:主节点日志实时同步到副节点
2. 数据准备
在master上:
bash
sudo mkdir -p /export/data/logs
node1 上:
bash
sudo mkdir -p /export/data/master_exe_backup_log
3. 手动同步测试
master 节点执行:
bash
rsync -avz --delete /export/data/logs/ root@192.168.132.101:/export/data/master_exe_backup_log
注意:请确认 node1 的 IP 是
192.168.132.101,且可通过 SSH 登录。
如果同步正常,则说明基础环境没问题。
4. 实时同步方案思路
rsync本身只是同步工具,不具备实时触发功能。要实现实时同步,需要借助 Linux 的 inotify 机制(文件系统事件监控)。
Ubuntu 中对应的软件包是 inotify-tools。
5. 安装 Inotify 工具
master 上执行:
bash
sudo apt update
sudo apt install -y inotify-tools rsync
inotify-tools提供命令:
inotifywait(实时监控文件变化)
inotifywatch(统计文件变化)
6. inotify 基本用法复习
bash
inotifywait -m -r -e create,modify,delete,move /export/data/logs
-m:持续监听
-r:递归子目录
-e:指定事件类型
通过新开一个会话,mkdir /export/data/logs/test 可以看到 /export/data/logs/ CREATE,ISDIR test
7. 实时同步脚本(SSH 模式)
在 master 上创建脚本:
bashsudo vim /root/real_time_sync.sh内容如下:
bash#!/bin/bash # Ubuntu 20.04 实时同步脚本 (master -> node1) SOURCE_DIR="/export/data/logs" TARGET_DIR="root@192.168.132.101:/export/data/master_exe_backup_log" LOG_FILE="/var/log/rsync_realtime_sync.log" inotifywait -m -r -e modify,create,delete,move "${SOURCE_DIR}" | while read path action file; do echo "$(date '+%F %T') - Detected ${action} on ${file} in ${path}, triggering rsync..." >> "$LOG_FILE" rsync -avz --delete -e ssh "${SOURCE_DIR}/" "${TARGET_DIR}" >> "$LOG_FILE" 2>&1 echo "$(date '+%F %T') - Sync completed for ${file} in ${path}." >> "$LOG_FILE" done授权执行:
bashsudo chmod +x /root/real_time_sync.sh
8. 测试实时同步
在 master 启动脚本:
bashsudo /root/real_time_sync.sh打开另一终端,在 master 上创建文件:
bashecho "test log" > /export/data/logs/test.log观察 node1 的
/export/data/master_exe_backup_log/是否实时出现文件。成功后可使用:
bashnohup /root/real_time_sync.sh &后台运行脚本。
9. 设置开机自启(systemd 方式)
创建 systemd 服务:
bashsudo vim /etc/systemd/system/rsync_inotify.service内容:
bash[Unit] Description=Real-time Rsync Sync with Inotify (master -> node1) After=network.target [Service] ExecStart=/root/real_time_sync.sh Restart=always User=root Group=root [Install] WantedBy=multi-user.target启动与启用:
bashsudo systemctl daemon-reload sudo systemctl enable rsync_inotify sudo systemctl start rsync_inotify sudo systemctl status rsync_inotify
10. 改进方案:基于 Rsync 服务端(daemon 模式)
node1 配置 rsync 守护进程
安装 rsync:
bashsudo apt install -y rsync编辑配置文件:
bashsudo vim /etc/rsyncd.conf内容:
bashuid = rsync gid = rsync use chroot = no port = 873 max connections = 200 pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log transfer logging = yes ignore nonreadable = yes [master_logs] path = /export/data/master_exe_backup_log comment = Backup Directory read only = no secrets file = /etc/rsyncd.passwd hosts allow = 192.168.88.0/24 hosts deny = * auth users = backup_user创建用户与密码文件:
bashsudo useradd -m -s /usr/sbin/nologin rsync sudo useradd -m -s /usr/sbin/nologin backup_user echo "backup_user:123456" | sudo tee /etc/rsyncd.passwd sudo chmod 600 /etc/rsyncd.passwd权限调整:
bashsudo chown -R rsync:rsync /export/data/master_exe_backup_log启动 rsync 服务:
bashsudo rsync --daemon开机自启:
bashsudo vim /etc/systemd/system/rsyncd.service
bash[Unit] Description=Rsync Daemon After=network.target [Service] ExecStart=/usr/bin/rsync --daemon --config=/etc/rsyncd.conf --no-detach ExecReload=/bin/kill -HUP $MAINPID Restart=always [Install] WantedBy=multi-user.target
bashsudo systemctl daemon-reload sudo systemctl enable rsyncd sudo systemctl start rsyncd sudo systemctl status rsyncd
11. master 端使用 RSYNC 服务实时同步脚本
bashsudo vi /root/real_time_sync.sh
bash#!/bin/bash SOURCE_DIR="/export/data/logs" TARGET_DIR="backup_user@192.168.88.102::master_logs" LOG_FILE="/var/log/rsync_realtime_sync.log" inotifywait -m -r -e modify,create,delete,move "${SOURCE_DIR}" | while read path action file; do echo "$(date '+%F %T') - Detected ${action} on ${file} in ${path}" >> "$LOG_FILE" rsync -avz --port=873 --delete --password-file=/etc/rsync.password "${SOURCE_DIR}/" "${TARGET_DIR}" >> "$LOG_FILE" 2>&1 done密码文件配置:
bashecho "123456" | sudo tee /etc/rsync.password sudo chmod 600 /etc/rsync.password
12. 验证
master 上新建或删除文件:
/export/data/logs/xxx.lognode1 对应目录:
/export/data/master_exe_backup_log会自动同步。
13. 清空环境(还原)
master 清理:
bashsudo systemctl stop rsync_inotify sudo systemctl disable rsync_inotify sudo rm -f /etc/systemd/system/rsync_inotify.service sudo systemctl daemon-reload sudo rm -f /root/real_time_sync.sh sudo rm -rf /export/data/* sudo apt purge -y rsync inotify-tools sudo apt autoremove -y sudo rm -f /etc/rsync.password sudo crontab -rnode1 清理:
bashsudo systemctl stop rsyncd sudo systemctl disable rsyncd sudo rm -f /etc/systemd/system/rsyncd.service sudo systemctl daemon-reload sudo rm -rf /export/data/* sudo apt purge -y rsync sudo apt autoremove -y sudo rm -f /etc/rsyncd.conf /etc/rsyncd.passwd sudo userdel -rf rsync sudo userdel -rf backup_user
