網絡問題排查必備利器:Pingmesh

背景

當今的數字化世界離不開無處不在的網絡連接。無論是日常生活中的社交媒體、電子商務,還是企業級應用程序和云服務,我們對網絡的依賴程度越來越高。然而,網絡的可靠性和性能往往是一個復雜的問題,尤其是在具有大規模分布式架構的系統中。

在過去,網絡監控主要依賴于傳統的點對點(point-to-point)方式,通過單獨的監控工具對網絡路徑進行測試。然而,這種方法往往只能提供有限的信息,并且無法全面評估整個網絡的健康狀況。為了更好地了解網絡的運行情況以及及時發現潛在的問題,Pingmesh 技術應運而生。

Pingmesh 的提出最初是來自微軟,在微軟內部 Pingmesh 每天會記錄 24TB 數據,進行 2000 億次 ping 探測,通過這些數據,微軟可以很好的進行網絡故障判定和及時的修復。

下面是 Flashcat Pingmesh 的頁面樣例,可以清晰地看到各個機房之間的網絡情況,也可以看到各個機柜或交換機之間的情況:

20240201120305

業界方案

業界對Pingmesh的實現大都基于微軟的一則論文為基礎,做出了一些改造和升級。原微軟Pingmesh論文地址: 《Pingmesh: A Large-Scale System for Data Center Network Latency Measurement and Analysis》。

常見的數據中心網絡拓撲:

20240201120426

在這樣的架構中,有多個數據中心,數據中心之間有專線連通,在數據中心內部有多個Spine、Leaf、ToR交換機,在一些架構中,leaf交換機也會直接充當ToR作為服務器接入交換機,在 ToR 交換機下有大量服務器連接; 因此,pingmesh 能力就分為3 個級別:

  1. 在機架內部,讓所有的 server 互相 ping,每個 server ping 機架內其他 N-1 個 server
  2. 在機架之間,則每個機架選幾個 server ping 其他機架的 server,保證 server 所屬的 ToR 不同
  3. 在數據中心之間,則選擇不同的數據中心的幾個不同機架的 server 來ping

Pingmesh 架構設計

20240201120528

Controller

Controller 主要負責生成 pinglist 文件,這個文件是 XML 格式的,pinglist 的生成是很重要的,需要根據實際的數據中心網絡拓撲進行及時更新。 在生成 pinglist 時, Controller 為了避免開銷,分為3 個級別:

  1. 在機架內部,讓所有的 server 互相 ping,每個 server ping (N-1) 個 server
  2. 在機架之間,則每個機架選幾個 server ping 其他機架的 server,保證 server 所屬的 ToR 不同
  3. 在數據中心之間,則選擇不同的數據中心的幾個不同機架的 server 來ping

Controller 在生成 pinglist 文件后,通過 HTTP 提供出去,Agent 會定期獲取 pinglist 來更新 agent 自己的配置,也就是我們說的“拉”模式。Controller 需要保證高可用,因此需要在 VIP 后面配置多個實例,每個實例的算法一致,pinglist 文件內容也一致,保證可用性。

Agent

微軟數據中心的每個 server 都會運行 Agent,用來真正做 ping 動作的服務。為了保證獲取結果與真實的服務一致,Pingmesh 沒有采用 ICMP ping,而是采用的 TCP/HTTP ping。所以每個 Agent 既是 Server 也是 Client。每個 ping 動作都開啟一個新的連接,主要為了減少 Pingmesh 造成的 TCP 并發。 Agent 要保證自己是可靠的,不會造成一些嚴重的后果,其次要保證自己使用的資源要足夠的少,畢竟要運行在每個 server 上。兩個server ping 的周期最小是 10s,Packet 大小最大 64kb。針對靈活配置的需求,Agent 會定期去 Controller 上拉取 pinglist,如果 3 次拉取不到,那么就會刪除本地已有 pinglist,停止 ping 動作。 在進行 ping 動作后,會將結果保存在內存中,當保存結果超過一定閾值或者到達了超時時間,就將結果上傳到 Cosmos 中用于分析,如果上傳失敗,會有重試,超過重試次數則將數據丟棄,保證 Agent 的內存使用。

