Github 的系統(tǒng)內(nèi)部都在用什么開源軟件?
有時(shí)候處理規(guī)模問題***的辦法就是讓事情變得簡單并盡你可能去避免出現(xiàn)這種情況。這是 GitHub 所采用的方法,林納斯·托瓦茲(Linus Torvalds)在十年前開發(fā)了Git源代碼控制工具,GitHub 為該工具提供資料庫服務(wù)(repository service),目前已經(jīng)有了爆炸性的發(fā)展,并成為開源軟件開發(fā)工作的重心之一。
可以理解為什么程序員們會(huì)精挑細(xì)選他們創(chuàng)作代碼用的工具并與他人分享,反過來,他們也會(huì)去調(diào)整和改進(jìn)這些工具。一種非?,F(xiàn)實(shí)的感覺就是,軟件開發(fā)者們“住進(jìn)”這些系統(tǒng)中后,源代碼版本控制系統(tǒng)的工作方式會(huì)對(duì)合作者們的創(chuàng)作過程提供積極或消極的影響。
GitHub 的成立可以追溯到2007年,它的建立者包括目前公司的***運(yùn)營官(COO,Chief Operating Officer)PJ Hyett,***執(zhí)行官(CEO,Chief Executive Officer)Chris Wanstrath,前***執(zhí)行官Tom Preston-Werner,***信息官(CIO,Chief Information Officer)Scott Chacon。這些人當(dāng)時(shí)都在 Rails 框架下開發(fā) Ruby 應(yīng)用程序,并希望通過一個(gè)更好的方式合作編碼,為此他們開始搭建了預(yù)計(jì)在2008年開始運(yùn)行的 GitHub。與其說這是一個(gè)商業(yè)計(jì)劃,他們的開發(fā)更多是為了能有一個(gè)工具幫助他們自動(dòng)化地協(xié)助自己的軟件開發(fā)工作。
事實(shí)證明,GitHub 是世界上***的 Ruby on Rails 應(yīng)用程序,GitHub 系統(tǒng)主管 reckons Sam Lambert 曾和 The Platform(譯者:一家網(wǎng)站 http://www.theplatform.net/) 就該系統(tǒng)做過一次小的討論。Lambert 不方便公開討論 GitHub 有多少行代碼構(gòu)成,沒有公司公布有多少行代碼托管在 GitHub 倉庫,但 Lambert 確實(shí)給我了們一些指標(biāo)數(shù)據(jù),這些數(shù)據(jù)是關(guān)于 GitHub 的使用增長情況,以及系統(tǒng)如何支撐為大約 60000 個(gè)機(jī)構(gòu)或個(gè)人工作的 1000 萬個(gè)程序員維護(hù) 2600 萬個(gè)開源項(xiàng)目。
“基本上它就是一個(gè)簡單的棧,對(duì)我們來說它真的很重要,“Lambert 說。“我們?cè)噲D采用盡可能少的東西來保持這個(gè)棧的簡單”。
另一方面,2008 年是創(chuàng)業(yè)公司的一個(gè)分界線(兩年后 Amason Web Service 發(fā)布了 EC2 計(jì)算云),GitHub 可以使用云,***次不需要在基礎(chǔ)建設(shè)上做投資。但是,沒有那么做,公司創(chuàng)始人和他們聘請(qǐng)的工程師已經(jīng)繪制了技術(shù)棧草圖,通過聊天工具見獵購買了一系列創(chuàng)造 性的系統(tǒng)管理,軟件布署工具,基本的 IT 操作都在 GitHub 上運(yùn)行。
當(dāng)然,公司在 GitHub 上有自己的私有倉庫來開發(fā) GitHub。雖然 Lambert 沒有透露這個(gè)構(gòu)成 GitHub 的 Ruby 應(yīng)用的具體大小,但是他告訴我們這個(gè)平臺(tái)在 GitHub 的倉庫里有25萬個(gè) commit,有上百人貢獻(xiàn)了他們的代碼和提交這些變動(dòng)的 commit,盡管不是所有人都在 GitHub 工作。
項(xiàng)目人
“GitHub 最初是為我們自己創(chuàng)建的,我們基本上都是軟件工程師所以我們想要一個(gè)好的工具做開發(fā)。”,Lambert 如是說道,“我們使用 GitHub 去構(gòu)建 GitHub,同時(shí)這也是我們每天去管理所有事物的東西。人力資源和法律團(tuán)隊(duì)在他們的工作流程上也在使用 GitHub。不僅僅只是程序員在使用 GitHub。我們非常幸運(yùn)能夠用其他公司不一定能做的方式完成了我們的代碼。如果你招一些開發(fā)者為廣告系統(tǒng)做開發(fā),除非他們根本不在乎討不討厭廣告,否 則他們是不會(huì)愿意干的。而我們所有的開發(fā)人員都喜歡Git并且所有的工作都圍繞著它,所以我們有為我們每天使用的工具而工作的特殊待遇。 ”
Github 棧的底端是硬件,它由幾百臺(tái)分布在各地?cái)?shù)據(jù)中心的X86服務(wù)器組成。(Github 沒有透露這些服務(wù)器位于何處,但 Lambert 確實(shí)說過,由于全球用戶基數(shù)增長,Github 正在考慮在全球其他地區(qū)建立數(shù)據(jù)中心。)
“我們使用標(biāo)準(zhǔn)供應(yīng)商的現(xiàn)成機(jī)器,” Lambert 說道, 但沒有提及供應(yīng)商的名字和配置. “我們對(duì)軟件運(yùn)行做了很多優(yōu)化,但針對(duì)硬件我們并沒有做不合適的大規(guī)模定制化。隨著規(guī)模變大,我們?cè)噲D讓軟件容錯(cuò)性更好,并且將數(shù)據(jù)拷貝到一次性機(jī)器上, 這樣我們就用不著維修機(jī)器了。你只需要?dú)У羲?,重新將?shù)據(jù)放到另一臺(tái)機(jī)器上。這會(huì)讓購買機(jī)器變得便宜,同時(shí)擴(kuò)展的成本也更低。”
“我們確實(shí)需要構(gòu)建定制化和非比尋常的東西,因?yàn)橐坏┪覀冏隽?,我們就失去了社區(qū)正在做的東西的好處。這也告訴了我們?cè)趺催x擇數(shù)據(jù)庫,因?yàn)?MySQL 是每個(gè)人都在用的數(shù)據(jù)庫。如果你使用它時(shí)碰到問題,這個(gè)問題別人也會(huì)碰到過,你自然不會(huì)碰到誰都無法理解的故障。”
硬件明顯沒有那么有趣 ——尤其對(duì)于軟件工程師來說。但是 Lambert 尤其對(duì)自家開發(fā)的部署系統(tǒng) GPanel 感到興奮,它用 Ruby 開發(fā),掛鉤到 Puppet 配置工具,讓公司里的任何人都可以準(zhǔn)備機(jī)器并在上面發(fā)布軟件。
“這讓我們像在公有云上一樣部署軟件,卻又允許我們享受擁有自己的硬件的所有好處。”
Github 的軟件基礎(chǔ)當(dāng)然是 Linux,Lambert 也說過公司當(dāng)然有足夠的專家來運(yùn)轉(zhuǎn)自己的 Linux。但它沒有這么做,而是簡單地使用 Canonical Ubuntu 分布式服務(wù)器。至于存儲(chǔ) Git 代碼和 Github 代碼倉庫訪問控制系統(tǒng)的其他部分的數(shù)據(jù)庫,Github 依賴 MySQL 關(guān)系數(shù)據(jù)庫。Github 自己維護(hù) Linux 和 MySQL 軟件,以及 Ruby 和 Rails。Github 聘用了 Ruby 和 Rails 社區(qū)的主要維護(hù)者,因此可以推論,Github 在社區(qū)做自己的技術(shù)支持。但事實(shí)上隨著應(yīng)用的規(guī)模擴(kuò)大,Github 同時(shí)擁有自定義版本的 Ruby 和 Rails。
Fork 代碼
“當(dāng)數(shù)據(jù)來臨時(shí),對(duì)我們來說真的是規(guī)模問題,我們正在使用一個(gè)高可用的方式彈性存儲(chǔ)數(shù)據(jù),”Lambert 說道,”它是關(guān)于適應(yīng) Git 具有可擴(kuò)展性和易用性,因?yàn)樗鼜膩頉]有考慮過這一點(diǎn)。我們測量,GitHub 是***的 Ruby on Rails 程序之一 – 許多公司都沒有大規(guī)模的運(yùn)行 Ruby。我們保持精益,做優(yōu)化,以保持這種方式。
我們現(xiàn)階段不完全,不像 Facebook 的 HipHop 和 Facebook 用 PHP 做什么,但我們有人民奉獻(xiàn) Ruby 的核心,使其更快和精益。”
GitHub 調(diào)整了 Ruby 解釋器,并創(chuàng)立了自己的垃圾收集例程,但它也熱衷于定位 Ruby 和 Rails 的錯(cuò)誤盡可能快和獲取代碼修復(fù)到 GitHub 上,應(yīng)用程序,以及輸出到 Ruby 和 Rails 社區(qū)。 ( Ruby 開發(fā)托管在 GitHub 上,因?yàn)檫@樣是為了 Rails。MySQL 的開發(fā)剛搬過來不久,用了甲骨文一些時(shí)間來做到這一點(diǎn)。)
GitHub 可能是開發(fā)者的機(jī)器,用于瘋狂的 Fork 代碼 – 好,瘋狂的 Fork 代碼至少 – 讓 GitHub 費(fèi)力也不以為奇。蘭伯特解釋道:
“我們保持 GitHub 作為一個(gè) Ruby on Rails 應(yīng)用程序的原因是,它是非常容易和快速的學(xué)會(huì)。人們?cè)谠摴?**天上班就開始在 Github上 工作了。我們真的很需要一個(gè)的定制的和與眾不同的構(gòu)建,因?yàn)槿绻覀冞@樣做,我們將失去了所有社區(qū)所帶來的好處。這就是告訴我們的數(shù)據(jù)庫選擇,因?yàn)? MySQL是每個(gè)人都在使用的。如果你遇到 MySQL 的問題,它是已知的,你不會(huì)遇到晦澀難懂并且沒人知道的錯(cuò)誤信息。沒有找不到答案的奇怪錯(cuò)誤,因?yàn)槟阌龅降膯栴},有人已經(jīng)遇到過”。
GitHub 的基礎(chǔ)設(shè)施有 Web 服務(wù)器,代理服務(wù)器,認(rèn)證服務(wù)器,和一堆執(zhí)行有關(guān)倉庫的分析、上傳提交分析、數(shù)百萬托管項(xiàng)目分析的系統(tǒng),但真正核心是存儲(chǔ)庫本身。大多數(shù)這類數(shù)據(jù)是文本, 當(dāng)然,這不會(huì)占用很大的空間,相比一些更豐富照片,視頻和音頻媒體更能充塞互聯(lián)網(wǎng)后面的磁盤驅(qū)動(dòng)器。
奇怪的是,GitHub 沒有使用傳統(tǒng)的數(shù)據(jù)壓縮方式壓縮文本數(shù)據(jù),但它有自己的壓縮方式來節(jié)省空間。如果一個(gè)項(xiàng)目被 Fork,只在 Fork 中保存對(duì)原來的更改。 (我們假定這個(gè)方法也可以讓你輕松地找出變化,在每一個(gè) Fork 中迭代。)如果 GitHub 上保存每一個(gè)變化,每一個(gè) Fork,它會(huì)很快有數(shù)不清的PB級(jí)數(shù)據(jù),傳統(tǒng)的數(shù)據(jù)壓縮會(huì)系統(tǒng)變慢。事實(shí)證明,即使每天從程序員接受數(shù)百 GB 字節(jié)的新數(shù)據(jù),整個(gè) GitHub 的資源庫的大小也是被度量在數(shù)百 TB 級(jí)。
在某些時(shí)候,在互聯(lián)網(wǎng)上有很多貓的照片,所有貓的照片來自 master 貓的照片,并根據(jù)變化方式存儲(chǔ)在 Fork 中 (譯者注:這里做個(gè)比喻,形容 github 的 Fork 只存儲(chǔ)與 Fork 之前的差別)(我們有點(diǎn)開玩笑。)
“有很多公司說他們已經(jīng)到達(dá) TB 和 PB 級(jí)的數(shù)據(jù),你問他們那都是些什么數(shù)據(jù),它們通常只是垃圾,” Lambert 笑著說。“大多大數(shù)據(jù)公司僅僅用來存儲(chǔ)事件 —— 這些基本上都是沒用的。我們非常自豪于我們一直保持著精益和優(yōu)化,我們不會(huì)存儲(chǔ)大量無用的數(shù)據(jù)。相對(duì)于我們的競爭對(duì)手,存儲(chǔ)到倉庫的比率顯示了我們非常非 常地精益。我們盡可能不去存儲(chǔ)數(shù)據(jù),因?yàn)槲覀冇幸恍┓浅V悄艿臇|西在后端讓我們保持松散和分叉。我們有很多 Git,但我們還是會(huì)盡我們所能去優(yōu)化。”
回顧 GitHub 的發(fā)展經(jīng)歷,從公司到老舊的學(xué)校,都可以快速簡單地獲取指定的存儲(chǔ)和計(jì)算能力并啟動(dòng)它們。
“我們總是領(lǐng)先一步,我不能說是壓力驅(qū)使,但我們確實(shí)有壓力“Lambert 沒有具體說明集群是如何快速發(fā)展的。“我們每天有數(shù)百 G 的新數(shù)據(jù),并且倉庫的使用規(guī)??焖僭鲩L,但我們創(chuàng)建了基礎(chǔ)設(shè)施,可以和業(yè)務(wù)增長保持同步擴(kuò)展”,這是因?yàn)槲覀兊挠?jì)劃做得很好,現(xiàn)在也沒有變慢的跡象。“
如果 GitHub 像其他 hyperscaler 一樣,它的基礎(chǔ)設(shè)施發(fā)展會(huì)滯后于推動(dòng)基礎(chǔ)設(shè)施的因素發(fā)展。很難去擴(kuò)展服務(wù),存儲(chǔ)和用戶,這也是為什么在 hyperscaler 有這么多的工程創(chuàng)造力。
使用公共的 Github 倉庫是免費(fèi)的,但是上面的代碼可以被任何感興趣的人獲取和 fork。GitHub 有償提供私有倉庫,這是它計(jì)劃盈利的方式。價(jià)格從 7 美元每個(gè)月的包含 5 個(gè)私有倉庫的個(gè)人計(jì)劃到200美元的程序員團(tuán)隊(duì)可共享 125 個(gè)私有倉庫的商業(yè)計(jì)劃。對(duì)于那些需要在內(nèi)部搭建 Github 來開發(fā)代碼的公司,可以購買 GitHub Enterprise 授權(quán),售價(jià) 2,500 美元,每年可安裝 10 個(gè)主機(jī),并且跟 Github 有同樣的外觀。GitHub Enterprise 可以在內(nèi)部主機(jī)上搭建,也可以搭建在 Amazon Web Services 或者 Microsoft Azure 公有云上。目前 GitHub 和 GitHub Enterprise 由同一個(gè)支持團(tuán)隊(duì)維護(hù),但是如果你要在 GitHub Enterprise 上做內(nèi)部開發(fā)并想開源到 GitHub,沒有自動(dòng)化的方式來完成。但 Lambert 表示存在空間。
除了核心Ruby on Rails應(yīng)用程序和存儲(chǔ)算法把GIT中的代碼存放到文件服務(wù)器,GitHub也正在工作于其它應(yīng)用上。 “有些技術(shù)你只是沒有把它下架,因?yàn)槭澜缟衔覀兪?**的代碼托管商,我們有很多定制領(lǐng)域的問題,”蘭伯特說。
向前發(fā)展的其中一個(gè)重點(diǎn)領(lǐng)域是,提供了一組更豐富的關(guān)于程序員的項(xiàng)目分析和工作分析,因?yàn)楹芏喙径荚谑褂瞄_源軟件,以此來吸引人才。這就是為什么 GitHub將擴(kuò)展到新的市場,有很多變化的文檔和Fork是協(xié)作過程的一部分。就像GitHub里面的團(tuán)隊(duì)一樣,使用該工具來跟蹤項(xiàng)目,架構(gòu)師,音樂家 和其他工匠開始使用該工具,這可能為Github提供了另一波增長。
GitHub 在 2012 年的 7 月***輪風(fēng)險(xiǎn)融,從 Andressen Horowitz 那里資籌集了 1 億美元,和今年 7 月的第二輪融資,從紅杉資本和 Andreessen Horowitz,Thrive Capital 和 Institutional Venture Partners 籌集了另外 2.5 億美元,該公司尚未公開,但鑒于其融資的估值約為 20 億美元,和現(xiàn)金增長其基礎(chǔ),并擴(kuò)大它的目標(biāo)市場。
ChatOps 文化與分布式開發(fā)
GitHub 的一個(gè)重要?jiǎng)?chuàng)新,嚴(yán)格的講,不是代碼部分,但絕對(duì)是公司 Hubot 的一部分,這是公司使用的一個(gè)聊天機(jī)器人系統(tǒng)管理接口。這種方法通常被稱為 ChatOps,給部署操作起別名,通過聊天機(jī)器人,用聊天的方式做 DevOps。在 GitHub 里一切都使用它。