一、为什么需要分布式YUM仓库

想象一下这个场景:你们公司所有服务器都指向同一个YUM仓库,突然某天这个仓库所在的硬盘坏了,或者网络抽风了。结果就是——所有服务器都没法安装软件包,更新补丁也全部卡住。这种单点故障带来的影响,就像早高峰唯一的地铁线突然停运,整个运维团队都得手忙脚乱。

分布式YUM仓库的核心价值就是冗余自动切换。通过在不同物理节点部署多个仓库副本,配合智能路由机制,即使某个节点挂了,其他节点也能立刻顶上。这就像在多个地铁站设置了备用列车,哪条线故障都能快速疏散乘客。

二、基础环境准备

我们以CentOS 7为例,使用Nginx作为仓库文件服务器,配合rsync实现多节点同步。以下是基础组件清单:

# 在所有仓库节点执行(技术栈:CentOS 7 + Nginx + rsync)
# 安装必要工具
yum install -y nginx createrepo rsync

# 创建仓库目录结构
mkdir -p /data/yum-repo/{centos7,epel}

# 初始化仓库元数据
createrepo /data/yum-repo/centos7
createrepo /data/yum-repo/epel

关键点注释:

  1. /data/yum-repo 是仓库文件的存储根目录
  2. createrepo 命令会生成repodata目录,这是YUM识别仓库的关键

三、搭建多节点同步系统

假设我们有三台服务器(node1-3),需要让它们保持仓库内容完全一致。以下是自动化同步脚本:

# 技术栈:rsync + cron  
# 在node1上配置为主同步节点,编辑同步脚本 /usr/local/bin/repo-sync.sh  

#!/bin/bash
REPO_DIR="/data/yum-repo"
NODES=("node2" "node3")  # 其他节点主机名  

# 同步到其他节点  
for node in ${NODES[@]}; do
    rsync -avz --delete $REPO_DIR/ $node:$REPO_DIR/
done  

# 更新元数据  
find $REPO_DIR -name repodata -exec createrepo --update {} \;

配置定时任务:

chmod +x /usr/local/bin/repo-sync.sh
echo "0 */4 * * * /usr/local/bin/repo-sync.sh" | crontab -

注意事项:

  • 使用--delete参数确保删除的文件也会同步
  • 生产环境建议添加--bwlimit限制带宽占用

四、实现客户端自动故障切换

客户端配置需要解决两个问题:节点探测失败切换。这里我们使用failovermethod参数:

# 技术栈:YUM客户端配置  
# 编辑/etc/yum.repos.d/distributed.repo  

[distributed-base]
name=Distributed YUM Repo
baseurl=http://node1/data/yum-repo/centos7/
       http://node2/data/yum-repo/centos7/
       http://node3/data/yum-repo/centos7/
failovermethod=priority  # 按顺序尝试
enabled=1
gpgcheck=0

# 高级技巧:动态DNS轮询  
# 如果有DNS控制权,可以配置轮询A记录:
# yum-repo.example.com -> node1, node2, node3

参数详解:

  • failovermethod=priority 表示按baseurl顺序尝试
  • 如果配合DNS轮询,可以实现负载均衡效果

五、高级优化方案

对于大规模场景,可以考虑以下增强方案:

1. 仓库健康检查

# 技术栈:Shell健康检查  
# 在客户端预装检查脚本 /usr/local/bin/check-repo.sh  

#!/bin/bash
for url in "node1" "node2" "node3"; do
    if curl -sIf "http://$url/data/yum-repo/centos7/repodata/repomd.xml" | grep 200; then
        echo "http://$url/data/yum-repo/centos7/" > /etc/yum/vars/repoactive
        exit 0
    fi
done
exit 1

2. 结合Pulp项目管理

Pulp是专业的仓库管理平台,提供API和Web界面:

# 技术栈:Pulp3  
# 安装基础服务  
sudo dnf install -y pulp-server  

# 创建RPM仓库  
pulp rpm repository create --name "centos8" --feed https://mirrors.aliyun.com/centos/8/  

六、应用场景与技术对比

典型应用场景:

  • 企业级CI/CD流水线
  • 多地部署的Kubernetes集群
  • 需要ISO 27001合规的金融系统

方案对比表:

方案 优点 缺点
纯rsync 简单直接 无版本控制
Pulp3 完整仓库管理功能 需要额外学习成本
Nexus Repository 支持多种包格式 资源占用较高

七、避坑指南

  1. 元数据不一致问题
    同步后务必在所有节点执行createrepo --update,否则可能出现:

    Error: Package kernel-3.10.0-1160.el7.x86_64.rpm not found
    
  2. 磁盘空间监控
    添加监控规则检测仓库分区使用率:

    df -h /data | awk '/dev/{if ($5 > 90) print "ALERT"}'
    
  3. 权限控制
    建议为Nginx配置基础认证:

    location /data/yum-repo {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/conf.d/repo.passwd;
    }
    

八、总结

分布式YUM仓库就像给系统装上了"备胎系统",通过本文介绍的方案,你可以获得:

  • 99.9%的仓库可用性
  • 分钟级的故障自动恢复
  • 可横向扩展的存储架构

下次当运维同事抱怨"仓库又挂了"的时候,你可以淡定地说:"我们有多节点自动切换"。