一 上行同步相关概念
1,上行同步是什么
上行同步是指从本地(发起端)向远程(同步源)服务器推送数据的过程。在这种模式下:
- 本地机器作为数据的源头,通常包含需要更新或备份到远程服务器的文件和目录。
- 远程服务器作为数据的接收端,等待接收并整合来自本地机器的更改。
2,上行同步应用场景
备份本地数据到云端:用户将个人计算机或服务器上的重要数据同步到云存储服务或远程备份服务器,确保数据的安全性和可用性。
代码版本控制提交:开发者将本地开发环境中的代码更改推送到中央代码仓库(如Git服务器),实现团队协作和版本控制。
日志或监控数据上传:设备或系统将生成的日志文件、监控数据等实时或定时上传到中心分析服务器,便于集中管理和分析。
3,上行同步 注意事项
实时上行同步可以通过结合 rsync
和 inotify
等工具实现。inotify
能够监控本地文件系统的事件(如文件创建、修改、删除),一旦检测到变化,立即触发 rsync
命令执行同步操作,确保远程服务器几乎实时地获得本地的最新数据。
4,inotify 作用
为了可以去实时同步 (监控数据,有数据变化就做rsync)
因为 inotify 通知机制由 Linux 内核提供,因此主要做本机监控,在触发式备份中应用时更适合上行同步。
二 上行同步架构图
1,架构图
2,什么叫应用服务器
应用服务器是一种专用的软件服务,其主要职责是为应用程序提供运行环境和支持。它扮演着中间层的角色,处于客户端(如Web浏览器、移动应用程序等)与后端系统(如数据库、文件系统、其他服务等)之间,负责处理客户端的请求、执行业务逻辑、管理会话状态、保障数据安全以及提供必要的资源调度和管理功能。应用服务器是一种专用的软件服务,其主要职责是为应用程序提供运行环境和支持。它扮演着中间层的角色,处于客户端(如Web浏览器、移动应用程序等)与后端系统(如数据库、文件系统、其他服务等)之间,负责处理客户端的请求、执行业务逻辑、管理会话状态、保障数据安全以及提供必要的资源调度和管理功能。
3,具体解释架构图
A 是服务端 B客户端
具体来说,如果您指的是利用inotify来触发上行同步的过程,那么inotify应该被安装在客户端。客户端通过配置inotify监听本地文件系统的特定变化,一旦检测到相关事件(如文件修改),就触发上行同步逻辑,将变动的数据上传到服务端。这样,inotify作为触发同步动作的机制,帮助客户端实现了数据变更的实时感知和及时上传。
三 inotify
用 inotify 机制还需要安装 inotify-tools,以便提供 inotifywait、inotifywatch 辅助工具程序,用来监控、汇总改动情况。
inotifywait:可监控modify(修改)、create(创建)、move(移动)、delete(删除)、attrib(属性更改)等各种事件,一有变动立即输出结果。
inotifywatch:可用来收集文件系统变动情况,并在运行结束后输出汇总的变化情况。
四 实验模拟上行同步
1,实验环境
99 机器为服务端 77机器为客户端 搭建rsync 上行同步,将77机器的数据实时同步,上传到99机器。
因此99机器建立一个存放同步数据的文件夹,并且要加其他人可写可读的权限
77机器 配置inotify检测 数据的变化,再用rsync 命令同步到99机器,为了达到实时同步,可以使用脚本。
2, 99 服务端
2.1 修改rsync 的配置文件
代码如下:
# /etc/rsyncd: configuration file for rsync daemon mode # See rsyncd.conf man page for more options. # configuration example: uid = root gid = root use chroot = yes address = 192.168.217.99 port 873 # max connections = 4 pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log # exclude = lost+found/ # transfer logging = yes # timeout = 900 # ignore nonreadable = yes hosts allow = 192.168.217.0/24 dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 [ccc] path = /opt/ccc/ comment = zhushi read only= no auth users = wyq secrets file = /etc/rsyncd_users.db
2.2 以守护方式重新启动服务端的rsync
首先删掉进程文件
再以守护启动 。在守护进程模式下,rsync
会作为一个持续运行的服务,监听特定的网络接口和端口,等待来自客户端的连接请求,以执行文件同步任务
2.3 建存放同步的文件夹 加权限
3, 77 客户端
3.1 调整 inotify 内核参数
在Linux内核中,默认的inotify机制提供了三个调控参数:
max_queue_events(监控事件队列,默认值为16384)、
max_user_instances(最多监控实例数,默认值为128)、
max_user_watches(每个实例最多监控文件数,默认值为8192)
当要监控的目录、文件数量较多或者变化较频繁时,建议加大这三个参数的值。
查看inotify 内核参数 所在位置/proc/sys/fs/inotify/
修改inotify 内核参数 vim /etc/sysctl.conf
建议的数值按生产环境需求:
sysctl -p 刷新内核参数
备注:
-p
选项(或--load
)告诉sysctl
命令从指定的配置文件加载内核参数设置,并将它们应用到当前运行的系统中。如果没有指定文件,sysctl
默认会加载/etc/sysctl.conf
文件。
3.2 创建 客户机上的 同步的文件夹 并加权限
3.3 下载安装 inotify
解压 压缩包
进到 包里 ./configure make make install
3.4 使用inotifywait 命令 跟踪同步文件夹的状态
inotifywait -mrq -e modify,create,move,delete /var/www/html/log #选项“-e”:用来指定要监控哪些事件 #选项“-m”:表示持续监控 #选项“-r”:表示递归整个目录 #选项“-q”:简化输出信息
当我们另外一个客户端终端 新建文件时 inotify 会检测到,并以下面的格式输出内容
3.5 用脚本让rsync 实时触发
脚本代码如下:
#!/bin/bash INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/log" RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /var/www/html/log wyq@192.168.217.99::ccc/" $INOTIFY_CMD | while read DIRECTORY EVENT FILE ##while判断是否接收到监控记录 do if [ $(pgrep rsync | wc -l) -le 0 ] ; then $RSYNC_CMD fi done
解释脚本:
- 执行
INOTIFY_CMD
命令,其输出(即监控到的事件信息)通过管道 (|
) 传递给后面的while
循环。 - 循环内部:
read DIRECTORY EVENT FILE
:读取inotifywait
输出的每一行,将其按空格分隔成三个变量:DIRECTORY
(发生事件的目录)、EVENT
(事件类型)和FILE
(受影响的文件名)。if [ $(pgrep rsync | wc -l) -le 0 ] ; then
:检查当前系统中是否存在正在运行的rsync
进程。pgrep rsync
查找与rsync
命令匹配的进程 ID,wc -l
统计返回的行数。如果行数小于等于0,即没有正在运行的rsync
进程,则执行if
语句块内的命令。$RSYNC_CMD
:当满足条件(无其他rsync
进程在运行)时,执行RSYNC_CMD
定义的rsync
同步命令,将/var/www/html/
下的文件变化同步到远程服务器。
3.6 给脚本加执行 权限 并让脚本开机自启
/etc/rc.d/rc.local
: 这是目标文件路径,通常用于存放系统启动时需要执行的自定义脚本或命令
执行 echo '/opt/inotify.sh' >> /etc/rc.d/rc.local
命令后,会在 /etc/rc.d/rc.local
文件末尾添加一行内容 '/opt/inotify.sh'
。这样,在系统下次启动时,会按照文件中的指令顺序执行 /opt/inotify.sh
脚本。这样做的目的是确保上述提到的基于 inotifywait
和 rsync
实现的文件同步脚本能够在系统启动后自动运行,从而持续监控并同步指定目录的文件变化至远程服务器。
需要注意的是,不同 Linux 发行版对 rc.local
的支持程度和配置可能略有差异,确保你的系统支持并已启用 rc.local
自启动功能。此外,确保 /opt/inotify.sh
脚本具有可执行权限(可通过 chmod +x /opt/inotify.sh
命令赋予),且脚本内容本身无误,能够正常运行。
4 ,检测实时同步效果
首先 77客户端执行脚本
然后再 客户端的同步文件夹 /var/www/html/log/ 不停写文件 可以看到inotify 是可以检测的到的
(这一步可以不做,只是为了展示实验效果)
然后去到服务端的 同步文件夹 /opt/ccc/ 可以看到文件被客户端上传过来了
五 上行同步出错 排错
笔者在做该实验模拟时,脚本达不到实时同步的效果。脚本加了执行权限,客户端和服务端的同步文件夹也给足了权限。但是客户端依旧上传不了。
后经过排错发现,我需要先关闭客户端的rsync, 再执行脚本
因为客户端 如果在运行rsync, 那脚本中 pgrep rsync 只会大于0 从而不会执行while 循环,达到实时同步的效果。
六 总结
Rsync是一个远程同步命令,实现了复制统计比较全方位的数据同步
1.上行同步——上传
客户端(源服务器),通过Rsync命令,同步给服务端(目标服务器),客户端备份数据到服务端
上行同步过程:
首先在客户端和服务器之间建立一个连接,然后比较两个文件;只有在客户端上创建新的或者已更改的文件才会被上传到服务器
一般结合Inotify(文件实时监控)进行使用
2.下行同步——下载
服务器(源服务器),通过Rsync命令,同步给客户端(目标服务器),服务端备份数据到客户端
下行同步过程:
Rsync首先在服务器和客户端之间建立一个连接,然后比较两个文件,只有在服务端上新建的或者已更改的文件才会被下载到客户端