实现细节可以直接跳到第3节
关键词:
自动同步 Linux自动同步 Linux实时同步 master同步slave master与slave文件实时同步
目录
1. 引言
背景介绍
在分布式系统中,多个服务器之间保持配置文件一致性是一个关键问题。例如在配置HDFS文件系统时,不用主机之间的部分配置文件需要保持严格一致,一个主机做出改变其他主机也需要更新,这时文件的同步显得尤为重要。为了避免不同服务器上的文件版本不一致带来的潜在问题,实现文件的实时同步就成了系统稳定性的重要保证。
方案概述
传统的文件同步工具,如 scp
和 ftp
等,需要手动操作,且无法做到实时同步。此外,定时任务(如 cron
)虽然可以自动化文件同步操作,但同步周期较长,无法满足高频率文件变化的需求。而实时自动同步能够在文件发生变化时,立即将更改应用到其他服务器,保证多台机器间的文件始终一致。
方案特点
本方案基于 inotify
和 rsync
,具备以下特点:
- 支持自定义监控目录,可以灵活选择需要同步的文件路径。
- 不限同步主机数量,可以轻松扩展同步范围。
- 支持文件的增删改操作,能够高效处理文件的全生命周期。
- 实现实时同步,监控文件变化并立即同步,保证一致性。
2. 技术选型
inotify
inotify
是 Linux 内核提供的文件系统监控机制,能够监控文件或目录的创建、删除、修改等事件。相比其他文件监控方法,inotify
的优势在于:
- 实时性高,能立即响应文件的变动。
- 内核级别的支持,效率较高且资源占用小。
- 简单易用,结合
inotifywait
可以方便地在脚本中实现文件监控。
rsync
rsync
是一种高效的数据同步工具,支持增量同步、压缩传输等功能。选择 rsync
的原因在于:
- 它的增量同步机制,可以仅传输变化部分的文件,相较于scp可以大量节省带宽。
- 支持压缩和加密传输,保证安全性和高效性。
- 提供丰富的参数配置,如
-a
用于归档模式,-v
显示详细信息,-z
启用压缩等,可以灵活适应不同需求。
Shell脚本
使用 Bash
编写自动化脚本,是因为它具有以下优势:
- 易于集成系统命令,像我们本次用到的
inotifywait
和rsync
命令可以直接调用。 - 脚本语言灵活轻便,适合定制自动化任务。
- 兼容性强,几乎所有 Linux 发行版都支持
Bash
,不需要额外安装复杂的环境。
3. 实现细节
3.1前置配置
ps:这些配置如果做过了就可以跳过。
为了确保不受到不同环境影响,这里我新安装了两台虚拟机来进行测试。
系统版本皆为CentOS 7.9
1. 权限设置
确保监控的目录及文件具有足够的读写权限,特别是在涉及文件删除和同步时,权限不足可能会导致失败。一般可以使用 chmod
命令来调整权限。测试环境下建议暂时root账户操作。
2. 安装 inotify 和 rsync
在部分 Linux 系统中,inotify
和 rsync
是默认自带的。如果系统中没有安装,可以通过包管理器手动安装。
国内记得改一下国内软件包镜像源再手动安装
也可以尝试直接安装:
安装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
通过名字看到我的主机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 免密登录。这样可以避免每次同步文件时都需要手动输入密码,实现自动化操作。
- 在两台主机上分别上生成 SSH 密钥对(假设没有密钥):
ssh-keygen -t rsa
- 将maser公钥复制到 slave 主机上(这句在maser执行):
ssh-copy-id slave
- 将slave 公钥复制到 maser主机上(这句在slave执行):
ssh-copy-id master
- 分别测试 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
会及时监测到 create
、delete
和 modify
等事件。但仔细查看,会发现右侧窗口我们并没有进行删除操作,原因在于使用 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