使用 tunasync 搭建开源镜像站

Posted by WeYo. 转载请注明出处:http://weyo.me/pages/techs/how-to-make-a-mirror-site/

在公司的企业私有云平台建立完成之后,为了便于云主机操作系统与软件快速部署更新,需要搭建企业级内网的开源镜像站。调研了国内各大开源镜像站点的技术之后,最终决定使用清华大学开源软件镜像站开发的镜像管理器 tunasync 来构建云平台的软件镜像服务,毕竟使用成熟的镜像管理器比从头造轮子还是方便了许多,镜像站不是云的核心服务也不需要投入太多人力去做开发。

本文介绍了从0开始搭建一个内网开源镜像站并为用户提供 web 访问服务的全过程,希望对有构建内网镜像站服务需求的同学有所帮助。

1. 准备工作

镜像站需要一台服务器,如果有条件,建议准备一台专用的X86物理服务器作为镜像站的服务器。服务器推荐配置:

CPU: 8 核心 2.5GHz 以上
内存: 64 GB以上
硬盘: 3TB 以上
网络: 千兆上下行带宽

当然,如果条件不具备,以上配置均可以无视,选择自己最好配置的机器即可,毕竟服务器配置还是取决于最终用户的需求。

特别说要说明的是,硬盘大小要求必须超过需要同步的源文件大小,比如需要同时同步 CentOS 与 Ubuntu,就需要准备一块 1.6T 以上大小的硬盘。每个镜像的具体大小可以在清华大学开源软件镜像站 同步状态 页面查到。

2. 同步源与架构选择

在官方提供的源列表中选择最方便的同步源(最好是支持 rsync 的国内镜像源,但国内目前提供 rsync 服务的镜像源不多,以下是网络收集的部分 rsync 源)。

Ubuntu 源列表:https://launchpad.net/ubuntu/+archivemirrors

rsync://mirrors.shuosc.org/ubuntu/
rsync://mirrors.sohu.com/ubuntu/
rsync://mirrors.tuna.tsinghua.edu.cn/ubuntu/
rsync://mirrors.ustc.edu.cn/ubuntu/
rsync://mirrors.yun-idc.com/ubuntu/

CentOS 源列表:https://www.centos.org/download/mirrors/

rsync://mirrors.tuna.tsinghua.edu.cn/centos/
rsync://mirror.es.its.nyu.edu/centos/
rsync://centos.sonn.com/CentOS/

EPEL 源列表:https://admin.fedoraproject.org/mirrormanager/mirrors/EPEL

rsync://mirrors.yun-idc.com/epel
rsync://rsync.mirrors.ustc.edu.cn/epel

3. 同步工具

同步原理是使用 rsync 做增量同步。“搭建开源镜像站”一文介绍了几种同步工具,经过验证,还是清华大学开源软件镜像站开发的 tunasync 最方便易用,所以这里使用 tunasync 来做同步。

环境与配置
tunasync 使用 Golang 开发,如果使用项目源码编译程序,需要配置 Golang 环境。

tunasync 项目提供预编译版程序,为了简化操作(偷懒),可以直接从 Github releases 下载使用预编译版本。

4. 系统配置

在操作系统中做如下配置初始化镜像服务器环境。

创建用户及用户组

groupadd -g 2001 mirrorgroup
useradd -u 2101 -g mirrorgroup mirrors
passwd mirrors

注意,以下所有操作如无特殊声明均使用mirrors用户。

建立应用及数据目录

建立程序目录:

mkdir /home/mirrors/tunasync
mkdir /home/mirrors/tunasync/conf
mkdir /home/mirrors/tunasync/db

建立镜像数据目录(使用root用户创建):

mkdir /mirrors

修改数据目录用户(使用root用户):

chown -R mirrors:mirrorgroup /mirrors

部署 tunasync

下载 tunasync-linux-bin.tar.gz 到 /home/mirrors/tunasync 目录,随后解压缩,生成 tunasync 可执行文件。