網絡狀況

根據論文中提到的,不同負載的數據中心的數據是有很大差異的,在 P99.9 時延時大概在 10-20ms,在 P99.99 延時大概在100+ms 。關于丟包率的計算,因為沒有用 ICMP ping 的方式,所以這里是一種新的計算方式,(一次失敗 + 二次失敗)次數/(成功次數)= 丟包率。這里是每次 ping 的 timeout 是 3s,windows 重傳機制等待時間是 3s,下一次 ping 的 timeout 時間是 3s,加一起也就是 9s。所以這里跟 Agent 最小探測周期 10s 是有關聯的。二次失敗的時間就是 (2 * RTT)+ RTO 時間。 Pingmesh 的判斷依據有兩個,如果超過就報警:

  • 延時超過 5ms
  • 丟包率超過?10^(-3)

在論文中還提到了其他的網絡故障場景,交換機的靜默丟包。有可能是 A 可以連通 B,但是不能連通 C。還有可能是 A 的 i 端口可以連通 B 的 j 端口,但是 A 的 m 端口不能連通 B 的 j 端口,這些都屬于交換機的靜默丟包的范疇。Pingmesh 通過統計這種數據,然后給交換機進行打分,當超過一定閾值時就會通過 Autopilot 來自動重啟交換機,恢復交換機的能力。

Flashcat-Pingmesh 方案

業界方案大都實現了各自的ping-agent的能力,但對于controller生成pinglist的能力并未有好的開源方案。同時我們和一些客戶交流,了解到目前數據中心架構與傳統的leaf-tor-server架構不太一樣,傳統一個機頂交換機下server都在一個機柜下,現在數據中心一個交換機下機器可能在不同機柜,這種情況如果還是按交換機維度進行探測,當server機器探測故障后,無法快速定位到機器位置。因此,我們在開發之前就針對Tor以及機柜維度進行了設計。

Pimgesh應具備哪些能力?

  1. 具備最基礎的Ping探測能力,即ICMP協議支持,同時也應支持TCP、UDP等協議的端口探測;
  2. 簡化頁面用戶配置,用戶只需配置數據中心名字、交換機CIDR值,數據中心支持的探測協議和端口等關鍵信息;
  3. 數據中心會有很多機柜、交換機和機器,如何避免ping風暴,因此需支持配置選取部分機柜、交換和機器進行探測,及探測比例配置,用戶可靈活配置數據中心參與探測的交換機或機柜比例數,以及每個交換機或機柜下參與探測的Server比例數;
  4. 每個數據中心內部、默認所有機柜或交換機之間進行探測(Server比例數依舊生效)
  5. 每個數據中心之間,用戶可配置默認規則,即兩兩數據中心之間,按照配置的協議進行探測。當然,用戶也可自定義哪些數據中心之間按照所選協議進行探測,此時機柜或交換機以及Server比例數依舊生效;
  6. 探測結果進行有效聚合展示,多個數據中心有很多機柜或交換機以及機器,分三層結構展示探測結果,第一層展示所有數據中心之間的探測鏈路拓撲以及探測值、第二層展示數據中心內部每個機柜或交換機之間的探測拓撲和結果、第三層展示機柜或交換機下面所選Server之間的探測拓撲和結果;
  7. Ping故障一鍵停止探測的止損能力;
  8. 探測機器故障后,自動重新選替補機器能力;
  9. 數據中心配置變更后,能及時自動以新配置重新生成pinglist;
  10. 支持簡便地配置報警規則;
  11. 探測結果寫入支持prometheus協議的時序庫中;

交換機和機柜模式配置差異

  1. 交換機模式,頁面用戶只需配置交換CIDR值即可,無需手動注冊Server IP,我們會借助 Categraf 的心跳功能,自動判斷出server ip應歸屬哪個交換機。
  2. 機柜模式,這種方式一般適用于客戶環境中有自己的CMDB系統,可將其CMDB系統中的數據中心、機柜和機器關系通過OpenApi注冊到Pingmesh系統中。

