xsync集群分发脚本开发指南
一、需求说明
核心功能需求
- 循环复制文件/目录到所有集群节点的相同路径
- 支持任意位置调用脚本(需配置全局环境变量)
- 兼容普通文件和目录同步
技术指标
- 基于rsync实现增量同步
- 支持多文件参数传递
- 自动创建目标目录结构
- 错误文件路径检测机制
二、架构设计
三、实现详解
1. 脚本创建
#!/bin/bash
# 节点列表(可扩展)
hosts=(hadoop102 hadoop103 hadoop104)
# 参数校验
if [ $# -lt 1 ]; then
echo "Usage: $0 <file1> [file2] ..."
exit 1
fi
# 多节点遍历
for host in ${hosts[@]}; do
echo -e "\n\033[32m========== Syncing to $host ==========\033[0m"
# 多文件处理
for file in "$@"; do
# 路径解析
if [ -e "$file" ]; then
pdir=$(cd -P $(dirname "$file") >/dev/null 2>&1; pwd)
fname=$(basename "$file")
# 目录预创建
ssh $host "mkdir -p $pdir 2>/dev/null"
# 增量同步
rsync -avz --progress $pdir/$fname $host:$pdir/
else
echo -e "\033[31m[WARN] $file does not exist!\033[0m"
fi
done
done
2. 关键技术点
路径处理
pdir=$(cd -P $(dirname "$file") >/dev/null 2>&1; pwd) # 解析物理路径
fname=$(basename "$file") # 获取纯净文件名
同步优化
rsync -avz --progress
# -a 归档模式(保留权限属性)
# -v 详细输出
# -z 压缩传输
# --progress 显示传输进度
3. 部署流程
# 创建个人bin目录
mkdir -p ~/bin && chmod 750 ~/bin
# 设置环境变量(追加到.bashrc)
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc
source ~/.bashrc
# 安装脚本
cp xsync ~/bin/
chmod 755 ~/bin/xsync
# 全局部署(可选)
sudo cp ~/bin/xsync /usr/local/bin/
4. 验证测试
# 测试用例
xsync /etc/hosts # 单文件同步
xsync ~/.ssh/config ~/applogs # 多文件同步
xsync "file with space.txt" # 含空格文件名测试
# 验证方法
# 在所有节点执行:
ls -l <同步路径>
md5sum <同步文件>
四、增强方案
1. 安全增强
# SSH免密配置(所有节点执行)
ssh-keygen -t rsa
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104
2. 错误处理增强
# 添加重试机制
max_retry=3
for ((i=1; i<=$max_retry; i++)); do
rsync -avz $pdir/$fname $host:$pdir/ && break
sleep $((i*2))
done
3. 动态节点配置
# 创建集群配置文件
vim ~/cluster.nodes
----------------------------------
hadoop102
hadoop103
hadoop104
hadoop105
修改脚本:
# 读取配置文件
hosts=($(cat ~/cluster.nodes))
五、环境变量同步
1. 同步配置
# 需要root权限时
sudo xsync /etc/profile.d/my_env.sh
# 普通用户环境变量
xsync ~/.bashrc
2. 批量生效
# 远程执行命令
for host in ${hosts[@]}; do
ssh $host "source /etc/profile"
done
六、生产环境建议
- 权限控制
chmod 755 xsync
- 避免使用777权限,推荐755
- 日志记录
rsync -avz --log-file=/var/log/xsync.log
- 带宽限制
rsync --bwlimit=5000 # 限制5MB/s
- 节点健康检查
ping -c 2 $host >/dev/null || {
echo "$host unreachable"
continue
}
- 版本管理
# 添加版本头
# Version: 2.1
# Last Updated: 2023-08-20
七、排错指南
现象 | 排查步骤 | 解决方案 |
---|---|---|
命令未找到 | 1. 检查$PATH 2. 验证脚本位置 | 配置正确的环境变量路径 |
权限被拒绝 | 1. 检查文件权限 2. 验证ssh配置 | 配置SSH免密登录 |
部分节点同步失败 | 1. 检查网络连通性 2. 验证磁盘空间 | 修复网络或清理目标节点磁盘 |
符号链接同步异常 | 1. 检查rsync参数 2. 验证链接指向 | 添加-L参数处理符号链接 |
## 八、扩展应用
### 1. 定时同步
```bash
# 创建cron任务(每天凌晨同步)
0 2 * * * /usr/local/bin/xsync /data/important
2. 差异化同步
# 排除特定文件类型
rsync --exclude="*.tmp" --exclude="*.log"
3. 邮件通知
# 添加邮件通知功能
if [ $? -eq 0 ]; then
echo "Success" | mail -s "Sync Report" admin@example.com
else
echo "Failed" | mail -s "Sync Alert" admin@example.com
fi