rsync+inotify组合实现及时远程同步

2024-04-08 17:44

本文主要是介绍rsync+inotify组合实现及时远程同步,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

Rsync(Remote Sync)简介:

Rsync 主要特点:

Rsync 常用命令选项:

Inotify 简介:

Inotify 的主要功能:

结合 Rsync 和 Inotify 实现实时同步:

操作步骤:

配置备份服务器rsync

配置应用服务器inotify

注意事项:


Rsync(Remote Sync)简介:

  • rsync 是一个用于文件同步和备份的命令行工具,可以在本地和远程系统之间高效地同步文件和目录。
  • 它能够快速地复制和同步大量数据,只传输那些发生变化的部分,节省了带宽和时间。
  • 支持完整备份、差量备份和增量备份等多种备份方式,可以根据需求选择不同的备份策略。
Rsync 主要特点:
  • 增量传输:仅传输变化的部分,节省带宽和时间。
  • 文件权限保留:可以保留文件权限、时间戳等元数据。
  • 删除文件同步:支持在目标目录中删除源目录不存在的文件。
  • 压缩传输:支持传输时压缩数据,减少传输量。
  • 远程同步:可以在本地和远程系统之间同步文件。
Rsync 常用命令选项:
  • -a:归档模式,保留所有文件属性,相当于 -rlptgoD
  • -v:详细输出,显示每个文件传输的详细信息。
  • -z:传输时压缩数据,减少传输量。
  • --delete:删除目标目录中不存在于源目录中的文件。
  • --exclude:排除指定文件或目录。
  • --progress:显示传输进度。
  • --backup:在覆盖目标文件时备份已存在的文件。

Inotify 简介:

  • inotify 是 Linux 内核提供的机制,用于监视文件系统事件。
  • 可以监视文件或目录的各种事件,如文件创建、删除、修改、移动等。
  • 可以通过命令行工具 inotifywait 使用这个机制,实现对文件系统的实时监控。
Inotify 的主要功能:
  • 实时监控:可以实时监听文件系统的变化,并触发相应的动作。
  • 文件系统事件:监控文件和目录的各种事件,如创建、删除、修改等。
  • 可编程性:可以通过脚本或程序使用 inotify 进行文件系统监控和处理。

结合 Rsync 和 Inotify 实现实时同步:

  1. 使用 inotifywait 监听源目录的变化。
  2. 当源目录发生变化时,触发 rsync 命令进行同步。
  3. rsync 将变化的文件或目录同步到目标位置。

这样,当文件系统的变化发生时,就可以立即将变化同步到目标位置,实现了文件的实时备份和同步。常见应用场景包括实时数据备份、网站文件同步等。

操作步骤:

应用服务器ip为192.168.1.33,备份服务器ip为192.168.1.22。需要将应用服务器的/var/www/html/ 实时同步给备份服务器的/var/www/html/

配置备份服务器rsync
vim /etc/rsyncd.confuid = root
gid = root
use chroot = yes
address = 192.168.1.22
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 192.168.1.0/24
dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2[web_bak]
path = /var/www/html
comment = Document Root of www.myweb.com
read only = no
auth users = backuper
secrets file = /etc/rsyncd_users.db
  • uid = root:指定守护进程运行时所使用的用户的 UID。在这里是 root,表示守护进程会以 root 用户的身份运行。

  • gid = root:指定守护进程运行时所使用的用户组的 GID。与上面类似,这里也是 root,表示守护进程会以 root 用户组的身份运行。

  • use chroot = yes:表示在运行守护进程前,将其 chroot(切换根目录)到指定的路径。在这里是 yes,表示守护进程会以 /var/www/html/ 作为其根目录。

  • address = 192.168.1.22:指定 rsync 守护进程监听的 IP 地址。

  • port 873:指定 rsync 守护进程监听的端口号。默认 rsync 服务的端口号是 873

  • log file = /var/log/rsyncd.log:指定 rsync 守护进程的日志文件路径。

  • pid file = /var/run/rsyncd.pid:指定 rsync 守护进程的 PID 文件路径,用于记录守护进程的进程 ID。

  • hosts allow = 192.168.1.0/24:指定允许访问 rsync 守护进程的主机或 IP 地址范围。在这里是允许 192.168.1.0/24 网段的主机访问。

  • dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2:指定不压缩的文件类型,这些文件类型不会被 rsync 守护进程压缩传输。

  • [web_bak]:定义一个模块,客户端在访问 rsync 时可以使用这个名称。

    • path = /var/www/html:指定这个模块的路径,客户端可以访问的目录路径。在这里是 /var/www/html,表示客户端可以访问和同步的是这个目录。

    • comment = Document Root of www.myweb.com:对这个模块的描述注释。

    • read only = no:表示这个模块是可写的,客户端可以向这个模块写入文件。

    • auth users = backuper:指定允许访问这个模块的授权用户,这里是 backuper

    • secrets file = /etc/rsyncd_users.db:指定包含授权用户密码的文件路径。

rsync --daemon
chmod 777 /var/www/html/