Pingmesh 架構設計:

20240201120734

Apiserver

提供OpenApi:

  1. 用于注冊、變更、查詢數據中心原信息、探測規則(如:數據中心、探測協議、Tor交換機CIDR/機柜名、機器IP和機器名(機柜方式)、 探測百分比設置、數據中心之間探測規則設置 )。
  2. 數據中心三層結構拓撲圖展示,以及歷史探測曲線圖、報警規則配置、一鍵降級等API。
  3. 提供給Categraf使用的查詢pinglist接口。

Controller

生成pinglist的核心控制器邏輯,它需要定時從DB中查詢最新的配置和規則,判斷是否有發生變更,如果發生變更則重新執行pinglist生成邏輯。 從DB中查到配置后,判斷是機柜模式還是交換機模式,因為這兩種方式,其篩查Server IP的邏輯會有差異,之后需計算出每個數據中心,待探測的機柜或交換機是哪些,以及其下的Server Ip分別是多少,做好數據準備工作。接下來查看探測規則(數據中心內、數據中心之間),根據這些規則我們對每一臺發起探測的Server 生成探測配置,并記錄到DB中(因為我們底層真正執行探測任務的是Categraf Agent,需根據不同協議所使用的插件,生成不同的配置文件)。

此外,我們需新起一個協程,定時去對比新用戶配置和已生成的pinglist是否一致,因為可能在我們生成新的pinglist后的一段時間內,用戶變更或新增、刪除了數據中心配置和規則,那需要將已生成的pinglist進行對比清理,避免用戶配置變更后,依舊使用老的配置去探測,導致數據不準問題。

實現過程中還需要考慮另一個問題,數據中心有很多機器,但不是所有機器都裝有categraf,或裝有categraf但進程退出了等情況,如果我們只是單純地按所有的機器數量去篩選一堆Server IP,那很有可能選出的機器都沒有裝agent,那也就無法進行探測和發現問題了,因此我們需要結合categraf自身的心跳上報的能力,來過濾出可用的Server IP。到了這里,我們可能會想到另一個問題,因為我們是按比例篩選機器的,而當某臺機器down掉后,原本選了10臺,現在只有9臺可用機器了,這就會和用戶配置的參與探測的服務器比例出現diff。出現這種情況,那我們就需要重新選一臺可用機器補上去。當選擇出來這批機器后,后面都需要一直用這些機器,除非遇到重新選的情況,這樣可以保障我們指標量是固定的,同時也能滿足探測的比例需求。

探測Agent

Pingmesh底層真正執行探測邏輯的是我們的Categraf,它是一個開源的項目,插件豐富、配置簡單,這里就不做過多介紹了,大家可在github上搜索下即可。Categraf 會定時來中心端拉取本機的采集插件配置,當然,可能部署categraf的集群很多,這里中心端會將配置文件緩存到Redis中,降低對DB的查詢壓力,并提升接口查詢效率。最終categraf會拿到最新的插件配置并進行探測,之后將探測結果上報給中心端,用于數據展示和報警配置使用。

額外說一點,如果存在邊緣機房,那categraf可以將探測結果上報給邊緣機房的 n9e-edge 模塊,之后報警就可在這邊緣機房內部閉環了,而且edge 會自動將指標轉發給時序庫,用于頁面展示使用。

小結

Pingmesh 在復雜網絡問題的排查中發揮了巨大的作用,本文分享了 Pingmesh 的實現思路,歡迎大家?聯系我們試用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718384.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718384.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718384.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

21.Prometheus的查詢數據類API

平凡也就兩個字: 懶和惰; 成功也就兩個字: 苦和勤; 優秀也就兩個字: 你和我。 跟著我從0學習JAVA、spring全家桶和linux運維等知識,帶你從懵懂少年走向人生巔峰,迎娶白富美! 關注微信公眾號【 IT特靠譜 】,每天都會分享技術心得~ 1.數據查詢類API 1.1.API前綴路徑說明 …

lanqiao:42點

