首页 > 系统相关 >Linux文件实时自动同步方案(基于inotify) 支持自定义目录、 不限主机数量、支持增删改

Linux文件实时自动同步方案(基于inotify) 支持自定义目录、 不限主机数量、支持增删改

时间:2024-10-19 16:20:31浏览次数:3  
标签:文件 rsync 同步 slave inotify 自定义 主机 Linux root

实现细节可以直接跳到第3节

3. 实现细节

关键词:

自动同步 Linux自动同步 Linux实时同步 master同步slave master与slave文件实时同步 

目录

1. 引言

背景介绍

方案概述

方案特点

2. 技术选型

inotify

rsync

Shell脚本

3. 实现细节

3.1前置配置

1. 权限设置

2. 安装 inotify 和 rsync

3. host映射

4. 配置ssh免密登录

5. 防火墙和网络设置

3.2 配置rsync,实现远程下发文件

1.rsync配置文件

2. rsync密码文件

3. 测试命令控制文件传输

3.3 监控机制

3.4 通过bash脚本实现自动化监听、同步

​编辑

3.5 让脚本后台持续监控

3.6 增加监控目录和同步主机

4. 异常处理


1. 引言

背景介绍

        在分布式系统中,多个服务器之间保持配置文件一致性是一个关键问题。例如在配置HDFS文件系统时,不用主机之间的部分配置文件需要保持严格一致,一个主机做出改变其他主机也需要更新,这时文件的同步显得尤为重要。为了避免不同服务器上的文件版本不一致带来的潜在问题,实现文件的实时同步就成了系统稳定性的重要保证。

方案概述

        传统的文件同步工具,如 scpftp 等,需要手动操作,且无法做到实时同步。此外,定时任务(如 cron)虽然可以自动化文件同步操作,但同步周期较长,无法满足高频率文件变化的需求。而实时自动同步能够在文件发生变化时,立即将更改应用到其他服务器,保证多台机器间的文件始终一致。

方案特点

本方案基于 inotifyrsync,具备以下特点:

  • 支持自定义监控目录,可以灵活选择需要同步的文件路径。
  • 不限同步主机数量,可以轻松扩展同步范围。
  • 支持文件的增删改操作,能够高效处理文件的全生命周期。
  • 实现实时同步,监控文件变化并立即同步,保证一致性。

2. 技术选型

inotify

inotify 是 Linux 内核提供的文件系统监控机制,能够监控文件或目录的创建、删除、修改等事件。相比其他文件监控方法,inotify 的优势在于:

  • 实时性高,能立即响应文件的变动。
  • 内核级别的支持,效率较高且资源占用小。
  • 简单易用,结合 inotifywait 可以方便地在脚本中实现文件监控。

rsync

rsync 是一种高效的数据同步工具,支持增量同步、压缩传输等功能。选择 rsync 的原因在于:

  • 它的增量同步机制,可以仅传输变化部分的文件,相较于scp可以大量节省带宽。
  • 支持压缩和加密传输,保证安全性和高效性。
  • 提供丰富的参数配置,如 -a 用于归档模式,-v 显示详细信息,-z 启用压缩等,可以灵活适应不同需求。

Shell脚本

使用 Bash 编写自动化脚本,是因为它具有以下优势:

  • 易于集成系统命令,像我们本次用到的inotifywaitrsync命令可以直接调用。
  • 脚本语言灵活轻便,适合定制自动化任务。
  • 兼容性强,几乎所有 Linux 发行版都支持 Bash,不需要额外安装复杂的环境。

3. 实现细节

3.1前置配置

ps:这些配置如果做过了就可以跳过。

为了确保不受到不同环境影响,这里我新安装了两台虚拟机来进行测试。

系统版本皆为CentOS 7.9

1. 权限设置

            确保监控的目录及文件具有足够的读写权限,特别是在涉及文件删除和同步时,权限不足可能会导致失败。一般可以使用 chmod 命令来调整权限。测试环境下建议暂时root账户操作。

2. 安装 inotify 和 rsync

        在部分 Linux 系统中,inotifyrsync 是默认自带的。如果系统中没有安装,可以通过包管理器手动安装。

国内记得改一下国内软件包镜像源再手动安装

也可以尝试直接安装:

安装inotify-tools

rpm -ivh https://mirrors.aliyun.com/centos/7.9.2009/infra/x86_64/infra-common/Packages/i/inotify-tools-3.14-9.el7.x86_64.rpm

安装rsync

rpm -ivh https://mirrors.aliyun.com/centos/7.9.2009/updates/x86_64/Packages/rsync-3.1.2-12.el7_9.x86_64.rpm

3. host映射

        为了简化管理,建议使用 host 映射,实现通过主机名而非 IP 地址访问 slave 主机。可以通过修改 /etc/hosts 文件来配置。

  1. 查看IP地址

ip addr show
查看ens33的ip地址

通过名字看到我的主机IP地址分别为:
        192.168.74.129
        192.168.74.130

  2.修改hosts文件的映射关系

