一、前言
在日常的开发和协作工作中,随着团队规模的慢慢增大,很多人都会遇到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。下面我们会详细说一下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文件,并且添加新的用户。相信这个功能在未来会更加强大。