題解: 1.首先,把字符轉成數字。 2.創建二維數組存放枚舉的結果,第一行一個數字13;第二行4個數字,分別是13和1的加減乘除;第三行16個數字,分別是第二行的每個數和12加減乘除的結果;…

基于SpringBoot的在線拍賣系統

目錄 1、 前言介紹 2、主要技術 3、系統流程和邏輯 4、系統結構設計 5、數據庫設計表 6、運行截圖(部分) 6.1管理員功能模塊 6.2用戶功能模塊 6.3前臺首頁功能模塊 7、源碼獲取 基于SpringBoot的在線拍賣系統錄像 1、 前言介紹 隨著社會的發展,社會的各行…

安卓玩機工具推薦----ADB狀態讀寫分區 備份分區 恢復分區 查看分區號 工具操作解析

在以往玩機過程中。很多機型備份分區 備份固件需要借助adb手動指令或者第三方手機軟件或者特定的一些工具來操作。有些朋友需要查看當前機型分區名稱和對應的分區號。此類操作我前面的博文專門說過對應的adb指令。但有些界面化的工具比較方便簡單。 相關分區同類博文&#xff…

【C++】每周一題——2024.3.3(手滑再再寫一篇)

題目 Cpp 【問題描述】 求N個字符串的最長公共子串&#xff0c;2 < N&#xff1c;&#xff1d;20&#xff0c;字符串長度不超過255。 例如&#xff1a;N&#xff1d;3&#xff0c;由鍵盤依次輸入三個字符串為 What is local bus? Name some local buses. local bus is a h…

SpringBoot源碼解讀與原理分析(三十七)SpringBoot整合WebMvc(二)DispatcherServlet的工作全流程

文章目錄 前言12.4 DispatcherServlet的工作全流程12.4.1 DispatcherServlet#service12.4.2 processRequest12.4.3 doService12.4.3.1 isIncludeRequest的判斷12.4.3.2 FlashMapManager的設計 12.4.4 doDispatch12.4.4.1 處理文件上傳請求12.4.4.2 獲取可用的Handler&#xff0…

sscanf 函數的用法

sscanf 函數是 C 語言標準庫 <stdio.h> 中的一個函數&#xff0c;用于按照指定的格式從一個字符串中讀取輸入。它的用法類似于 scanf 函數&#xff0c;但是 sscanf 從字符串中讀取輸入&#xff0c;而不是從標準輸入&#xff08;鍵盤&#xff09;中讀取輸入。 以下是 ssc…

優優嗨聚集團:美團代運營服務,商家增長的新引擎

在當今數字化時代&#xff0c;線上平臺已成為商家拓展業務、提升品牌影響力的重要渠道。美團作為國內領先的本地生活服務平臺&#xff0c;擁有龐大的用戶群體和豐富的商業資源。然而&#xff0c;對于許多商家而言&#xff0c;如何在美團平臺上進行有效運營&#xff0c;實現業務…

Redis做分布式鎖如何處理超時時間?

在使用Redis實現分布式鎖時&#xff0c;處理超時時間是非常重要的&#xff0c;以確保在獲取鎖的客戶端在一定時間內未能完成任務時&#xff0c;鎖能夠自動釋放&#xff0c;避免造成死鎖或長時間的阻塞。下面是一種處理超時時間的方法&#xff1a; 獲取鎖時設置超時時間&#xf…

雙線服務器有哪些安全防御措施?

雙線服務器的出現給企業帶來了更廣泛的業務發展&#xff0c;用戶不再是固定的群體&#xff0c;而是有了一定的選擇性&#xff0c;服務器的性能與可靠性進行了增強&#xff0c;使網絡的運行速度變得更加流暢&#xff0c;給用戶帶來了良好的體驗感。 今天我們主要就來聊一聊雙線服…

【IOS】啟動報錯Cannot launch ‘/private/var/containers/Bundle/Application/....‘

