Github Enterprise負載調教之——LFS獨立伺服器

Kivinsae發表於2019-03-07

一、前言

在日常的開發和協作工作中,隨著團隊規模的慢慢增大,很多人都會遇到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檔案,並且新增新的使用者。相信這個功能在未來會更加強大。

相關文章