配置环境变量

编辑 ~/.bash_profile 文件,增加 TUNAPATH:

TUNAPATH=/home/mirrors/tunasync
PATH=$PATH:$TUNAPATH

并执行

source ~/.bash_profile

使得环境变量生效。

5. 同步应用配置

接下来就是最关键的步骤,配置 tunasync 的同步服务端与客户端。为便于操作管理,tunasync 的所有配置文件统一放置在 /home/mirrors/tunasync/conf/ 目录下。

manager 配置

创建服务端配置文件 /home/mirrors/tunasync/conf/manager.conf,内容如下:

debug = false

[server]
addr = "127.0.0.1"
port = 14242
ssl_cert = ""
ssl_key = ""

[files]
db_type = "bolt"
db_file = "/home/mirrors/tunasync/db/manager.db"
ca_cert = ""

配置说明

  • port:监听端口,由于我下载的预编译版 tunasync 的一个小 bug,这里的 port 需固定配置为 14242
  • ssl_cert与ssl_key:ssl 配置,不需要 ssl 的同学不用配置
  • db_file:数据库文件,目前统一放在 /home/mirrors/tunasync/db/ 目录

worker 配置

根据需要创建需同步的镜像配置文件。以 CentOS 镜像为例,同步 CentOS 需要创建 /home/mirrors/tunasync/conf/worker-centos.conf,文件内容如下:

[global]
name = "centos_worker"
log_dir = "/mirrors/log/tunasync/{{.Name}}"
mirror_dir = "/mirrors"
concurrent = 10
interval = 1440

[manager]
api_base = "http://localhost:14242"
token = "some_token"
ca_cert = ""

[cgroup]
enable = false
base_path = "/sys/fs/cgroup"
group = "tunasync"

[server]
hostname = "localhost"
listen_addr = "127.0.0.1"
listen_port = 16010
ssl_cert = ""
ssl_key = ""

[[mirrors]]
name = "centos"
provider = "rsync"
upstream = "rsync://mirrors.tuna.tsinghua.edu.cn/centos/"
use_ipv6 = false

配置说明

  • global name:worker 进程名称,用于程序识别
  • log_dir:tunasync 的日志路径
  • mirror_dir:镜像下载地址
  • concurrent:并发线程数
  • interval:rsync 同步周期,以分钟为单位
  • api_base:manager 地址,注意,此处需与 manager 所在服务器配置保持一致
  • server listen_port:该 worker 自身的监听端口,如果同一台服务器上有多个 worker,各个 worker 的配置文件中务必配置不同端口
  • mirrors name:镜像名称,tunasync 会在镜像根目录下建立一个该名称的目录用于下载镜像
  • upstream:同步地址,注意,参数最后需要有“/”,否则启动 tunasync 时会报错

6. 启动同步应用

启动 tunasync 需开启 manager 进程与 worker 进程,先启动 manager,后启动 worker。为了便于监控系统进程情况,建立 /mirrors/log/plog/ 目录,所有进程的工作日志在该目录中(注意,此处日志为系统终端输出日志,与 tunasync 自身工作日志不同)。同样的,以下命令由 mirrors 用户操作。

  • 开启manager服务(后台进程):
tunasync manager --config /home/mirrors/tunasync/conf/manager.conf >> /mirrors/log/plog/manager.log &
  • 开启 worker 服务(根据需要同步的镜像开启,这里以 CentOS 为例):
tunasync worker --config /home/mirrors/tunasync/conf/worker-centos.conf >> /mirrors/log/plog/worker-centos.log &

7. 提供 http 服务

镜像下载完成之后可以为内网用户开放 web 访问服务。理论上可以根据需要提供各种 ftp/http/rsync 服务,不过从用户友好性角度考虑,这里提供最常见的 http 服务。

http 服务需要搭建 apache 服务器,可能有些同学不了解 apache 的操作配置,这里也一并介绍下 apache 的搭建过程(基于 CentOS 7 环境),熟悉 apache 的同学可以跳过本章节。