rsync --daemon 是用于启动 rsync 守护进程的命令。通过这个命令,可以在服务器上启动 rsync 守护进程,使得其他客户端可以通过 rsync 协议访问服务器上的共享目录。

配置应用服务器inotify

先调整inotify内核参数

vim /etc/sysctl.conffs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576sysctl -p

示例中的设置如下:

  • 这三个参数分别控制着 Linux 系统中 inotify 子系统的行为。下面对每个参数进行解释:

  • fs.inotify.max_queued_events

    • 这个参数定义了每个 inotify 实例中允许排队的事件数量的最大限制。
    • 默认值通常是 16384。
    • 适当增加这个值可以确保即使在高负载时系统也不会丢失任何事件。
  • fs.inotify.max_user_instances

    • 这个参数定义了单个用户可以创建的 inotify 实例的最大数量。
    • 默认值通常是 128。
    • 如果系统需要大量的 inotify 实例,比如同时监视大量文件或目录,可能需要增加这个值。
  • fs.inotify.max_user_watches

    • 这个参数定义了单个用户在所有 inotify 实例中能够监视的文件或目录的最大数量。
    • 默认值通常是 8192。
    • 如果应用程序需要监视大量文件或目录,可能需要增加这个值。
  • fs.inotify.max_queued_events = 16384:允许每个 inotify 实例中排队的事件数量的最大限制为 16384。
  • fs.inotify.max_user_instances = 1024:单个用户可以创建的 inotify 实例的最大数量为 1024。
  • fs.inotify.max_user_watches = 1048576:单个用户在所有 inotify 实例中能够监视的文件或目录的最大数量为 1048576。

安装 inotify-tools

tar zxvf inotify-tools-3.14.tar.gz -C /opt/
cd /opt/inotify-tools-3.14
./configure
make -j4 && make install

编写脚本触发同步

vim /opt/inotify.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/"
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /var/www/html/ backuper@192.168.1.22::web_bak/"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
doif [ $(pgrep rsync | wc -l) -le 0 ] ; then$RSYNC_CMDfi
done

使用 inotifywait 监听 /var/www/html/ 目录的文件变化,一旦有变化就触发 rsync 命令同步到备份服务器上。

  1. INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/"

    • 定义了一个变量 INOTIFY_CMD,存储了使用 inotifywait 监听 /var/www/html/ 目录的命令。
    • -mrq 选项分别表示递归监听、静默模式、以原始格式输出。
    • -e modify,create,attrib,move,delete 选项指定了需要监听的事件类型,包括文件修改、创建、属性变化、移动和删除。
  2. RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /var/www/html/ backuper@192.168.1.22::web_bak/"

    • 定义了一个变量 RSYNC_CMD,存储了用于同步的 rsync 命令。
    • -azH 选项分别表示压缩传输、保持文件权限、保持硬链接。
    • --delete 选项表示删除目标端(备份服务器)上不存在于源端(本地服务器)的文件。
    • --password-file=/etc/server.pass 指定了密码文件的路径,这样 rsync 就可以使用其中的密码进行认证。
    • /var/www/html/ 是本地源目录。
    • backuper@192.168.1.22::web_bak/ 是备份服务器上的目标模块名。
  3. $INOTIFY_CMD | while read DIRECTORY EVENT FILE

    • 使用 read DIRECTORY EVENT FILEinotifywait 的输出分别赋值给 DIRECTORYEVENTFILE,提高了灵活性和可读性。
    • 在每次文件变化时都会输出当前的目录、事件和文件名,方便调试和监控。
    • 如果只需要简单地监听文件变化并进行同步也可以使用"$INOTIFY_CMD | while read AA" 这样简化了 read 命令的使用,只需要一个变量 AA 就可以处理 inotifywait 的输出。
  4. if [ $(pgrep rsync | wc -l) -le 0 ] ; then

    • 检查当前是否已经有 rsync 进程在运行,如果没有则执行同步操作。
    • pgrep rsync | wc -l 是用来统计 rsync 进程的数量。
    • -le 0 表示小于等于 0,即当前没有 rsync 进程在运行时执行后续操作。
  5. $RSYNC_CMD

    • 执行前面定义的 RSYNC_CMD 命令,即执行 rsync 同步操作到备份服务器。

通过这个脚本,当 /var/www/html/ 目录下的文件发生变化时(修改、创建、属性变化、移动、删除),就会触发 rsync 命令将这些变化同步到备份服务器的 web_bak 模块中。

注意事项:

  • 确保 inotify-tools 包已经安装,以便使用 inotifywait 命令。
  • 确保 /etc/server.pass 文件存在且包含正确的密码。
chmod +x /opt/inotify.sh
chmod 777 /var/www/html/
chmod +x /etc/rc.d/rc.local
echo '/opt/inotify.sh' >> /etc/rc.d/rc.local	
echo "123456" > /etc/server.pass
chmod 600 /etc/server.pass
cd /opt
./inotify.sh

运行脚本后应用服务器的/var/www/html/ 将实时同步给备份服务器

这篇关于rsync+inotify组合实现及时远程同步的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/886184

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2