本系列文章分爲三個部分,咱們將回顧過去的三年,總結Marathon穩定性方面的經驗,與你們分享。在第一部分中,咱們已經介紹了適用於許多不一樣類型的工做和團隊的文化。本文將介紹幫助咱們實現穩定Marathon的軟件工程最佳實踐。git
活動預告github
若是您是Kubernetes用戶,歡迎參加下週四下午2:00的D2iQ K8s Workshop【後雲原生時代的多Kubernetes集羣運維管理探討】。您將收穫對Kubernetes多集羣、多租戶和多個基礎設施提供商的集中洞察和治理思路。掃描文末二維碼馬上報名。web
第二部分:代碼文化與設計微信
靜態類型和Non-Blocking調用網絡
Marathon是用Scala編寫的,且大量使用了Akka Actor和Stream。Scala的類型系統和不可變的數據結構使咱們運行單元測試以前就避免了不少bug,這一點再也不贅述。數據結構
Akka容許咱們異步封裝狀態和處理請求。雖然這下降了Marathon的資源消耗並加快了速度,但也帶來了成本。異步代碼很難調試,提升了技術門檻。書面上已經很複雜的業務邏輯,在代碼中變得更加難以推理。首先,咱們解決了blocking calls的問題。這種作法會帶來副作用。咱們會看到線程不足和隨機超時。刪除blocking calls帶來了不少不可靠的測試,由於有些代碼實際上依賴於其它代碼進行block——我將在下一篇系列文章深刻討論這個話題。app
咱們決定刪除幾乎全部的blocking代碼,並用async/await blocks替換它。Async和await是神奇的語法糖,使咱們既可以按順序遵循邏輯,又能夠異步執行。運維
接下來,咱們把Marathon的內部結構作成了聲明式的。過去,Marathon僅依靠Mesos任務來啓動和響應Mesos事件。這很難調試,由於人們沒法跟蹤爲何某個數字會增長或減小。所以,咱們使用Marathon想要實現的聲明性狀態替換了 「計數」。Mesos事件會觸發觀察狀態的更新。經過比較觀察到的狀態與聲明狀態,Marathon會自動作出決定。如今,當咱們調試Marathon時,咱們能夠查看觀察到的和聲明的狀態,並確認更新是否錯誤或基於這兩個狀態的決定是否錯誤。異步
崩潰模式async
儘管這個概念很嚇人,咱們仍是決定採用「崩潰模式」的思惟方式。每當Marathon達到非法狀態或觀察到鏈接失敗等問題時,它就會崩潰。此行爲會帶來一些後果。一方面,不該該有數據丟失。幸運的是,在對其進行處理以前,Marathon會將每一個請求保存在ZooKeeper中。所以,崩潰後的恢復僅意味着加載全部數據,調解並繼續工做。另外一方面,使整個服務崩潰也意味着將任何故障恢復都推後到Marathon重啓。只有一個地方能處理恢復(注3)。
「崩潰的Marathon」也能讓用戶當即發現問題的出現,而不是幾小時甚至幾天以後才發現。自從咱們採起這種行爲以來,咱們已經收到很多客戶報告Marathon處於「崩潰循環」的事件。雖然這很「煩人」,但它不只在早期就提出了問題,並且還令人很容易看到恢復是否有效。一旦Marathon再也不崩潰,問題就解決了。
咱們寧願致力於狀態恢復,而不是優雅刪除。咱們寧願崩潰和從新啓動,而不是執行許多複雜的錯誤恢復處理程序。
崩潰反饋機制
使Marathon崩潰不過是咱們的設計原則之一。另外一個則是「崩潰反饋機制」。單一的崩潰模式會致使低能化,只要讓他崩潰就好了。這在一開始每每會帶來副作用,由於用戶對此並不指望,並且他們經常沒法從中得到太多的好處。這時「崩潰反饋機制」就開始發揮做用了——明確爲何會發生崩潰,並向用戶提供儘量多的信息。咱們從簡單的退出代碼開始,這些會指向不一樣的Mesos、Zookeeper或網絡問題。這一機制將不斷積累試錯經驗,使調試變得簡單得多。
幾天後即將發佈:文章的第三部分,內容是關於咱們的測試Pipeline的。歡迎持續關注!
注3:一個很是好的用例——PR 6905
https://github.com/mesosphere/marathon/pull/6905.
歡迎點擊【閱讀原文】,獲取D2iQ DC/OS解決方案詳情,或聯繫D2iQ銷售團隊瞭解更多: sales@d2iq.com
W E B I N A R
內容大綱
如何實現Kubernetes快速部署、擴容、升級、備份等底層運維操做;
如何進行統一的權限管理;
如何從實際的項目層面進行統一的運維管理,包括多集羣資源分配;
如何管理應用商店;
如何進行統一的中央監控。
掃二維碼|馬上報名
往期精彩文章
關於D2iQ
點擊「閱讀原文」,獲取Mesosphere DC/OS解決方案詳情
本文分享自微信公衆號 - D2iQ(d2iq_apac)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。