阶段四:数据同步与FTP服务

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

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

主要特点

核心原理:

    Rsync的基本原理是通过使用“差异算法”来仅同步源文件和目标文件之间的差异部分,而不是重新传输整个文件

这一过程的核心是:
    1:分块比较:Rsync将文件分为多个小块(通常是固定大小的块),然后对比源文件和目标文件中每个块的内容
    2:校验和计算:对于每个块,Rsync计算出一个校验和(checksum),然后将源文件和目标文件的校验和进行比较,判断哪些块发生了变化
    3: 传输差异部分:如果某块在源文件和目标文件中不同,则只传输这一部分的差异数据,而不是整个文件
    4: 优化:Rsync还支持压缩(通过-z选项)和增量传输,使得同步过程更加高效,尤其在带宽有限的情况下

    通过这种机制,Rsync大大减少了传输的数据量,从而提高了文件同步的效率,特别是在大文件和大规模目录结构中

注意事项:

2. 安装数据同步服务

安装:

dnf install rsync -y

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

注意事项:

3. RSYNC基本语法

格式:

rsync [选项] 源路径... 目标路径

注意事项:

本地同步:
rsync -av /src/directory/ /dest/directory/

远程同步:
rsync -avz /src/directory/ root@192.168.88.102:/dest/directory/

拉取远程数据到本地:
rsync -avz user@192.168.88.102:/src/directory/ /dest/directory/

注意事项:

准备工作
    1- 在node1节点的 /usr/local目录下,创建一个nginx-1.8.0目录,并在此目录下构建一个html目录
    2- 在html目录下,创建index.html、favicon.ico、logo.png文件,以及assets目录
    3- 在assets目录下,创建index.js、index.css文件
    4- 给各个文件随机写入一些内容

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

# 校验:
tree 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/

发现, 目标路径是不存在的, 所以先创建目标路径
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/

# 校验:
cd /usr/local
tree 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目录进行操作,将其同步到node2的家目录的backup的目录中

分析: 
    数据源是什么:本地   /usr/local/nginx-1.8.0/html

    目的地是什么:远端  root@192.168.88.102:~/backup/

目标路径是否存在呢? 需要创建
# 方式一: 直接在node2执行
mkdir -p ~/backup
ll ~

# 方式二: 在node1通过远程执行命令的方式
ssh root@192.168.88.102 "mkdir -p ~/backup; ls -l ~"

编写同步代码:

rsync -avz /usr/local/nginx-1.8.0/html root@192.168.88.102:~/backup/

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

校验:node1执行
ssh root@192.168.88.102 "tree ~/backup"
结果为:
/root/backup
└── html
    ├── assets
    │   ├── index.css
    │   └── index.js
    ├── favicon.ico
    ├── index.html
    └── logo.png

注意事项:

4. 【综合案例】实现定时与增量备份

需求说明:

在centos stream 9的 /var/log目录下,存储了大量的关于系统的日志:如messages文件存储大量的系统日志信息,secure日志文件存储了大量的与系统安全的日志。请对此目录中的messages、secure日志文件进行定时的备份到node2节点的/export/data/node1_backup_system_log目录中, 要求每日凌晨2点进行备份一次。

数据同步
    数据源: node1本地
        /var/log/messages
        /var/log/secure
    目的地:远端 node2
        root@192.168.88.102:/export/data/node1_backup_system_log

确认目的地路径是否存在:没有就创建
    在node1远程执行命令
    ssh root@192.168.88.102 "mkdir -p /export/data/node1_backup_system_log;tree /export"

同步命令:
rsync -avz /var/log/messages /var/log/secure root@192.168.88.102:/export/data/node1_backup_system_log

定时操作:
技术点: crontab

回顾: crontab 基本使用格式
     格式: crontab [选项]
         选项:
             -l  查看当前有哪些定时的任务
             -e  打开定时任务编辑窗口, 设置定时任务
     如何编写定时任务:
         分 时 日 月 周 执行的命令(命令建议是绝对路径)

     取值范围:
         分: 0~59
         时: 0~23
         日: 1~31
         月: 1~12
         周: 0~7  其中0 和 7 表示周日
     相关符号:
         *: 任意
         /:  每搁多少时间
         -:  一段连接的周期
         ,:   表示某个时间内的多个值

     如何获取命令的绝对路径: which 命令

编写定时任务:要求每日凌晨2点进行备份一次
0 2 * * * /usr/bin/rsync -avz /var/log/messages /var/log/secure root@192.168.88.102:/export/data/node1_backup_system_log

注意事项:

在node1执行:
crontab -e

输入 i 进入插入模式, 填写以下内容
0 2 * * * /usr/bin/rsync -avz /var/log/messages /var/log/secure root@192.168.88.102:/export/data/node1_backup_system_log

输入完成后, 按下 ecs键, 输入:x 保存退出

注意事项:

5. 【综合案例】结合INOTIFY实现实时同步

需求说明: 目前在企业服务node1节点中,/export/data/logs目录是公司各个系统日志存储目录,公司希望能够实时监控备份这些日志数据到node2的/export/data/node1_exe_backup_log目录下,请运维工程师来实现。

