4.7 KiB
4.7 KiB
Rsync 实时同步服务部署文档
📋 项目概述
实现从源服务器 10.101.2.197 到目标服务器 10.99.11.57 和 10.101.3.43 的文件实时同步,主要同步以下内容:
dibiao_template_*文件扫板底表目录及其内容
🛠 环境准备
系统要求
- 源服务器:CentOS 7 (10.101.2.197)
- 目标服务器:CentOS 7 (10.99.11.57, 10.101.3.43)
- 用户:admin
软件安装
在源服务器上安装必要软件:
# 安装 rsync 和 inotify-tools
sudo yum install -y rsync inotify-tools
🔑 SSH 免密登录配置
生成 SSH 密钥对
# 在源服务器上执行
ssh-keygen -t rsa -b 4096
# 直接回车使用默认路径和空密码
分发公钥到目标服务器
# 分发到第一个目标服务器
ssh-copy-id admin@10.99.11.57
# 分发到第二个目标服务器
ssh-copy-id admin@10.101.3.43
验证 SSH 连接
ssh admin@10.99.11.57 "echo '连接10.99.11.57成功'"
ssh admin@10.101.3.43 "echo '连接10.101.3.43成功'"
📁 同步脚本配置
脚本位置
/home/admin/sync_script.sh
脚本内容
#!/bin/bash
# 同步源目录
SRC_BASE="/home/admin/sftp/deploy"
DEST_HOSTS=("admin@10.99.11.57" "admin@10.101.3.43")
DEST_BASE="/home/admin/sftp/deploy"
LOG_FILE="/home/admin/rsync_sync.log"
# SSH 选项
SSH_OPTS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR"
# 同步函数
sync_files() {
local success=true
for host in "${DEST_HOSTS[@]}"; do
echo "$(date): 同步到 $host..." >> $LOG_FILE
# 使用单个 rsync 命令同步所有模式
rsync -avz --delete \
--include='dibiao_template_*' \
--include='扫板底表/' \
--include='扫板底表/扫板底表*' \
--exclude='*' \
-e "ssh $SSH_OPTS" \
$SRC_BASE/ $host:$DEST_BASE/ >> $LOG_FILE 2>&1
if [ $? -ne 0 ]; then
echo "$(date): 同步到 $host 失败" >> $LOG_FILE
success=false
else
echo "$(date): 同步到 $host 成功" >> $LOG_FILE
fi
done
if $success; then
echo "$(date): 所有同步完成" >> $LOG_FILE
else
echo "$(date): 部分同步失败" >> $LOG_FILE
fi
}
# 记录开始时间
echo "=== 同步脚本启动于: $(date) ===" >> $LOG_FILE
# 初始同步
sync_files
# 实时监控
inotifywait -m -r -e create,close_write,delete,moved_to,moved_from \
--format "%w%f %e" \
$SRC_BASE | while read full_path event
do
filename=$(basename "$full_path")
dir_path=$(dirname "$full_path")
if [[ "$filename" =~ ^dibiao_template_ ]] || \
{ [[ "$dir_path" =~ .*扫板底表.* ]] && [[ "$filename" =~ ^扫板底表 ]]; }; then
echo "$(date): 检测到变化: $full_path" >> $LOG_FILE
sync_files
fi
done
设置脚本权限
chmod +x /home/admin/sync_script.sh
🔧 Systemd 服务配置
服务文件位置
/etc/systemd/system/rsync-realtime.service
服务文件内容
[Unit]
Description=Real-time Rsync Service
After=network.target
[Service]
Type=simple
User=admin
WorkingDirectory=/home/admin
ExecStart=/home/admin/sync_script.sh
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
服务管理命令
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 启用开机自启
sudo systemctl enable rsync-realtime.service
# 启动服务
sudo systemctl start rsync-realtime.service
# 检查服务状态
sudo systemctl status rsync-realtime.service
# 停止服务
sudo systemctl stop rsync-realtime.service
# 重启服务
sudo systemctl restart rsync-realtime.service
# 查看服务日志
sudo journalctl -u rsync-realtime.service -f
✅ 功能验证
测试文件同步
# 在源服务器创建测试文件
cd /home/admin/sftp/deploy/
touch dibiao_template_test_$(date +%s).txt
echo "测试内容" > dibiao_template_testfile.txt
# 在目标服务器验证文件同步
ssh admin@10.99.11.57 "ls -la /home/admin/sftp/deploy/dibiao_template_*"
ssh admin@10.101.3.43 "ls -la /home/admin/sftp/deploy/dibiao_template_*"
监控同步日志
# 查看实时同步日志
tail -f /home/admin/rsync_sync.log
# 查看 systemd 服务日志
sudo journalctl -u rsync-realtime.service -f
🐛 故障排除
常见问题及解决方案
1. SSH 权限被拒绝
# 检查 SSH 密钥权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
# 重新分发公钥
ssh-copy-id admin@目标服务器IP
日志文件说明
- 服务日志:
/home/admin/rsync_sync.log- 记录所有同步操作