vim /etc/hosts

        在host文件中添加对应的主机名和IP(这里根据自己的实际情况来)

192.168.74.129  master
192.168.74.130  slave

3.顺便修改一下hostname 

vim /etc/hostname

删除里面的内容,将要修改的主机名填入,重启系统

4. 配置ssh免密登录

        为了方便将文件同步到远程主机,我们需要设置 SSH 免密登录。这样可以避免每次同步文件时都需要手动输入密码,实现自动化操作。

  1. 在两台主机上分别上生成 SSH 密钥对(假设没有密钥):
    ssh-keygen -t rsa
  2. 将maser公钥复制到 slave 主机上(这句在maser执行)
    ssh-copy-id slave
    
  3. 将slave 公钥复制到 maser主机上(这句在slave执行)
    ssh-copy-id master
  4. 分别测试 SSH 连接,确保无需输入密码即可登录:
    ssh slave
    ssh master
   若无需输入密码即可登录到另一台主机就说明配置成功

      

5. 防火墙和网络设置

        保证 master 和 slave 机器之间的网络通信畅通,特别是确保 rsync 传输使用的端口(通常是 22 端口用于 SSH 传输)没有被防火墙阻塞。测试环境下建议暂时关闭防火墙。

例如CentOS 7 及之后的版本,使用systemctl暂时关闭防火墙:

systemctl stop firewalld.service

3.2 配置rsync,实现远程下发文件

1.rsync配置文件

修改master主机的配置文件 (可跳过)

vim /etc/rsyncd.conf

修改rsyncd.conf中的内容:

uid = root
gid = root
port = 873
fake super = yes
use chroot = no
max connections = 20
timeout = 600
read only = false
list = false
auth users = root
log file = /var/log/rsyncd.log

具体的配置项这里不做赘述,可以自行学习。

2. rsync密码文件

新建密码配置文件,用于存储认证信息 (可跳过)

echo "slave:yourpassword" > /etc/rsyncd.passwd
chmod 600 /etc/rsyncd.passwd

3. 测试命令控制文件传输

模拟出在文件修改或新增时,我们可以使用 rsync 命令进行更新。以下是具体测试步骤:

  • 检查文件状态: 在 master 主机的 /root/myfile/ 文件夹中,确认存在 cs.txt 文件,而 slave 主机的相应目录中尚未存在该文件。

  • 同步文件: 使用以下命令将文件夹内容从 master 主机同步到 slave 主机:

rsync -avz /root/myfile root@slave:/root/myfile

 

  • 验证同步结果: 再次执行 ls 命令查看 slave 主机的 /root/myfile/ 目录,确认 cs.txt 文件已成功同步。

  • 测试删除操作: 使用 SSH 连接到 slave 主机并删除文件夹:

ssh root@slave rm -rf /root/myfile/

通过以上步骤,我们成功实现了使用一条命令将 master 主机的文件下发至 slave 主机,并能够远程删除 slave 上的文件。接下来,我们可以开始实现自动化文件同步了。

3.3 监控机制

        为了实现文件的实时自动同步,我们使用 inotifywait 工具来监控指定目录下的文件增删改操作。inotifywait 是一个内核级别的文件系统监控工具,可以很好的实时检测文件和目录的变化。
        首先,在 master 主机上测试 inotifywait 是否能够正常工作。通过以下命令启动监控,监听指定目录的增删改事件:

inotifywait -m -r -e modify,create,delete /root/myfile
  • -m:持续监控。
  • -r:递归监控子目录。
  • -e:指定要监听的事件类型(修改、创建、删除)。

        此时需要打开两个命令窗口:一个用于运行监控命令,另一个用于在 /root/myfile 目录下进行文件的增删改操作。

        当在右侧窗口中对文件夹进行操作时,inotifywait 会及时监测到 createdeletemodify 等事件。但仔细查看,会发现右侧窗口我们并没有进行删除操作,原因在于使用 Vim 编辑器时会产生 .swp(交换文件)等临时文件,这些文件的创建和修改也被 inotifywait 监测到。所以基于这点,我们后面的自动化bash脚本中就得对于这个情况做出针对性的处理。

3.4 通过bash脚本实现自动化监听、同步

        为了实现实时文件同步,咱使用 Bash 脚本自动化监听和同步操作。通过脚本监控到文件变化,并在发生变化时自动执行相应的同步命令。

1. 创建一个名为 sync.sh 的 Bash 脚本文件,写入初始化变量:

#!/bin/bash

SLAVES=("slave")
MONITORED_DIRS=("/root/myfile")

 2. 添加以下代码以监控文件变化,并在变化发生时执行 rsync与ssh 命令同步文件变化:

echo "Starting to monitor directories..."
inotifywait -mr --exclude '.*\.swp$|.*~$|4913' -e close_write,create,delete "${MONITORED_DIRS[@]}" | while read path action file; do
full_path="${path}${file}"
echo "Detected change in $full_path, action: $action"

if [[ "$file" == *~ ]] || [[ "$file" == *.swp ]]; then
    echo "skipping backup or swap file: $full_path"
    continue
