系统运维Day02_数据同步服务

1. 数据同步服务基本介绍

在Ubuntu20.04中,数据同步服务Rsync是一个开源的多功能的用于在本地和远程系统之间高效同步和备份文件的工具,通过只传输变化的数据来节省带宽和时间。

主要特点

  • 支持增量同步:只传输发生变化的数据部分。
  • 支持 SSH 加密传输。
  • 可保持文件权限、时间戳、连接和等元数据。
    核心原理:

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Rsync的基本原理是通过使用 "差异算法" 来仅同步源文件和目标文件之间的差异部分,而不是重新传输整个文件 这一过程的核心是: 1:分块比较:Rsync将文件分为多个小块(通常是固定大小的块),然后对比源文件和目标文件中每个块的内容 2:校验和计算:对于每个块,Rsync计算出一个校验和(checksum),然后将源文件和目标文件的校验和进行比较,判断哪些块发生了变化 3:传输差异部分:如果某块在源文件和目标文件中不同,则只传输这一部分的差异数据,而不是整个文件 4:优化:Rsync还支持压缩(通过-z选项)和增量传输,使得同步过程更加高效,尤其在带宽有限的情况下 通过这种机制,Rsync大大减少了传输的数据量,从而提高了文件同步的效率,特别是在大文件和大规模目录结构中 |

数据同步任务背景:

  • 数据同步的重要性:
  • 确保多台服务器之间数据一致性。
  • 实现快速备份与恢复。
  • 提升运维效率,减少人为干预。
  • 常见应用场景:
  • 网站内容同步。
  • 配置文件备份。
  • 数据迁移与灾备。

同步方式:定时同步实时同步

2. 安装数据同步服务

bash 复制代码
apt apt install rsync -y

注意: 需要数据同步双方均安装rsync,同时配置了SSH密钥(否则需要输入密码)

bash 复制代码
rsync --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- 给各个文件随机写入一些内容 |

bash 复制代码
cd /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 上创建脚本:

bash 复制代码
sudo 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

授权执行:

bash 复制代码
sudo chmod +x /root/real_time_sync.sh

8. 测试实时同步

在 master 启动脚本:

bash 复制代码
sudo /root/real_time_sync.sh

打开另一终端,在 master 上创建文件:

bash 复制代码
echo "test log" > /export/data/logs/test.log

观察 node1 的 /export/data/master_exe_backup_log/ 是否实时出现文件。

成功后可使用:

bash 复制代码
nohup /root/real_time_sync.sh &

后台运行脚本。

9. 设置开机自启(systemd 方式)

创建 systemd 服务:

bash 复制代码
sudo 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

启动与启用:

bash 复制代码
sudo systemctl daemon-reload
sudo systemctl enable rsync_inotify
sudo systemctl start rsync_inotify
sudo systemctl status rsync_inotify

10. 改进方案:基于 Rsync 服务端(daemon 模式)

node1 配置 rsync 守护进程

安装 rsync:

bash 复制代码
sudo apt install -y rsync

编辑配置文件:

bash 复制代码
sudo vim /etc/rsyncd.conf

内容:

bash 复制代码
uid = 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

创建用户与密码文件:

bash 复制代码
sudo 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

权限调整:

bash 复制代码
sudo chown -R rsync:rsync /export/data/master_exe_backup_log

启动 rsync 服务:

bash 复制代码
sudo rsync --daemon

开机自启:

bash 复制代码
sudo 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
bash 复制代码
sudo systemctl daemon-reload
sudo systemctl enable rsyncd
sudo systemctl start rsyncd
sudo systemctl status rsyncd

11. master 端使用 RSYNC 服务实时同步脚本

bash 复制代码
sudo 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

密码文件配置:

bash 复制代码
echo "123456" | sudo tee /etc/rsync.password
sudo chmod 600 /etc/rsync.password

12. 验证

  • master 上新建或删除文件:
    /export/data/logs/xxx.log

  • node1 对应目录:
    /export/data/master_exe_backup_log

    会自动同步。

13. 清空环境(还原)

master 清理:

bash 复制代码
sudo 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 -r

node1 清理:

bash 复制代码
sudo 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
复制代码
相关推荐
阿猿收手吧!3 小时前
【Linux网络】shutdown()与close()的区别
linux·网络
LCG元3 小时前
Linux 磁盘管理从入门到精通:LVM 扩容实战案例
linux
liu****3 小时前
12.线程(二)
linux·开发语言·c++·1024程序员节
咯哦哦哦哦3 小时前
vscode arm交叉编译 中 cmakeTools 编译器设置
linux·arm开发·vscode·编辑器
工具人55554 小时前
Linux 抓取 RAM Dump 完整指南
linux·运维·安全
不懂音乐的欣赏者4 小时前
Windows 下 ROS/ROS2 开发环境最优解:WSL 比直接安装、虚拟机、双系统更优雅!
linux·windows·ubuntu·ros·wsl·ros2·双系统
小狗爱吃黄桃罐头5 小时前
正点原子【第四期】Linux之驱动开发学习笔记-10.1 Linux 内核定时器实验
linux·驱动开发·学习
Kang强6 小时前
tcpdump 抓到 icmp 包,但是抓不到 tcp 包??
linux
demodashi6666 小时前
Linux下ag搜索命令详解
linux·运维·windows