企业网站改自适应,阜阳做网站的商户,wap浏览器,高端网站的制作使用rsyncinotify简单实现文件实时双机双向同步
实现思路
使用inotify-tools的inotifywait工具监控文件变化#xff0c;触发后使用rsync做同步。加入系统服务项#xff0c;实现实时监听#xff0c;方便管理。
以下配置操作#xff0c;单向同步#xff0c;只需在单边部…使用rsyncinotify简单实现文件实时双机双向同步
实现思路
使用inotify-tools的inotifywait工具监控文件变化触发后使用rsync做同步。加入系统服务项实现实时监听方便管理。
以下配置操作单向同步只需在单边部署。双机双向需要在两台服务器分别执行。
依赖软件简介
rsync简介
Rsync是一款开源的文件同步和数据传输工具适用于文件同步、各种数据备份等场景。主要功能包括
增量传输仅同步发生变化的文件或目录减少数据传输量和时间。安全性支持通过SSH等安全协议进行远程传输确保数据传输的安全性。跨平台支持可以在Linux和Windows之间进行数据同步。
rsync仅支持单向同步若需要双向同步需要在对端也同时部署。 类似的工具还有Unison和FreeFileSync等提供了更强大的功能和图形界面。
inotify-tools简介
inotify-tools是由Red Hat开发的一款Linux文件系统监控工具具有高效、细粒度和异步的特点能够安全、高性能地监控用户空间文件。还能监控设备、网络、CPU等系统资源的变化。
依赖软件安装
sudo apt update
sudo apt-get install rsync inotify-tools3.22.1.0-2 -y方案一 使用ssh方式传输文件
rsync使用ssh传输指定密码文件的方式不安全因此配合免密使用
ssh免密登录配置
设置允许root用户使用公钥登录。在文件删除同步到对端的场景中使用普通用户ssh容易出现没有权限删除对端文件问题因此使用root用户。默认不允许root用户直接ssh登录需要修改sshd_config配置。 1、设置允许root用户ssh公钥密码登录。用来密钥拷贝时做密码验证
## 修改前先备份
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak# 修改配置修改配置项PermitRootLogin值
# 改为PermitRootLogin yes
sudo vi /etc/ssh/sshd_config# 修改后重启sshd服务
sudo systemctl restart sshd2、生成密钥并拷贝到对端
## 使用ed25519算法生成密钥指定私钥保存路径静默安装无交互使用空密码
ssh-keygen -t ed25519 -C your_emailexample.com -f /root/.ssh/id_ed25519 -q -N ## 指定公钥路径将公钥复制到对端服务器。有交互填对端服务器登录密码
ssh-copy-id -i /root/.ssh/id_ed25519.pub rootip3、修改root用户ssh登录策略。关闭密码验证改为仅使用公钥
# 修改配置修改配置项PermitRootLogin值
# 改为PermitRootLogin prohibit-password
sudo vi /etc/ssh/sshd_config# 修改后重启sshd服务
sudo systemctl restart sshd创建文件同步脚本
注意目录访问权限
#!/bin/bash# 定义源目录和目标主机信息
SOURCE_DIR/path/to/source
REMOTE_USERroot
REMOTE_HOSTremote ip
REMOTE_DIR/path/to/destination# 使用inotify-tools的inotifywait工具监控文件变化并触发同步
inotifywait -m -r -e modify,create,delete,move --format %w%f $SOURCE_DIR | while read FILE; doecho Change detected: $FILErsync -avz --progress --delete -e ssh -o StrictHostKeyCheckingno $SOURCE_DIR/ ${REMOTE_USER}${REMOTE_HOST}:${REMOTE_DIR}/
done创建系统服务项
创建systemd服务文件file-sync.service放置到/etc/systemd/system/
[Unit]
DescriptionFile Sync Service[Service]
# 默认关闭日志输出到syslog调试时可以注释以下配置并重新加载服务
StandardOutputnull
StandardErrornull
# 指定脚本路径注意授权可执行权限
ExecStart/path/file-sync.sh
Restartalways[Install]
WantedBymulti-user.target启用服务
sudo systemctl daemon-reload
sudo systemctl enable file-sync.service
sudo systemctl start file-sync.service常见问题 rsync更新文件时间戳失败 rsync: [generator] failed to set times on “xxx” Operation not permitted 可能是服务器时间不同步也可能是rsync配置的用户组问题不关注权限可以忽略 rsync更新文件用户组失败 rsync [generator] chgrp ‘xxx’ failed: Operation not permitted 可能是rsync配置的用户组问题不关注权限可以忽略 已删除文件同步到对端失败 rsync error: some files/attrs were not transferred (see previous errors) 当前ssh用户无权限删除对端文件建议改为root
方式二 使用rsync-daemon方式传输文件
rsync守护进程rsyncd提供了一个独立的rsync服务器允许远程客户端连接并执行文件同步操作。提供了单独的用户账号区别于操作系统的管理使用rsync://协议做传输。
配置rsync服务
创建/etc/rsyncd.conf文件
# 全局设置
uid root
gid root
use chroot yes
log file /var/log/rsyncd.log
pid file /var/run/rsyncd.pid
# 锁文件位置用于解决冲突
lock file /var/run/rsync.lock# 模块设置。支持同步的文件路径可多个
# 自定义模块名称
[xxx-path]
path /yourPath
comment Path for xxx
read only no
# 当使用rsync rsync://xxx-userip/ 连接时展示支持的模块名称和注释
list yes
# 定义用户名和操作系统用户无关是rsync自己的用户认证体系
auth users xxx-user
# 指定用户名和密码保存文件对端校验用
secrets file /etc/rsyncd.secrets创建rsync认证文件
文件路径为rsyncd.conf里secrets file指定的包含用户名和密码每行一个用户格式为username:password
启用rsync服务
sudo systemctl start rsync
sudo systemctl enable rsync创建文件同步脚本
注意目录访问权限
#!/bin/bashSOURCE_DIR/path/to/source
REMOTE_USERroot
REMOTE_HOSTremote ip
REMOTE_DIR/path/to/destination# 设置变量
LOCAL_DIR/path/to/source
# 用户名为rsyncd.conf文件里auth users定义的非操作系统
REMOTE_USERxxx-user
REMOTE_HOSTremote ip
# 填写rsyncd.conf文件里定义的模块名称会自动关联对应模块里path项路径
REMOTE_MODULExxx-path
LOG_FILE/var/log/file_sync.log# 函数本地到远程同步
sync_local_to_remote() {echo [$(date)] Syncing from local to remote... $LOG_FILErsync -avz --delete --progress \--exclude .sync_lock \--filterprotect .sync_lock \$LOCAL_DIR/ rsync://$REMOTE_USER$REMOTE_HOST/$REMOTE_MODULE $LOG_FILE 21
}# 函数远程到本地同步
sync_remote_to_local() {echo [$(date)] Syncing from remote to local... $LOG_FILErsync -avz --delete --progress \--exclude .sync_lock \--filterprotect .sync_lock \rsync://$REMOTE_USER$REMOTE_HOST/$REMOTE_MODULE/ $LOCAL_DIR $LOG_FILE 21
}# 创建锁文件以防止重复同步
LOCKFILE$LOCAL_DIR/.sync_lockif [ -f $LOCKFILE ]; thenecho [$(date)] Sync is already running, exiting. $LOG_FILEexit 1
fitouch $LOCKFILE# 使用 inotifywait 监听文件系统事件
inotifywait -m -r -e modify,create,delete,move $LOCAL_DIR | while read -r dir action file; do# 确保不因为同步脚本本身触发额外的同步if [ ! -f $LOCKFILE ]; thenbreakfi# 忽略 .sync_lock 文件的变化if [[ $file .sync_lock ]]; thencontinuefi# 检测到变化后进行双向同步sync_local_to_remotesync_remote_to_local
donerm $LOCKFILE创建系统服务项
配置参考上述ssh传输方式章节里的系统服务项创建
ssh传输和rsync-daemon方案的区别
ssh方式需要使用操作系统用户容易出现文件访问权限等问题。而rsync-daemon使用自有的用户体系做文件访问和操作控制更加方便。rsync-daemon需要额外使用rsync服务引入了新的变量服务挂掉会导致文件同步功能不可用。ssh方式传输是推送方式只需要处理本地文件的变化再同步到对端。rsync-daemon传输是拉取方式是在本地发起请求去拉取对端因此在双向同步场景每次同步需要做from/to和to/from两次操作。
冲突解决
冲突发生场景例如同一个文件在双端同时被修改需要合理使用rsync提供的参数或者利用文件锁机制等方式解决。