fi

if [[ "$action" == "DELETE" ]]; then
    for slave in "${SLAVES[@]}"; do
        echo "Deleting $full_path from $slave..."
        ssh "root@$slave" "rm -rf $full_path"
        if [ $? -eq 0 ]; then
            echo "Successfully deleted $file from $slave"
        else
            echo "Failed to delete $file from $slave"
        fi
    done
else

    if [[ ! -e "$full_path" ]]; then
        echo "$full_path does not exist, skipping sync."
        #copyright by xiaoby
        continue
    fi

    for slave in "${SLAVES[@]}"; do
        echo "Syncing $full_path to $slave..."
        rsync -avz "$full_path" "root@$slave:$full_path"
        if [ $? -eq 0 ]; then
            echo "Successfully synced $full_path to $slave"
        else
            echo "Failed to sync $full_path to $slave"
        fi
    done
fi
done

3. 保存脚本后,需要为其添加执行权限,以便可以直接运行:

chmod +x sync.sh

4. 运行脚本以开始监听和同步:

sh sync.sh

可以看到脚本已经成功运行。

接下来,在终端保持运行的状态下再打开一个终端窗口,用于操作 /root/myfile 目录。。

此外,打开 slave 主机的 /root/myfile 目录,以查看文件同步的情况。

        在测试过程中,我们在 master 主机的 /root/myfile 目录下先后创建和修改了多个文件。通过运行的脚本,观察到这些变化被成功同步到 slave 主机。至此,我们的自动化文件同步方案基本完成,验证了实时同步的有效性。

       行,可以撒花了。

标签:文件,rsync,同步,slave,inotify,自定义,主机,Linux,root
From: https://blog.csdn.net/qq_59959075/article/details/143051047

相关文章

  • ArkWeb页面拦截与自定义响应 - 控制加载过程
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。简介在Web应用开发中,有时我们需要对......
  • webAPI中的排他思想、自定义属性操作、节点操作(配大量案例练习)
    一、排他操作1.排他思想如果有同一组元素,我们想要某一个元素实现某种样式,需要用到循环的排他思想算法:1.所有的元素全部清除样式2.给当前的元素设置样式注意顺序能不能颠倒,首先清除全部样式,再设置自己当前的样式<!DOCTYPEhtml><htmllang="en"><head><meta......
  • linux-command-substitution(命令替换)
    linux-command-substitution(命令替换)1什么是命令替换在有一下情况的时候,会发生命令替换:$(command)或者是反引号`command`这个命令会在子shell中执行,使用标准输出替换掉上面的命令文本。并且在管道关闭或者子进程终止前,shell会一直等待。2命令替换时为什么把换行变成了......
  • Linux系统重建Grub引导的方法
    一、问题出现的原因在安装双系统时,我们都是先安装Windows系统,再安装Linux系统,这样在启动计算机时,两个系统都可以被引导启动,并在开机界面可以进行选择。这是因为Linux使用的操作系统引导加载器Grub可以引导如Windows、Linux等多种操作系统,但是Windows的操作系统引导加载器不能......
  • Java自定义函数查看OS的File Cache — 从原理到实战
    全文目录:开篇语......
  • Linux下丝滑使用docker
    安装docker安装由debian维护的docker.io,参考https://www.kali.org/docs/containers/installing-docker-on-kali/sudoaptupdatesudoaptinstalldocker.iosudosystemctlenabledocker--now为普通用户添加docker的权限sudousermod-aGdocker$USER更改docker镜像(......
  • Linux内核调优参数配置
    在Linux中,内核调优涉及到对系统内核的各种参数进行优化,以适应不同的工作负载和场景。这些参数主要存储在两个地方:一个是运行时动态可调的/proc/sys目录下的文件,另一个是持久化的配置文件/etc/sysctl.conf。1.内核调优配置文件/etc/sysctl.conf:这是最常用的内核参数配置文件,用......
  • Linux指定dns服务器解析某个域名
    在Linux中,指定DNS服务器来解析某个域名主要涉及编辑DNS配置文件或使用命令行工具进行临时配置。以下是详细的步骤和说明:一、编辑DNS配置文件(永久生效)Linux系统中,DNS解析的配置通常位于/etc/resolv.conf文件中。你可以通过编辑这个文件来指定DNS服务器。步骤:打开/etc/resolv.......
  • Linux查看系统的历史负载
    在Linux中,你可以使用top命令或uptime命令来查看系统的历史负载。top命令:top命令是一个实时的系统监控工具,它可以显示系统进程的动态实时视图,包括CPU和内存的使用情况。要查看历史负载,你可以在top命令中按Shift+H(在某些版本中可能是H)来切换显示模式,显示所有CPU的平均负载,而不......
  • linux上编译运行c程序
    创建test文件,进入该目录后创建hello.c文件使用vimhello.c命令编辑hello.c文件编写完成后保存该文件,使用gcc进行编译并生成可执行程序在终端中执行输入./hello执行相关代码......