問題 IOS項目啟動報錯Cannot launch ‘/private/var/containers/Bundle/Application/***.app’: Sending qLaunchSuccess packet failed 或者類似報錯問題 無法啟動launch的 解決 問題定位 我是在操作期間更換了應用的簽名證書 也就是Signing & Capablities -> Sign…

【LeetCode:232. 用棧實現隊列 + 棧 | 隊列】

&#x1f680; 算法題 &#x1f680; &#x1f332; 算法刷題專欄 | 面試必備算法 | 面試高頻算法 &#x1f340; &#x1f332; 越難的東西,越要努力堅持&#xff0c;因為它具有很高的價值&#xff0c;算法就是這樣? &#x1f332; 作者簡介&#xff1a;碩風和煒&#xff0c;…

力扣74. 搜索二維矩陣(二分查找)

Problem: 74. 搜索二維矩陣 文章目錄 題目描述思路復雜度Code 題目描述 思路 思路1&#xff1a;映射為一維數組二分查找 1.由于題目矩陣中的元素整體是升序的&#xff0c;我們可以將其放置在一個大小為 m n m \times n mn的一維數組array中進行二分查找 2.對應的映射關系是ar…

NACOS在Windows和Linux下的安裝教程

目錄 1、Windows安裝 1.1、下載安裝包 1.2、解壓 1.3、端口配置 1.4、啟動 1.5、訪問 2、Linux安裝 2.1、安裝JDK 2.2、上傳安裝包 2.3、解壓 2.4、端口配置 2.5、啟動 3、Nacos的依賴 1、Windows安裝 開發階段采用單機安裝即可。 1.1、下載安裝包 在Nacos的Git…

Vue+SpringBoot打造圖書借閱系統

目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 登陸注冊模塊2.2 圖書管理模塊2.3 圖書評論模塊2.4 圖書預定模塊2.5 圖書資訊模塊 三、系統設計3.1 系統結構設計3.1.1登陸注冊模塊的結構設計3.1.2圖書管理模塊的結構設計3.1.3圖書評論模塊的結構設計3.1.4圖書預定模塊…

clickhouse 隨心所欲的聚合模型-AggregatingMergeTree

clickhouse 強大的 MergeTree 系列引擎令人信服&#xff0c;其 ReplacingMergeTree、SummingMergeTree 在數據唯一性和匯總場景中表現非凡。但你是否還有保留最小(大)、平均等預聚合需求&#xff0c;甚至在一個模型中既有唯一性語意也有匯總、最小、最大、平均值語意該如何處理…

Spring-靜態代理VS動態代理/實現代理ProxyFactory

文章目錄 靜態代理VS動態代理Spring實現代理ProxyFactory 工作中遇到問題整理動態代理異常com.sun.proxy.$Proxy0 cannot be cast to 靜態代理VS動態代理 靜態代理VS動態代理 參考URL: https://blog.csdn.net/qq_25881443/article/details/103245938 【java項目實戰】代理模式…

【C語言】剖析qsort函數的實現原理

主頁&#xff1a;17_Kevin-CSDN博客 專欄&#xff1a;《C語言》 本文將從回調函數&#xff0c;qsort函數的應用&#xff0c;qsort函數的實現原理三個方面進行講解&#xff0c;請自行跳轉至相對位置進行閱讀~ 目錄 回調函數 qsort函數的應用 qsort函數實現原理 回調函數 什…

mysql主從庫Slave_SQL_Running: No問題經驗分享

最近在創建mysql主從庫的時候&#xff0c;遇到一個問題。執行 mysql> SHOW SLAVE STATUS\G結果顯示 Slave_IO_Running: Yes Slave_SQL_Running: No 很是苦惱&#xff0c;查詢了很久沒有解決 執行 mysql> SELECT * FROM performance_schema.replication_applier_status_…

獨立游戲《星塵異變》UE5 C++程序開發日志1——項目與代碼管理

寫在前面&#xff1a;本日志系列將會向大家介紹在《星塵異變》這款模擬經營游戲&#xff0c;在開發時用到的與C相關的泛用代碼與算法&#xff0c;主要記錄UE5C與原生C的用法區別&#xff0c;以及遇到的問題和解決辦法&#xff0c;因為這是我本人從ACM退役以后第一個從頭開始的項…