社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

Github Enterprise负载调教之——LFS独立服务器

Kivinsae • 7 年前 • 385 次点击  
阅读 27

Github Enterprise负载调教之——LFS独立服务器

一、前言

在日常的开发和协作工作中,随着团队规模的慢慢增大,很多人都会遇到Github Enterprise(简称GHE)服务器负载过高或者存储空间不足的现象,尤其是游戏或者多媒体等相关行业的开发人员,处于保密和业务需求,在git推送的过程中往往会有海量的的二进制媒体文件,如果读过我之前的文章GIT工具简单学习总结的话,就会发现在git默认的业务逻辑中,所有文件的每一次push或者merge都相当于重新向服务器上传一次,这个逻辑虽然保证了分布式开发的可用性和稳定性,但是事实上存在一个问题:对于大型文件,推送N次就会多占用(N-1)倍的体积,尤其是二进制媒体文件往往是更新率极低的。这样就会导致一段时间之后,团队在使用GHE时会发现系统负载动不动变高,尤其是在大文件推送的时候。

二、LFS技术

这个时候,一个开源项目横空出世了。大概是在2015年左右,git-lfs正式发布,这个技术从根本上改变了大文件占用所带来的一切问题。所有的lfs标记的文件都会通过lfs系统进行单独推送,而不会像普通的repo文件一样,在每次mergepush的时候都被重新推送一次。这样的改变大大节省了系统的负载和磁盘占用,对无数团队来说真的是救人于水火。

可是,人是贪得无厌的。随着项目体积的庞大和硬件技术的提升,尤其是近几年手机性能的飞速发展,移动项目的二进制文件的数量越来越多,同时体积也飞速变大,尽管LFS的业务逻辑依然能够承载这些推送的请求,但是在数千人的大型团队里,如果GHE的架设架构不是分布式,或者说总性能不足的话,亦或者出现高并发集中推送的时候,会出现GHE本身的严重卡顿甚至掉线。这种掉线很多时候就是由于过多的LFS推送导致的。因此,把LFS-serverGHE独立出来的业务请求就出现。下面会详细介绍配置的过程,总的来说还是非常简单的。

三、搭设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服务器分流带来的流畅度提升和开发爽快感了。

前往客户端服务器,进入需要使用LFSrepo目录,在里面新建一个.lfsconfig,在里面设置相关的服务地址,然后保存即可:

$ vim ./.lfsconfig
------------------
[lfs]
    url = "http://$USER:$PASSWD@$HOSTNAME:9999/"
复制代码

之后,我们可以直接像什么都没有变化一样无感知使用LFS服务了,而事实上的上传工作会交给刚才配置的服务器来进行,减少了GHE主机的压力。

五、前端

事实上服务器不仅仅为我们提供了LFS上传的分流服务,我们其实也可以通过网页进行相关信息的查看,直接在浏览器里面输入http://$HOSTNAME:9999/mgmt,就可以进入前端管理界面,我们可以看到我们推送的LFS文件,并且添加新的用户。相信这个功能在未来会更加强大。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/29573