構建可觀測的分布式系統

2021-09-17 18:17:08 字數 2894 閱讀 2580

如今的系統正在變得越來越複雜;微服務在網路上是分布式存在的,並且能夠動態擴充套件,這樣會導致各種形式的故障,出現故障的方式是我們無法預料的。如果盲目相信我們能夠構建完美的系統將會形成錯誤的安全感,所以我們需要預先為此做好充分地準備。在可觀測方面進行投資能夠讓我們掌握系統的執行狀況,這些事情是我們以前所想象不到的。在這方面有一些可用的工具,包括指標、跟蹤、結構化和關聯日誌。

\\ pierre vincent是poppulo的站點可靠性工程(site reliability engineering,sre)主管,在qcon倫敦2018上做了關於構建可觀測的分布式系統的演講。infoq以訪談、演講、總結和文章的形式報道了此次會議。

\\ infoq採訪了vincent,討論了將可觀測性應用於分布式系統的話題。

\\infoq:在演講中,您提到到達生產環境僅僅是個開始。您能詳細介紹一下嗎?

\\

\

pierre vincent:在部署到生產環境之前,我們對其中的每件事都很擅長,但是我們很少會在部署到生產環境之後再進行改善。我看到的越多就越發現將所有的時間花費在生產環境之前不僅會帶來收益的遞減,還會適得其反。我們可能會相信能夠構建出完美的東西,但是最終系統可能會出現故障,變得難以處理,當我們開始分布式系統時,這一點將會尤為明顯。

\\ 作為開發人員,我長期有這種錯誤的看法:生產環境上線就萬事大吉了,生產環境部署之後,我們的任務就完成了,它就變成了別人的問題,我們就可以轉向下乙個使用者故事或特性了。我們自以為心安理得,認為在生產環境部署之前,我們所做的重要的事情已經足夠多了:tdd、整合測試、階段部署、端到端等等。

\\ 如今,我們正在處理更複雜的系統,它們具備跨網路分布、動態擴充套件等特點。這樣會帶來各種形式的故障,出現故障的方式是我們無法預料的。如果盲目相信我們能夠構建完美的系統將會形成錯誤的安全感:當出現故障時,我們根本就沒有準備好。而另外乙個壞訊息就是,故障會更加難以處理,因為我們沒有任何東西去探測或調查問題的原因。

\

\\

infoq:可觀測性能夠如何幫助我們應對生產環境**現的問題呢?

\\

\

vincent:在可觀測性方面進行投資意味著我們要花費時間對系統進行instrument操作,讓我們在應對生產環境中未知的問題時有可用的工具。

\\ 在生產環境中,我們有不同的方式來獲取資訊。起始的時候,這可能會非常簡單,比如基本的健康狀態檢查。借助時間序列指標,我們可以使用很多任務具來完成一些很強大的功能。指標、跟蹤、日誌、關聯和結構化日誌、事件。沒有哪種方案能夠適用於所有的場景,但是將它們組合起來能夠形成強大的解決方案。我們必須承認,事情總有可能會出錯,但是當出錯的時候,我們借助這些工具能夠輔助探查,幫助我們快速應對和恢復。

\

\\

\\

\

vincent:很多人會滿足於指標或監控,但是還有其他的事情值得關注。

\\ 在低粒度維度聚合資料方面,指標是非常有效的,這也使得它成為服務級別監控的乙個不錯選擇。但是,指標在基數較大時,擴充套件性並不好,而這是除錯和探查所需的。我們曾經將prometheus用到高基數的時間序列上,這並沒有達到預期的效果!

\\ 好的日誌,尤其是結構化的日誌,在幫我們理解應用的行為時扮演了重要的角色。通過良好的日誌,我指的是能夠易於搜尋並且能夠提供足夠的上下文資訊幫助我們理解事件是如何發生的。日誌的關聯也是首先要關注的事情之一,可以使用像request id這樣的方式在整個系統中跟蹤請求。但是,日誌的代價可能會非常高昂,日誌庫通常會有一定的開銷,管理大量的日誌可能需要一定的技巧,在日誌級別上進行取樣也並不簡單。

\\ 在我們的技術棧中,使用zipkin(open tracing)方面,我們有一些好的經驗:我們實際上使用trace id作為日誌關聯id,這樣的話,更容易從log跳轉到trace。在觀測trace的最初幾個小時中,我們發現了一些我們之前未曾關注到的事情。遺憾的是,分布式跟蹤對現有的系統有較高的instrumentation成本。我們花了一年多的時間,還沒有全部完成。我的建議就是:如果你剛剛開始構建系統的話,將跟蹤新增進去,預先做這件事會帶來巨大的成本節省。

\\ 我們目前正在研究的是異常傳輸,尤其是客戶端瀏覽器的錯誤。長期以來,這是我們的乙個盲點,我們正在嘗試像sentry這樣的工具能否增加可見性,尤其是那些對客戶產生影響的錯誤。

\\ 整體而言,你必須要花費一定的時間使用這些工具,掌握它們擅長什麼。單個工具肯定是不行的,關鍵在於找到合適的平衡點,讓它們各自發揮出最大的作用。

\

\\

infoq:可觀測性能夠帶來什麼好處呢?

\\

\

vincent:對我們來說,立竿見影的好處就是可見性。當幾年前引入prometheus時,我們的反應是非常明確的:如何在不了解上述這些功能的情況下,把事情做好?從那時起,就進入了乙個良性的迴圈:提出更多的問題,如果我們無法回答的話,就對系統執行更多的instrument操作。

\\ 正如我在前文所述,這個過程中並非沒有問題:當指標不適合解決方案時,我們必須審視我們的策略。其中有個樣例就是,針對客戶級別粒度(這是乙個基數很高的粒度),我們依賴於結構化的日誌,這使得我們能夠基於每個客戶進行除錯。

\

\\

infoq:可觀測性的未來將會如何發展呢?

\\

\

vincent:我們確實應當將使用者和開發人員的易用性提上日程。如果系統難以進行instrument操作並且輸出難以解釋的話,那麼這就是一場失敗的戰鬥。

\\

\\

檢視英文原文:building observable distributed systems

分布式系統的構建原則

什麼是構建乙個可維護和可擴充套件的系統的意義?在早期,乙個系統的形態,只是滿足使用者和伺服器資源之間的通道,唯一要擴充套件和維護的是系統後面的資源,保證資源的可用和夠用,而系統本身的壓力並不大。如今,開源元件已經成為構建一些企業系統的基石,伴隨著行業的發展,最佳實踐和圍繞這些系統架構的指導原則也逐漸...

從構建分布式秒殺系統聊聊分布式鎖

摘要 前言 最近懶成一坨屎,學不動系列一波接一波,大多還都是底層原理相關的。上周末抽時間重讀了周志明大濕的 jvm 高效併發部分,每讀一遍都有不同的感悟。路漫漫,藉此,把前段時間搞著玩的秒殺案例中的分布式鎖深入了解一下。最近懶成一坨屎,學不動系列一波接一波,大多還都是底層原理相關的。上周末抽時間重讀...

分布式 分布式系統的設計

在計算機領域,當單機效能達到瓶頸時,一般有兩種方式解決效能問題 而分布式系統的設計說白了就是 如何合理將乙個系統拆分成多個子系統部署到不同機器上。講設計方法前,先介紹分布式系統的特性 1 分布性 空間中隨機分布。這些計算機可以分布在不同的機房,不同的城市,甚至不同的國家。2 對等性 分布式系統中的計...