linux两台服务器实现开机自动同步文件

Linux两台服务器开机自动同步文件|B服务器重启自动拉取A服务器目录

需求说明

服务器A:172.17.166.10(源服务器,存放原始文件,IP仅为示例,请替换为你的A服务器真实IP)
服务器B:172.17.166.11(目标服务器,开机/重启自动拉取A服务器指定目录全部文件,IP仅为示例,请替换为你的B服务器真实IP)

实现逻辑:全部操作在【服务器B】执行,B开机后自动通过rsync从A拉取文件。
⚠️重要:文中所有出现的IP、目录、用户名全部为示例,部署前务必修改为你自己服务器实际信息。

第一步:服务器B配置免密SSH登录服务器A(必须操作)

登录服务器B,复制下面命令逐条执行:

# 生成ssh密钥,全部回车,不要输入密码
ssh-keygen -t ed25519

# 把公钥分发到服务器A,root为示例用户名,请替换为A服务器实际登录用户名
ssh-copy-id root@172.17.166.10

# 测试免密登录,执行后不需要输入密码直接登录A代表成功
ssh root@172.17.166.10
如果没有ssh-copy-id命令:手动把B服务器 ~/.ssh/id_ed25519.pub 文件内容复制,粘贴到A服务器 ~/.ssh/authorized_keys 文件末尾。

第二步:两台服务器安装rsync工具

服务器A和服务器B都执行对应安装命令:

CentOS / RHEL / Rocky Linux:

yum install -y rsync

Debian / Ubuntu:

apt install -y rsync

第三步:在服务器B创建同步脚本

示例目录:
A服务器源目录:/data/source/(替换为A真实目录,末尾斜杠 /不要丢)
B服务器保存目录:/data/target/(替换为B真实接收目录)
注意:目录末尾的斜杠 / 不能丢,代表同步目录内部全部文件。

登录服务器B,创建脚本文件 /opt/sync_from_a.sh

#!/bin/bash
# 等待网络就绪,防止开机网卡还没启动就执行同步
sleep 8

# ==========请修改下面3项为你自己实际信息==========
SRC_HOST="172.17.166.10"    # A服务器真实IP
SRC_DIR="/data/source/"     # A服务器源目录
DST_DIR="/data/target/"     # B服务器本地保存目录
# =================================================

# 创建本地目录
mkdir -p ${DST_DIR}

# rsync拉取文件
# --delete 参数:B服务器会删除A不存在的文件,实现目录完全镜像;不需要镜像可以删掉--delete
/usr/bin/rsync -avz --delete root@${SRC_HOST}:${SRC_DIR} ${DST_DIR}

保存脚本后,给脚本增加执行权限:

chmod +x /opt/sync_from_a.sh

测试脚本是否可以正常同步

/opt/sync_from_a.sh
执行后看到文件正常下载,代表脚本没问题。

第四步:配置systemd实现开机自动执行

服务器B上创建systemd服务文件:/etc/systemd/system/sync_from_a.service

[Unit]
Description=Auto sync file from server A
After=network.target sshd.service

[Service]
Type=oneshot
ExecStart=/opt/sync_from_a.sh
User=root

[Install]
WantedBy=multi-user.target

执行下面命令生效并设置开机自启:

# 重载systemd配置
systemctl daemon-reload

# 设置开机启动
systemctl enable sync_from_a.service

# 手动运行一次测试
systemctl start sync_from_a.service

# 查看执行日志
journalctl -u sync_from_a.service

第五步:测试重启验证效果

服务器B执行重启命令:

reboot

重启登录B服务器,检查接收目录是否已经拉取A服务器文件。

查看开机同步日志:

journalctl -u sync_from_a.service

可选配置:定时周期性拉取(每10分钟同步一次)

如果希望不仅开机拉取,运行过程中定时拉取,配置crontab定时任务:

crontab -e

粘贴下面一行,保存退出:

*/10 * * * * /opt/sync_from_a.sh >> /var/log/sync_from_a.log 2>&1

常见问题排查

  1. 同步失败优先看日志:journalctl -u sync_from_a.service
  2. 确认A服务器防火墙开放22端口,B可以访问A的22端口
  3. 脚本内sleep 8是等待网络,如果你的服务器开机网络很慢,可以调大sleep数字,例如sleep 12
  4. 如果不用root用户,ssh免密、脚本里面的root全部替换成你的普通用户名,同时保证目录读写权限
  5. 当前方案:开机只执行一次拉取,不是实时监控文件变化;实时同步需要inotify+rsync方案
⚠️提示:--delete 参数会删除B本地A服务器不存在的文件,生产环境谨慎使用;不需要镜像同步直接删除脚本中的 --delete
文章广告横幅
网络违法犯罪举报平台 广告
© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容