IMVU是國外一家游戲社交網絡公司,《精益創業》作者是其創建者之一。我在2011年由InfoQ組織的QCon大會上分享的《持續交付》相關話題中介紹過該公司的情況。那時該公司只有不到40名工程師,每天部署50次。在部署前需要運行一個很大的單元測試集合,總運行時間為15~20分鐘(當然是分布式執行,而不是在一臺機器上啦)。一旦通過,即可部署到生產環境中。當然,這么做有一個前提是有一個強大的監控系統,他們把它叫做“免疫系統”。下面就是這個免疫系統的升級過程介紹,以及他們開源出來的監控工具istatd。
在 IMVU,每天向生產環境部署代碼達到50次之多(而工程師人數還不到50)。每當工程師完成一個任務后,都會運行一個巨大的單元測試集合,一旦成功通 過,就會馬上部署到服務器上。這就形成了一個即時反饋環:一旦出錯,就會立即被發現,而工程師對他的修改還記憶猶新,所以修復速度通常也很快。
Buildbot running tests sharded across 36 machines. From http://timothyfitz.com/
這個流程中的一個重要組成部分就是IMVU的“免疫系統”。這個免疫系統監控整個系統的狀態,并偵測突發事件。如果這些突發事件引起足夠大的問題或風險,并 且它與最近某次代碼部署相關的話,這些代碼部署就會被回滾,并將監控圖表與錯誤日志的鏈接發送給相關的工程師,以便其找到問題所在。
在過去很長一段時間里,IMVU使用RRDtool加腳本從memcache中獲取計數值來捕獲數據,并用cacti將這些數據變成圖形。當IMVU公司還比較小的時候,這是一種非常容易上手的方式,,而現在公司已經變得相當大了。兩年前,這個系統開始顯出老態。一年前,IMVU決定找個新方案,而想要解決的問題是:
現有系統只能每5分鐘收集一次數據。這種頻率無法快速地偵測到因壞代碼引起的問題。雖然壞代碼的情況很少,但希望對客戶的影響盡可能地小。
現有系統會根據時間的長短將數據均化后保存,以便長期保存粗粒度的數據。但這也意味著丟失了一些準確性數據。比如,在每個度量維度上的數據波動幅度是多少?最小值是多少?最大值是多少?
數據的保留時間太短。為了確定是當前系統是否表現失常,還是由于是周末的原因才高出一點兒,就需要一周之前的準確數據做基準進行判斷。
這個系統所依賴的度量數據首先被寫入到 memcache中,再通過cacti抓回來放到rrd files里,因此常常會不堪重負,很多計數器會丟失數據。
為 了解決這個問題,IMVU開始尋找新的計數器解決方案。他們試了很多,最后決定用“Graphite”, 好象Etsy也在用它。然而,Graphite好象還是不行 — 當在做度量數據聚合保留時,它只允許用一個聚合函數,而且內建的后臺存儲有一些性能問題,很大程度上可以追溯到它用NFS的分布式模型。
所以,他們開始寫自己的后臺,但前端的圖形生成仍舊使用Graphite。后端程序完全符合Graphite 的要求,并且使用子計數器的概念,通過單一度量項暴露出不同的數據。對于一個圖片中的每個數據點,都可以得到平均值,樣本數,標準差,最大值和最小值。想 做到這一點,需要做大量的工作,而且有很多不太優雅的歪招兒 — 因為Graphite的內部結構簡直就不是為了他們這種情況設計的。而且Graphite使用服務器端渲染的方式,這也就意味著只要幾個工程師在他們的機 器上開著有一打度量項的指示器,并且每10秒刷新一次的話,服務器就會過載,影響度量項的收集工作。
他們無法忍受了,于是不但用自己寫的后端程序,而且還寫了自己的前端程序。這個前端程序是一個HTML5應用,利用客戶端的JavaScript做渲染,分擔服務器端的壓力。同時,利用HTTP做數據傳輸,因此可以使用不同的客戶端——如果必要,還可以用web caching!
最后,為了解決間歇性數據問題,他們利用代理來轉發數據。在每個服務器上運行一個代理,由它接收本地數據,然后再轉發給主服務器。如果這個代理與主服務器的連接中斷,它會將數據保存到緩存里,同時嘗試重新建立連接。
現在,他們決定把這個系統(包括前端和后端)放到了GitHub上開源。如果你有這樣的需求:跟蹤大量的計數器,并且希望豐富的數據,而不只是每個數據點上的一個簡單聚合功能,你可以看看這個工具,它的Wiki在這里:
https://github.com/imvu-open/istatd/wiki
后端程序是C++ 的,線程和網絡部分用的是boost::asio,目前可以保留50萬計數器文件,在RAID5 SSD硬盤的中端戴爾服務器上,每10秒可以更新一次。當前只有Ubuntu 10.04LTS上的構建與打包支持,但任何GCC的reasonable UNIX機器應該都沒有什么問題。
原文轉自:http://letagilefly.com/post/2013/01/imvu-continuous-deployment-9626.html