一, 前言
在日常的开发和协作工作中, 随着团队规模的慢慢增大, 很多人都会遇到 GitHub Enterprise(简称 GHE)服务器负载过高或者存储空间不足的现象, 尤其是游戏或者多媒体等相关行业的开发人员, 处于保密和业务需求, 在 Git 推送的过程中往往会有海量的的二进制媒体文件, 如果读过我之前的文章 Git 工具简单学习总结的话, 就会发现在 Git 默认的业务逻辑中, 所有文件的每一次 push 或者 merge 都相当于重新向服务器上传一次, 这个逻辑虽然保证了分布式开发的可用性和稳定性, 但是事实上存在一个问题: 对于大型文件, 推送 N 次就会多占用 (N-1) 倍的体积, 尤其是二进制媒体文件往往是更新率极低的. 这样就会导致一段时间之后, 团队在使用 GHE 时会发现系统负载动不动变高, 尤其是在大文件推送的时候.
二, LFS 技术
这个时候, 一个开源项目横空出世了. 大概是在 2015 年左右, Git-lfs 正式发布, 这个技术从根本上改变了大文件占用所带来的一切问题. 所有的 lfs 标记的文件都会通过 lfs 系统进行单独推送, 而不会像普通的 repo 文件一样, 在每次 merge 和 push 的时候都被重新推送一次. 这样的改变大大节省了系统的负载和磁盘占用, 对无数团队来说真的是救人于水火.
可是, 人是贪得无厌的. 随着项目体积的庞大和硬件技术的提升, 尤其是近几年手机性能的飞速发展, 移动项目的二进制文件的数量越来越多, 同时体积也飞速变大, 尽管 LFS 的业务逻辑依然能够承载这些推送的请求, 但是在数千人的大型团队里, 如果 GHE 的架设架构不是分布式, 或者说总性能不足的话, 亦或者出现高并发集中推送的时候, 会出现 GHE 本身的严重卡顿甚至掉线. 这种掉线很多时候就是由于过多的 LFS 推送导致的. 因此, 把 LFS-server 从 GHE 独立出来的业务请求就出现. 下面会详细介绍配置的过程, 总的来说还是非常简单的.
三, 搭设 LFS-server 服务器.
目前在 GitHub 上的 Git-lfs 页面中, 开发组为使用者提供了一个还处于测试状态的 LFS-test-server, 但是经过测试, 这个服务器功能基本已经能够负担多数的 LFS 请求, 事实上 GHE 内建的 LFS 服务本身也是基于这个开源页面 LFS-test-server https://github.com/KKtheGhost/lfs-test-server . 下面我们会详细说一下 LFS server 的搭建过程.
1, 安装环境和程序
- ## 首先安装 go 环境并安装软件, 因为 `LFS server` 使用 go 写的, 此处用 CentOS 为例:
- $ yum install -y go
- ## 然后编辑 / etc/profile 添加环境变量
- $ VIM /etc/profile
- --------------------------
- export GOROOT=$HOME/go # don't forget to create a go/ folder in your home folder
- export PATH=$PATH:$GOROOT/bin
- ## 编辑完毕后 wq 保存并应用配置.
- $ source /etc/profile
- ## 配置完成后, 开始按步骤安装软件
- $ go get GitHub.com/GitHub/lfs-test-server
- $ cd ~
- $ cd go/src/GitHub.com/GitHub/lfs-test-server
- $ go build
到这一步位置, 需要的环境和软件已经安装完毕, 在下一节会介绍启动配置文件的写法.
2, 配置文件 run.sh
因为目前的 LFS Server 还处于未正式发布阶段, 因此还需要用户手动编辑启动脚本去配置启动选项. 相信在未来可以用更加舒服的参数配置模式来进行服务器的启动. 如果动手能力强的话我们可以直接做文件夹映射并把 LFS-server 运行在容器中, 这也是一个很好的选择.
不过本章还是以直接运行服务为例进行讲解. 我们当前已经进入了~/go/src/GitHub.com/GitHub/lfs-test-server 文件夹内, 我们需要配置一个 run.sh 来作为启动脚本. 下面是启动脚本参数的参考表:
- LFS_LISTEN # tcp 监听端口, 默认为: "tcp://:8080"
- LFS_HOST # 服务器地址, 默认是: "localhost:8080"
- LFS_METADB # 服务器用来存储 lfs 数据的数据库文件, 默认是: "lfs.db"
- LFS_CONTENTPATH # 用来存储 lfs 文件的路径, 默认是: "lfs-content", 建议自定义配置
- LFS_ADMINUSER # 初始用户名, 必须建议自定义配置
- LFS_ADMINPASS # 初始密码, 必须建议自定义配置
- LFS_CERT # HTTPS 限定, crt 认证文件路径
- LFS_KEY # HTTPS 限定, key 认证文件路径
- LFS_SCHEME # 默认是 http 模式, 暴露外网时建议使用 https
- LFS_USETUS # 是否开启 TUSD 服务的选项.
- LFS_TUSHOST # 用来启动 TUSD 上传服务的端口, 默认 "localhost:1080"
由于我们是内网服务器, 因此对于安全的需求没有这么高, 只要符合内部安全要求即可, 因此一般推荐 http 模式进行配置. 示例如下:
- #!/bin/bash
- set -eu
- set -o pipefail
- LFS_LISTEN="tcp://:9999"
- LFS_HOST="$HOSTNAME:9999"
- LFS_CONTENTPATH="$HOME/lfs"
- LFS_ADMINUSER="$USER"
- LFS_ADMINPASS="$PASSWD"
- LFS_SCHEME="http"
- export LFS_LISTEN LFS_HOST LFS_CONTENTPATH LFS_ADMINUSER LFS_ADMINPASS LFS_SCHEME
- ./lfs-test-server
在一切配置完成后, 后台启动 run.sh 即可:$ nohup bash run.sh &
四, 用户端简单配置
在服务端进行配置并启动服务后, 客户端只需要非常简单的设置, 就可以体验 LFS 服务器分流带来的流畅度提升和开发爽快感了.
前往客户端服务器, 进入需要使用 LFS 的 repo 目录, 在里面新建一个. lfsconfig, 在里面设置相关的服务地址, 然后保存即可:
- $ VIM ./.lfsconfig
- ------------------
- [lfs]
- url = "http://$USER:$PASSWD@$HOSTNAME:9999/"
之后, 我们可以直接像什么都没有变化一样无感知使用 LFS 服务了, 而事实上的上传工作会交给刚才配置的服务器来进行, 减少了 GHE 主机的压力.
五, 前端
事实上服务器不仅仅为我们提供了 LFS 上传的分流服务, 我们其实也可以通过网页进行相关信息的查看, 直接在浏览器里面输入 http://$HOSTNAME:9999/mgmt, 就可以进入前端管理界面, 我们可以看到我们推送的 LFS 文件, 并且添加新的用户. 相信这个功能在未来会更加强大.
来源: https://juejin.im/post/5c809ad86fb9a049ab0e64aa