7.1 配置 yum 源

/etc/yum.repos.d 目录下,备份 CentOS-Base.repo,随后下载某个源服务器的 repo 文件(这里以网易的源为例)

mv CentOS-Base.repo CentOS-Base.repo.bak
mv CentOS-Media.repo CentOS-Media.repo.bak
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo

随后运行以下命令生成yum缓存

yum clean all
yum makecache

7.2 安装 apache 服务器

运行 yum install httpd 安装 apache。

7.3 配置apache服务器

编辑 /etc/httpd/conf/httpd.conf 文件,将web目录指向提供的镜像目录(这里以“/mirrors”目录为例。在 httpd.conf 中修改以下配置内容:

DocumentRoot "/mirrors"

添加目录访问权限:

<Directory "/mirrors">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

并根据需要补充 index.html 和配置的 web 文件到 /mirrors 目录。

7.4 防火墙配置

CentOS 7 系统打开http服务端口:

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

7.5 配置访问权限

镜像目录权限设置(DocumentRoot 参数对应的所有层级目录均设置为 755 权限)

chmod 755 /mirrors

SELINUX权限设置

chcon -R -t httpd_sys_content_t /home/mirrors/mirror/

7.6 设置启动项

开启 apache 服务器并设置开机启动项

systemctl start httpd.service
systemctl enable httpd.service

个人网易开源镜像站的样式基础上创建了一个简单的 web 程序,大家可以在 Github/weyo/mirrors 上下载使用(所有 web 文件放到 /mirrors 目录即可)。

至此,同步服务以及 web 访问服务全部搭建完成,内网的小伙伴们可以通过浏览器访问镜像站了 http://服务器IP/

8. 运行维护

tunasync 还提供了一个管理工具 tunasynctl,可以用于对镜像服务做更多维度的管理。

  • 更新镜像信息
tunasynctl set-size -w <worker-id> <mirror> <size>
  • 获取任务状态信息并保存为 json 文件
wget -c http://localhost:14242/jobs -O /mirrors/jobs.json -o /mirrors/log/plog/wget.log

以上任务可以整合为crontab定时任务,并同步到 web 前端页面中。

9. mirrors 项目说明

以上镜像站搭建过程中所使用的脚本、配置、html 文件等源码已经整合到 Github 的 mirrors 项目中,可以直接应用该项目文件搭建镜像站,也欢迎感兴趣的同学多提意见建议。

mirrors 项目的目录结构如下:

mirrors
├─ ─ ─ tunasync              # tunasync 相关文件
│       ├─ ─ conf            # tunasync 配置文件
│       └─ ─ scripts         # 用于获取同步状态的定时脚本
└─ ─ ─ web                   # web 文件
        ├─ ─ index.html
        ├─ ─ .help           # 帮助文件
        └─ ─ .resource       # css/img/js 等资源文件
               ├─ css
               ├─ img
               └─ js

使用方法

  1. 完成上述第 1-4 章节环境准备工作;
  2. 将 tunasync 目录下的文件复制到服务器的 /home/mirrors/tunasync 目录中,本项目中已经配置好 CentOS,EPEL,Ubuntu,Pypi 四个镜像源的配置文件;
  3. 按照第 6 章节说明根据需要选择所需镜像启动 tunasync;
  4. 将 web 目录下的文件复制到服务器的 /mirrors 目录中,同样的,本项目中已经配置好 Web 页面中 CentOS,EPEL,Ubuntu,Pypi 四个镜像源以及相应的帮助文件,可根据需要增减;
  5. 配置并启动 apache 服务器;
  6. tunasync/scripts/updateTunasync.sh 文件配置成 crontab 定时任务,建议定时周期设置在 5-30min 之间。

Reference & 致谢

[1] 搭建开源镜像站
[2] 清华大学开源软件镜像站
[3] 网易开源镜像站
[4] USTC open source software mirror

推荐阅读更多精彩内容