分佈式監控系統

在一個大型分佈式系統中(一個完備的雲計算系統也是一個巨無霸的分佈式系統) 任何一個client的請求調用,會在分佈式系統中產生上百次的調用(各種緩存、中間件、數據庫、微服務),一旦一個請求異常;那具體到哪個系統服務異常就變得很重要的;【在分佈式監控系統比較低級時,比如只能監控某一個微服務的運行情況:這時就需要一些人力來保證整個鏈路的問題的及時發現,一個人維護100個系統的穩定性,知道哪個系統是否異常,通過這種方式來第一時間知曉哪個系統出現問題】。如果開發一個完善的分佈式系統,可以清晰、直觀的看到任何一個請求在分佈式系統裏面任何一個調用的詳細情況,就可以在第一時間進行發現問題,這樣效率很高!

那怎麼樣設計和開發一個分佈式跟蹤監控系統呢?下面我們就慢慢說來:


1 分佈式調用跟蹤和調用鏈的介紹

文章基於Goolge 的分佈式調用系統Dapper 的理解來講的,如果有不正確的請指正:

  • 分佈式調用跟蹤:就是前端的一次請求產生的分佈式調用匯總起來分析;同一次前端請求產生的網絡調用就組成了調用鏈
  • 調用鏈:調用鏈一般用樹壯結構來展示的,一個調用鏈的入口開始,根據調用的時間順序,依次用展示出來,並顯示每次調用的狀態和耗費的時間latency
  • 調用鏈的一個重要的信息就是:訪問各個節點的先後順序、節點的狀態是否正常、節點的latency


2. 調用鏈實現原理簡介

因爲同一時間中間件的調用有很多,所以首先需要區分這次調用是哪個調用鏈的;我們在前端請求到達前端的業務處理服務器時【web 服務器】會執行Dapper 的埋點邏輯,
所謂的埋點邏輯包括2個步驟:
  • 給請求分配一個全局唯一的id:爲了保證唯一2的64次方,後面的網絡調用會統一用這個id 來標識、查詢
  • 把這個id存放context(上下文調用中),這個context 存儲在線程的ThreadLocal 裏面(ThreadLocal 線程本地變量是每個線程自己維護的變量,對其他的線程是透明的);這樣每個id都可以在自己的線程中進行記錄,這樣每次調用精確到線程級別都是可以調用的。

3. 調用鏈的調用順序和嵌套關係

因爲網絡調用是複雜的,所以網絡調用的順序和嵌套關係是分佈式跟蹤系統非常重要的一環,所以我們需要通過另外一個id編號建立網絡調用的層次關係


  • 上面的應用A 作爲此次服務鏈調用的入口(並不一定是此次服務鏈的入口)
  • 應用A 併發訪問的有3個:應用B、應用C、中間件;分別是0.1 0.2 0.3 這3個是一個層級的
  • 應用B 併發訪問2個應用:0.1.1 0.1.2 ;其中0.1 是應用A訪問應用B的,這樣就能很好的設計和描述


4. 分佈式數據的透傳

Dapper 建立了一套分佈式數據透傳的機制,比如上面說的2種id都是在每個請求中把這2個數據都透傳到下一個網絡調用中;這套透傳的機制可以用在業務或者監控系統中;

比如如果想要把一個數據透傳下來,需要整條鏈路的改動,現在如果藉助這個透傳機制,就可以把數據寫在上下文中,在整個鏈路中都能獲取到這個數據。


5. 數據的持久化

  • 持久化的磁盤
我們在每個節點都獲取了跟蹤數據,這時我們需要把這些數據都持久化到磁盤中,以便後面的動作需要這些數據。所以我們需要把所有的信息都記錄到磁盤上;再通過一些列的機制收集到大數據的計算平臺,進行計算、查詢、處理,最後呈現給用戶進行使用

  • agent 彙報給 server 並展示
也可以每個節點啓動一個agent,分佈式跟蹤系統獲取到數據後通過agent 發送給server 端,並通過server 進行展示和一些列的保存;


發佈了238 篇原創文章 · 獲贊 54 · 訪問量 107萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章