# 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 ### 软件安装 在源服务器上安装必要软件: ```bash # 安装 rsync 和 inotify-tools sudo yum install -y rsync inotify-tools ``` ## 🔑 SSH 免密登录配置 ### 生成 SSH 密钥对 ```bash # 在源服务器上执行 ssh-keygen -t rsa -b 4096 # 直接回车使用默认路径和空密码 ``` ### 分发公钥到目标服务器 ```bash # 分发到第一个目标服务器 ssh-copy-id admin@10.99.11.57 # 分发到第二个目标服务器 ssh-copy-id admin@10.101.3.43 ``` ### 验证 SSH 连接 ```bash 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` ### 脚本内容 ```bash #!/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 ``` ### 设置脚本权限 ```bash chmod +x /home/admin/sync_script.sh ``` ## 🔧 Systemd 服务配置 ### 服务文件位置 `/etc/systemd/system/rsync-realtime.service` ### 服务文件内容 ```ini [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 ``` ### 服务管理命令 ```bash # 重新加载 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 ``` ## ✅ 功能验证 ### 测试文件同步 ```bash # 在源服务器创建测试文件 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_*" ``` ### 监控同步日志 ```bash # 查看实时同步日志 tail -f /home/admin/rsync_sync.log # 查看 systemd 服务日志 sudo journalctl -u rsync-realtime.service -f ``` ## 🐛 故障排除 ### 常见问题及解决方案 #### 1. SSH 权限被拒绝 ```bash # 检查 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` - 记录所有同步操作