分析数据同步:
    数据源:node1节点上 /export/data/logs目录中内容

    目的地:node2节点上 /export/data/node1_exe_backup_log 

确认: 数据源目录 和 目的地目录是否是存在的, 如果不存在, 需要提前创建好
创建命令:
    node1执行: mkdir -p /export/data/logs
    node2执行: mkdir -p /export/data/node1_exe_backup_log

手动同步,命令如何编写呢?
node1执行: rsync -avz --delete /export/data/logs/  root@192.168.88.102:/export/data/node1_exe_backup_log

思考: 如何能够实现实时同步呢? 
解决思路:
    rsync工具, 仅是一个数据同步的工具, 执行一次这个命令, 就会触发一次数据同步操作, 本身并不具备定时或者实时同步的能力,如果要做定时或者实时, 都需要借助一些其他的工具来完成
    例如: 如果要进行定时, 就可以结合linux中提供的crontab

    那么对于实时同步,最为核心的事情: 能够实时感知到目录下文件的变化(创建、修改、删除、移动),这样只要能感知到, 我们就可以让数据同步工具触发执行一次,从而完成实时同步

在Linux中, 如果想要感知到linux目录或者文件的变化,就得使用Linux提供的INOTIFY工具

注意事项:

5.1 什么是INOTIFY

INOTIFY 是 Linux 内核的一个子系统,用于监控文件系统事件。它允许应用程序实时监控文件或目录的变化,如创建、删除、修改等。INOTIFY 通过内核通知机制,避免了轮询文件系统的高开销,提升了效率。

在 Shell 中,可以使用 inotify-tools 工具包来监控文件系统事件。inotify-tools 提供了两个主要的命令行工具:inotifywaitinotifywatch,其中 inotifywait 是最常用的工具,用于实时监控文件或目录的变化。

基本使用:

dnf install inotify-tools

命令作用:

执行结果:

关键参数:

注意事项:

首先启用EPEL仓库:

安装inotify-tools


**注意事项:**

常用选项
    -m:持续监控(默认只监控一次后退出)。
    -r:递归监控目录及其子目录。
    -q:静默模式,减少输出信息。
    --format:自定义输出格式。

常用事件类型
    create:文件或目录被创建。
    delete:文件或目录被删除。
    modify:文件内容被修改。
    attrib:文件属性(如权限)被修改。
    move:文件或目录被移动。

注意事项:


**注意事项:**

#!/bin/bash
DIR="/path/to/dir"

注意事项:

添加以下内容:

#!/bin/bash SOURCE_DIR="/export/data/logs"

LOG_FILE="/var/log/rsync_realtime_sync.log"


**注意事项:**

注意事项:

./real_time_sync.sh


**注意事项:**


内容如下:
[Unit]
After=network.target

[Service]
ExecStart=/root/real_time_sync.sh
Restart=always
User=root
Group=root

[Install]
WantedBy=multi-user.target

保持退出后:

注意事项:

image

**注意事项:**

  服务器主动向客户端发起数据连接,通常对大多数服务器来说,这种方式较容易实现。

注意事项:


**注意事项:**

  客户端请求服务器在某个端口(一个随机端口)上等待数据连接。
  服务器响应并告知客户端该数据端口号。
  客户端随后向该端口发起连接进行数据传输。

注意事项:


**注意事项:**

  需要服务器配置和开放更多的端口(通常是端口范围),可能会导致一些安全隐患。

注意事项:

准备二台服务器,一台用于客户端(node1),另一台用于服务端(node2)


**注意事项:**

**注意事项:**

注意事项:

前置:创建一个用于共享的目录,已经在目录下创建几个文件

修改配置:

设置以下几个配置项:


**注意事项:**





 说明:

    我们是无界面化的,故安装lftp即可

注意事项:


**注意事项:**




![](/assets/feishu-images/881ad849a7a77b9e4f4f8b43.png)


ftp://192.168.88.102

注意事项:


**注意事项:**






修改以下配置:


保存文件并退出,重启服务

注意事项:


**注意事项:**

格式:

示例:

注意事项:


**注意事项:**



保持退出后,重启vsftpd服务

注意事项:


**注意事项:**

注意事项:


**注意事项:**






![](/assets/feishu-images/34205da18592ca69dc03953d.png)




![](/assets/feishu-images/509f6b12101c3305ca179c0d.png)



![](/assets/feishu-images/aec94b4a04deea36551f9d52.png)







保存后,重启一下FTP服务

注意事项:


**注意事项:**




![](/assets/feishu-images/3805b27511d0455cf334ceba.png)

注意事项:


**注意事项:**



node1: 

node2:

注意事项:

操作案例之前,请先将node1和node2关于ftp的相关内容全部删除

需求:

在node1执行:

服务器端的操作: node1执行:

vsftpd.conf中: anonymous_enable=NO local_enable=YES write_enable=YES

local_root=/export/public chroot_local_user=YES

userlist_enable=YES userlist_deny=NO

黑白名单文件设置:

客户端操作: node2执行:

注意:


**注意事项:**

注意事项: