錘子的墨村 之 程序猿眼中的REA DevOps

2021-02-24 虎頭錘

最熱門文章:

(今天這個是純IT題材,不懂的人現在逃走還來得及😄😄😄)

錘子兩年前登陸墨爾本時,完全是DevOps小白。面試REA的時候,被問到什麼是Continuous Delivery(持續交付),錘子誠懇地表示「不知道」。面試官不依不饒,「不知道不要緊,你想想怎麼樣才能做到Continuous Delivery?」 錘子回顧了一下自己維護項目時的噩夢,斟酌著用詞說:「這需要好多自動化的工具支持,怎麼測試,怎麼接入不同的網絡,怎麼部署不同的環境,還有資料庫的data migration和回滾,個頂個的都是痛點。」

之前錘子所做過的系統都是Monolith(單體)架構,所以,每次需要重啟生產環境時,真得一而再,再而三地確認。所以當我們Squad(REA引入了Spotify模式[1])的同事給我講解我們的微服務架構[2],和怎麼做Continuous Delivery時,我問:「那最壞的情況就是重啟系統了?」這個同事說:「不,重啟系統是正常情況。」由此,錘子開始慢慢了解REA強大的DevOps。

什麼是 DevOps?

DevOps 集文化理念、實踐和工具於一身,可以提高組織高速交付應用程式和服務的能力,與使用傳統軟體開發和基礎設施管理流程相比,能夠幫助組織更快地發展和改進產品。這種速度使組織能夠更好地服務其客戶,並在市場上更高效地參與競爭。[3]

這幅圖片[3] 可以看到發布生產線。 

如果我們想更好的解釋DevOps,最好的方法是像解釋Agile一樣,把不同人的意見映射到不同的級別 如下所示[4]。

DevOps價值觀:敏捷宣言有效體現了DevOps的基本價值觀 —— 需要稍微修改一點,改成關注發布給客戶的業務或者軟體的整體,而不是簡單的「可工作的軟體」。

DevOps原則:(來源於John Willis的 "CAMS"[5])

文化(Culture): 人和過程優先。

自動化(Automation): 一旦開始理解文化,這是可以開始的一個點。

度量(Measurement):成功的DevOps實現需要儘可能多的度量其能度量的所有東西。

共享(Sharing):共享似的CAMS形成迴路。

DevOps實踐:實現上述的概念和過程用到的特別的技術。

DevOps工具:DevOps原則落地使用到的工具。

接下來讓我們看看REA的DevOps是怎樣契合這些不同的方面。

REA DevOpsREA 價值觀

REA採用了Spotify模式[1] ,你可以通過 The values we live by[6]了解REA的價值觀。

Do it as one team

Do it with heart

Keep it real

inspire it

Own it

Re-imagine it

基於這些價值觀,REA的所有IT小夥伴們一起合作,把最有價值的產品和功能發布給客戶,這一切由分層協作框架支持。

REA DevOps的分層協作

REA DevOps的分層協作框架下,不同層面的問題由不同的組負責,如下圖。 

每個Squads使用DevOps工具鏈開發和維護自己的微服務。詳情會在下面一節進行介紹。

Delivery Engineering團隊,顧名思義,就是為了讓程序猿們更快更好地發布應用,主要職責是工具的開發和管理。包括創建Docker Registry,準備好已經安裝了必要庫的baked Docker image[7],有了這些基準的Docker Images,開發團隊在為自己的微服務構建Docker Image的時可以有效節省時間,還能夠規避各種庫版本不一致的問題。Delivery Engineering還需要為不同部門配置Buildkite,Buildkite的Agents部署在AWS的EC2中,根據連接環境的不同,多個Agents分布在不同的VPC中。

Global Infrastructure & Architecture 團隊負責基礎設施建設,管理維護並開發相應的工具,包括網絡、數據中心、AWS帳號的管理、Splunk的集成等。比如,去年雪梨下大雨,Amazon的機房被水淹了,澳洲大批網站受到影響,也包括我們公司的一小部分,當時苦了GIA team的人了。

所有這些分層協作關注在怎樣自動化整個發布流水線,解決其中的痛點。比如怎麼樣自動化所有流程?怎樣為REA超過40個組管理AWS的帳號?怎麼為AWS裡的測試環境和生產環境配置VPC?怎樣把微服務部署到不同的環境?監控的策略怎麼樣實施,怎麼樣在不同的組之間協調?所有的幾百個微服務,某些微服出了問題怎麼辦等等。想要解決這些問題,就必須有切切實實落地的工具鏈。

所以全工具鏈的配置和開發是Global Infrastructure & Architecture 和Delivery Engineering的職責,而作為程序猿的錘子,則是工具鏈的使用者。

那麼REA的DevOps工具鏈到底是什麼樣的?

REA DevOps全工具鏈

REA實際使用到的全工具鏈包括:

代碼倉庫:github企業版。

構建和部署工具:Buildkite和Jenkins,還有一些老的項目依然在使用Bamboo。

容器平臺:微服務用Docker進行打包,Docker的引入讓公司內部微服務的部署流程一致化。

環境:目前絕大部分的service部署在AWS(Amazon Web Services)中,開發環境和測試環境使用同一套IAM,生產環境使用另一套IAM,三套環境通過Virtual Private Cloud (VPC)的設置進行隔離。不同部門的不同的組在IAM下擁有不同角色和訪問權限。部署採用AWS Cloudformation服務,避免手動創建和更新使用到的AWS的業務。

日誌管理:splunk。Docker已經提供對Splunk的支持,所以所有微服務的日誌都能夠通過Splunk Agent發送到集中的Splunk伺服器,以方便程序猿trouble shooting。完全避免了登陸到不同的機器收集log的窘境。

監控:使用AWS Cloudwatch監控AWS的服務,比如某個SQS對應的dead-letter queue裡是不是收到了消息,或者AWS Lamda執行是不是有錯誤等;NewRelic用來監控網絡和設備的性能;Nagios提供服務可用性監控,可以直接使用REA內部的rea-health-check庫,提供心跳API供Nagios的主動模式使用;通過設置接收相應的消息格式,Nagios也可以使用被動模式監控微服務。一旦無法ping通某個微服務或者在一定時間內沒有收到微服務的消息,那麼會馬上產生一個PagerDuty告警來通知相關人員。

告警:PagerDuty。前面提到的監控工具都可以配置相應的條件來產生告警,產生的告警都會通過PagerDuty用郵件,Slack,電話和簡訊的方式通知給當時的值日人員。PageDuty雖然是全天24小時運行,也只有極少部分高優先級的告警才會在非工作時間發出。還有一個告警的來源是Zendesk Ticket,這種信息通常直接來自於客戶。就我們組而言,基本上都是一些數據錯誤,需要個別修正。

協同工作:Leankit。

終於可以講講作為工具鏈使用者的程序猿錘子,日常工作是怎樣的了。

程序猿DevOps日常1. Coding

前面提到過代碼庫使用github企業版,採用github flow[8]。

開發業務的過程中,大部分squad採用微服務的方式。

微服務

微服務有時被人詬病違背了DRY原則,但是Monolith架構下各種服務間的強耦合對於擴展部署都很痛苦,所以Don’t repeat yourself 誠然不錯,微服務架構下,定義好邊界之後(APIs),每個微服務獨立存在,獨立部署且可擴展,即使有一些簡單的複製粘貼,其帶來的靈活性也是Monolith架構不具備的。

在REA內部,為了保證某種程度的一致性,我們的微服務都需要遵循12 Factor[9]:

不過不管微服務設計得如何精良,當一個「小而美」的團隊(5-6名開發人員)需要同時開發維護生產環境中10個以上的微服務時,服務運行和管理上的額外複雜性使得全自動構建和部署變得不可或缺。DevOps的工具鏈恰恰提供了發布流水線自動化的功能。

微服務需要的部署腳本和AWS Cloudformation的信息,提供給不同監控工具的接口,fried Docker image[7] 定義等,也都是代碼的一部分,需要開發人員完成。

2. 構建和部署

構建和部署就以Buildkite為例子,這是一個微服務的buildkite腳本。 

構建

這個流程裡代碼檢查和單元測試自動化起來很容易,那麼怎麼做整合測試?REA基於Ian Robinson提出的用消費者驅動的契約進行面向服務開發的模式[10]開發了 開源的Pact 測試框架[11],用輕量級的契約測試來代替厚重的集成測試。Pact在消費端用單元測試的形式(更輕)來生成 pact 契約,服務端通過驗證契約來保證兩者穩定集成。一旦有一端契約未經協商發生改變,那麼Pact測試就會失敗。

構建成功之後,會把微服務打包成Docker Image然後上傳到Docker Registry。我們會選擇在Delivery Engineering提供的基準Docker Image之上來打包,這是一個微服務的Dockerfile的例子:

用這種方式,在buildkite上打包並上傳到Docker Registry的時間小於三分鐘。 

部署

開始進行部署時,部署腳本會調用Delivery Engineering開發的rea-shipper [12]。

不同的環境下,Buildkite會選擇不同的Agent進行部署:Test 環境的non-prod-corp:default和Prod環境的prod-corp:default。部署的時間通常10分鐘以內,下面是一個微服務部署到test(6分1秒)和prod(5分43秒)的時間,圖中能夠看到Cloudformation更新的步驟。 

部署是全自動的,不過考慮到生產環境的重要性,我們還是選擇謹慎地Block,需要某個開發人員手動觸發。觸發的時間沒有特別的規定,不過在我們的kanban裡面,deploy是最後一步,所以只有真正部署到生產環境,這個卡片才算完成。如果部署過程中出現失敗,rea-shipper不會切換運行中的ASG(Auto Scalling Group),所以並不影響業務。如果部署的新版本發現某個bug,需要緊急回滾,因為所有的docker image都有版本信息,可以很容易的找到之前版本的docker image進行部署。

3. 運維

日常的運維如下圖所示:

需要處理的問題一般有兩種:

我們Tribe有5個Squad,除了有超過30個microservice之外,還有跟不同系統的接口,如果不能組織好,開發人員每天必定會被各種問題打擾。所以如圖所示,Tribe級別有Dingo(工作時間)或者Owl(非工作時間)作為接口人,負責處理和分發問題到Squad級別的Squid。Dingo,Owl和Squid都是有團隊的開發人員輪崗。

總結

本文介紹了REA DevOps的實踐,包括工具鏈,工具鏈的分層協作以及使用中的流程。再來對比一下Gene Kim的3個方法:流程,反饋和持續學習,這3個方法是DevOps的主要部分,提供一種路標來理解和執行DevOps[14]。錘子能夠看到的是在REA DevOps實踐中,每個開發人員都參與到流程的不斷優化中,讓流程變得更順暢和快速;通過不同方式可視化監控和反饋,以達到更快的反饋路徑;開放全代碼庫給所有開發人員,鼓勵程序猿持續學習和改進等等。

以上種種,推薦閱讀我們公司同事的文章來更深入的了解REA的文化。Scaling On-Call: from 10 Ops to 100 Devs[15],講述了怎麼從這樣的狀態: 

到達下面的狀態:

這種變化並不是技術改進帶來的,而是源於持續學習的企業文化。而這,正是DevOps最需要的。

封面圖片來源:https://www.technolava.com/education/

參考文獻:

 [1] https://labs.spotify.com/2014/03/27/spotify-engineering-culture-part-1/

 [2] https://martinfowler.com/articles/microservices.html

 [3] https://aws.amazon.com/cn/devops/what-is-devops/

 [4] https://theagileadmin.com/what-is-devops/

 [5] https://theagileadmin.com/2010/10/15/a-devops-manifesto/

 [6] http://careers.realestate.com.au/rea-culture/the-values-we-live-by/

 [7] http://www.capitalone.io/blog/baked-vs-fried-whos-hungry-on-the-cloud/

 [8] https://guides.github.com/introduction/flow/

 [9] https://12factor.net/zh_cn/

 [10] https://martinfowler.com/articles/consumerDrivenContracts.html

 [11] https://github.com/realestate-com-au/pact

 [12] https://speakerdeck.com/mdub/rea-shipper-at-infracoders

 [13] http://multithreaded.stitchfix.com/blog/2016/09/08/EmbracingImmutableServerPatternDeploymentonAWS/

 [14] http://www.yunweipai.com/archives/11859.html

 [15] http://rea.tech/scaling-on-call-from-10-ops-to-100-devs/

廣告時間

下面推薦的兩個公眾號,都跟少兒英語學習有關。TripleZ是🔨的朋友自己運營,關注雙語教育(沒辦法,誰讓她有三個加拿大籍的Z開頭名字的女兒們呢,知道TripleZ的來歷了把);Locokids是錘子的同學的創業項目——一對一的少兒英語外教(想報名,找錘子,有親友折扣喲)。家中有娃兒,想把雙語教育進行的更好的小夥伴們猛擊關注吧。

iOS用戶打賞渠道, 別不好意思嘛。。

相關焦點

  • 程式設計師心聲:Code Monkey 程序猿之歌
    程式設計師心聲:Code Monkey 程序猿之歌 2011年05月12日 00:30作者:網際網路收集編輯:李晶文章出處:泡泡網原創
  • 程序猿必備證件!
    程序猿相關的有哪些證書?程序猿需要考證嗎?考證有用嗎?猿哥來談一談。1、程序猿主要的證書猿哥比較了解的有三個:全國計算機等級考試、計算機技術與軟體專業技術資格(水平)考試、思科認證。特別是大學非科班學習編程的童鞋,猿哥覺得可以考慮。如果沒有考證,很多人特別是非科班的童鞋,那些基礎學科很難學下去。③、有時候證書還真的直接有用,之前認識一個機械系大學老師去報考計算機等級考試,了解後,說是學校要求的,有這個證書評優可以加分,可以多補助之類的。考個證書,如果你在什麼事業單位啥的,說不定就用得上了。
  • 30 個跟程序猿有關的成語
    左右逢猿指需求評審會時,前後左右都是程序猿,舌戰群猿,以一敵多的場面。花好約猿指花兒開得正好,周末無比美妙,增長黑客卻約程序猿一起去公司加班。自猿其說指程序猿有一套自己的語言規範,和程序猿溝通時,必須按照其語言規範來說話。心火燎猿指程序猿內心憤怒,卻因口才有限,一時間無力反駁的場景。
  • 猿編程,學完孩子會變成「程序猿」嗎?
    少兒編程不能光從字面意義上去理解,以為就是像成人學編程一樣,各種計算機語言,什麼Java、PHP、HTML等等,也像他們一樣學完就是大家口中的「程序猿」了。今天小馬給大家測評一下猿輔導旗下的少兒編程——猿編程,看看這個課程又適合哪些孩子選擇?課程體系猿編程得課程主要面向4-12歲的學生,走的是Python語言的程序設計路線。
  • 程序猿不懂生活,是我聽過最無理取鬧的一句話
    作為純正血統的程序猿家族中的一員,我是不願承認這一點的,其實越來越多的程序猿開始重視生活品質和個人形象(更準確的說應該是——妹子眼中的形象)。Moshi 摩仕 Venturo 斜背式背包:帶給程序猿安全感的背包
  • 非人哉:九月誤入相親大會,想找「大富翁」,結果程序猿被內涵到
    九月還是參加了對於九月的感情問題,真的是太難了,單身了二百多年,始終沒有明確的男朋友,連外婆妲己都為之擔心。內涵程序猿參加相親的男女工作類型都不錯,有的是動畫製片,有的是室內設計,但是程序猿卻被內涵到了。木木一亮相就比較搶眼,因為他看著是所有人中最年老的那一個,連九月都佩服他,上千歲了還來追愛,這真的是愛無止境呀。可是實際上木木是相親大會中最年輕的男選手了,不過才25歲而已,只是工作是程序猿。
  • 他趣App助力「程序猿」馬拉松,關愛碼農身心健康
    在全國工種壓力調查中,「程序猿」屢次榮登榜首,且平時疏於鍛鍊。隨著網際網路的高速發展,時有發生。廈門軟體園專門舉辦健康馬拉松以此提醒並督促各在園企業關注「程序猿」健康。但與以往不同的是,他趣也參與到了今年的馬拉松比賽中,這更給這項賽事增加了特別的意義:關注身體健康的同事,如何有效的紓解心理壓力也是「程序猿」的關注重點。
  • 速度收藏,程序猿眼部自救攻略
    眼科醫生檢查後發現,小勇左眼竟患上了視網膜中央靜脈阻塞,也就是俗稱的「眼中風」。小勇很納悶,自己年紀輕輕,眼睛血管怎麼會堵塞呢?小勇是一位程序猿,本來工作就忙,近幾個月為了趕項目進度,他不僅白天工作,晚上還會通宵達旦加班。
  • 武漢北大青鳥中南軟體學院的程序猿是這樣過聖誕節的,讓人太意外
    你眼中的程序猿是什麼樣的?深愛格子襯衫?發量著急?一禿到底?母胎solo?每天都在捫心自問:「我到底錯哪了!?」「人家996,我更牛,007!」程序猿儘管高薪一族,但卻經常成為社會普遍「同情」的對象!程序猿的日常基本就是蹲在電腦面前敲代碼——找bug——改bug,循環往復……沒有時間收拾自己,更沒有時間關愛自己!如果這就是你對程序猿的印象,我想說:那你就大錯特錯了!
  • 企業對DevOps的偏見,及幾個轉型建議
    通常在企業裡,運維通常由一個集中且獨立的團隊完成,同時他們需要支撐多個應用程式組。如果網站的可用性出問題,責任就落在運維團隊身上。那麼,一個高度集中的運營團隊如何處理必要任務,使得應用程式可以在生產環境或其他環境下順利運行?在有些企業中,初期會創建一個名為「devops」的專業團隊來解決各種「devops問題」,這便是良好運營的開端。這個團隊可能會負責接手開發團隊的應用程式,使用自動化工具進行打包,進行部署並將其轉交給Site Reliability團隊。
  • 為什麼程序猿的孩子普遍學習比較好
    我打賭,提到「程序猿」你腦子裡想到的是穿著背心大褲衩,深夜加班擼代碼的宅男形象。
  • 不敢相信,看程序猿和工程師如何鬥圖?
    據說是火狐瀏覽器裡的隱藏彩蛋,這程式設計師想必是飽受篡改之苦。一個工程師,將自己的情緒發洩到了程序猿身上,碼出一隻猴子來嘲諷程式設計師。然而想不到的是,魔高一尺道高一丈,這位程式設計師可不是吃素的,這代碼已經不能用強來形容了。看出是誰了麼?
  • 「大頭家的程序猿」百家號教育領域收入排名,做自媒體月收入有多少
    大頭家的程序猿是當前百家號中的普通號,目前帳號百家號權重為2,綜合排名位列447130名,教育分類排名位列13183名,領先了59.8%的百家號。   大頭家的程序猿的簡介為從零開始學寫代碼,菜鳥程序猿探索碼農世界,是一家主旨明確、領域專注的自媒體作者,截止目前為止他們已經在百家號上發布了超過11篇的遊戲內容,最近該作者創作的文章中暫無熱點詞。
  • 520程序猿用最時尚的方式說愛你
    520程序猿不遺餘力的想你的一天程序猿浪漫起來更讓人動心!程序猿可以用詩詞暗示對方,山有木兮木有枝,心悅君兮,君不知窈窕淑女,君子好逑。程序猿表白起來更讓人驚心!在程序猿的面向對象的世界裡,程序猿可以用鍵盤勾勒出世間萬物,送給心目中的那個 Ta。今天就允許我來一次蝦扯蛋吧(笑哭),讓我們一起扯扯在程序猿內心世界中,520 應該有的表白方式吧。套路一:小禮物送一波玫瑰象徵愛情和真摯純潔的愛,程序猿把它當作愛的傳遞。
  • 一位程序猿的經歷與現實:我只想要一個倉庫!
    卡耐基把事情搞砸了,我面前的「程序猿」(code monkey,一種非常特殊的 、可以從事程序開發、維護的動物)Harry Liu卻把我的眼光緊緊抓住。  29歲的他想逃離此處,於是便向我求助。我剛剛在矽谷生活了2年,那裡不幸正是程序猿夢想的天堂,牽線搭橋的好心人由此可能覺得我見多識廣。
  • 程序'猿'的「hello,world!」是什麼梗?
    >為什麼會有這麼多的hello world呢1978年,Brain Kernighan在他和Dennis Ritchie合作撰寫的C語言聖經「The C Programming Language」中,延用了「hello,world」句式,作為開篇第一個程序。
  • 陳斌:我是個賣茶葉的「程序猿」
    2011年,工作7年後的陳斌不想再為了生存寫程序,這隻衝動的「程序猿」不顧家人反對,毅然放棄數十萬年薪,收拾行囊回到闊別已久的家鄉——福建武夷山,一次說走就走的創業就此開始。為什麼突然想要去賣茶葉?「不是在工作就是在去工作的路上」,陳斌如此總結自己當「程序猿」的生活。
  • 猿題庫
    突破4億用戶的在線教育公司「猿輔導」旗下產品。【聯繫我們】官方微博:@猿題庫高考微信公眾號:猿輔導星球猿題庫 9.13.0 更新內容提升產品性能,優化產品體驗~
  • 當我遇見Shiva rea的能量流,我發生了一些改變
    在上周,我非常幸運的參加了世界級瑜伽大師,能量流瑜伽創始人Shiva rea的培訓學習。--初見Shiva rea第一次見到老師,我就對她一見鍾情。一頭金髮,膚色健康,身材勻稱,帶著幾個異域風情的手工銀飾,左臂處還有一圈銀色的tattoo帖子,是月亮陰晴圓缺的變換過程。
  • 鵝廠程序猿吵翻了
    鵝廠程序猿吵翻了 不管你是 Python 新手還是老鳥,肯定糾結過一個問題:到底用什麼編輯器寫 Python 代碼好?今天,他二哥在調研了數十位鵝廠程序猿後,給你一個答案。