Go實現海量日誌收集系統(一)

来源:https://www.cnblogs.com/zhaof/archive/2018/03/24/8641951.html
-Advertisement-
Play Games

項目背景 每個系統都有日誌,當系統出現問題時,需要通過日誌解決問題 當系統機器比較少時,登陸到伺服器上查看即可滿足 當系統機器規模巨大,登陸到機器上查看幾乎不現實 當然即使是機器規模不大,一個系統通常也會涉及到多種語言的開發,拿我們公司來說,底層是通過c++開發的,而也業務應用層是通過Python開 ...


項目背景

  • 每個系統都有日誌,當系統出現問題時,需要通過日誌解決問題
  • 當系統機器比較少時,登陸到伺服器上查看即可滿足
  • 當系統機器規模巨大,登陸到機器上查看幾乎不現實

當然即使是機器規模不大,一個系統通常也會涉及到多種語言的開發,拿我們公司來說,底層是通過c++開發的,而也業務應用層是通過Python開發的,並且即使是C++也分了很多級別應用,python這邊同樣也是有多個應用,那麼問題來了,每次系統出問題了,如何能夠迅速查問題? 好一點的情況可能是python應用層查日誌發現是系統底層處理異常了,於是又叫C++同事來查,如果C++這邊能夠迅速定位出錯誤告知python層這邊還好,如果錯誤好排查,可能就是各個開發層的都在一起查到底是哪裡引起的。當然可能這樣說比較籠統,但是卻引發了一個問題:

  • 當系統出現問題後,如何根據日誌迅速的定位問題出在一個應用層?
  • 在平常的工作中如何根據日誌分析出一個請求到系統主要在那個應用層耗時較大?
  • 在平常的工作中如何獲取一個請求到達系統後在各個層測日誌彙總?

針對以上問題,我們想要實現的一個解決方案是:

  • 把機器上的日誌實時收集,統一的存儲到中心系統
  • 然後再對這些日誌建立索引,通過搜索即可以找到對應日誌
  • 通過提供界面友好的web界面,通過web即可以完成日誌搜索

關於實現這個系統時可能會面臨的問題:

  • 實時日誌量非常大,每天幾十億條(雖然現在我們公司的系統還沒達到這個級別)
  • 日誌準實時收集,延遲控制在分鐘級別
  • 能夠水平可擴展

關於日誌收集系統,業界的解決方案是ELK

ELK的解決方案是通用的一套解決方案,所以不免就會產生以下的幾個問題:

  • 運維成本高,每增加一個日誌收集,都需要手動修改配置
  • 監控缺失,無法準確獲取logstash的狀態
  • 無法做定製化開發以及維護

針對這種情況,其實我們想要的系統是agent可以動態的獲取某個伺服器我們需要監控哪些日誌
以及那些日誌我們需要收集,並且當我們需要收集日誌的伺服器下線了,我們可以動態的停止收集
當然這些實現的效果最終也是通過web界面呈現。

日誌收集系統設計

主要的架構圖為

關於各個組件的說明:

  • Log Agent,日誌收集客戶端,用來收集伺服器上的日誌
  • Kafka,高吞吐量的分散式隊列,linkin開發,apache頂級開源項目
  • ES,elasticsearch,開源的搜索引擎,提供基於http restful的web介面
  • Hadoop,分散式計算框架,能夠對大量數據進行分散式處理的平臺

關於Kakfa的介紹

Apache Kafka是一個分散式發佈 - 訂閱消息系統和一個強大的隊列,可以處理大量的數據,並使您能夠將消息從一個端點傳遞到另一個端點。 Kafka適合離線和線上消息消費。 Kafka消息保留在磁碟上,併在群集內複製以防止數據丟失。 Kafka構建在ZooKeeper同步服務之上。 它與Apache Storm和Spark非常好地集成,用於實時流式數據分析。

註:這裡關於Kafka並不會介紹太多,只是對基本的內容和應用場景的說明,畢竟展開來說,這裡的知識也是費非常多的

Kafka中有幾個基本的消息術語需要瞭解:

  • Kafka將消息以topic為單位進行歸納。
  • 將向Kafka topic發佈消息的程式成為producers.
  • 將預訂topics並消費消息的程式成為consumer.
  • Kafka以集群的方式運行,可以由一個或多個服務組成,每個服務叫做一個broker.

 

Kafka的優點:

  • 可靠性 - Kafka是分散式,分區,複製和容錯的。
  • 可擴展性 - Kafka消息傳遞系統輕鬆縮放,無需停機。
  • 耐用性 - Kafka使用分散式提交日誌,這意味著消息會儘可能快地保留在磁碟上,因此它是持久的。
  • 性能 - Kafka對於發佈和訂閱消息都具有高吞吐量。 即使存儲了許多TB的消息,它也保持穩定的性能。

Kafka非常快,並保證零停機和零數據丟失。

Kafka的應用場景:

  • 非同步處理, 把非關鍵流程非同步化,提高系統的響應時間和健壯性 

  • 應用解耦,通過消息隊列

 

  • 流量削峰

 

 

關於ZooKeeper介紹

ZooKeeper是一種分散式協調服務,用於管理大型主機。在分散式環境中協調和管理服務是一個複雜的過程。ZooKeeper通過其簡單的架構和API解決了這個問題。ZooKeeper允許開發人員專註於核心應用程式邏輯,而不必擔心應用程式的分散式特性。
Apache ZooKeeper是由集群(節點組)使用的一種服務,用於在自身之間協調,並通過穩健的同步技術維護共用數據。ZooKeeper本身是一個分散式應用程式,為寫入分散式應用程式提供服務。

ZooKeeper主要包含幾下幾個組件:

  • Client(客戶端):我們的分散式應用集群中的一個節點,從伺服器訪問信息。對於特定的時間間隔,每個客戶端向伺服器發送消息以使伺服器知道客戶端是活躍的。類似地,當客戶端連接時,伺服器發送確認碼。如果連接的伺服器沒有響應,客戶端會自動將消息重定向到另一個伺服器。
  • Server(伺服器):伺服器,我們的ZooKeeper總體中的一個節點,為客戶端提供所有的服務。向客戶端發送確認碼以告知伺服器是活躍的。
  • Ensemble:ZooKeeper伺服器組。形成ensemble所需的最小節點數為3。
  • Leader: 伺服器節點,如果任何連接的節點失敗,則執行自動恢復。Leader在服務啟動時被選舉。
  • Follower:跟隨leader指令的伺服器節點。

ZooKeeper的應用場景:

  • 服務註冊&服務發現

 

  • 配置中心

  • 分散式鎖

    Zookeeper是強一致的多個客戶端同時在Zookeeper上創建相同znode,只有一個創建成功

 

關於Log Agent

這個就是我們後面要通過代碼實現的一步分內容,主要實現的功能是:
類似於我們在linux下通過tail的方法讀日誌文件,講讀取的內容發給Kafka
這裡需要知道的是,我們這裡的tailf是可以動態變化的,當配置文件發生變化是,可以通知我們程式自動增加需要增加的tailf去獲取相應的日誌併發給kafka producer
主要由一下幾部目錄組成:

  • Kafka
  • tailf
  • configlog

 

小結

以上是對整個要開發的系統的一個總的概括,以及架構的一個構建,並且各個組件的實現,接下來會一個一個實現每個部分的功能,下一篇文章會實現上述組件中log Agent的開發

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 方法,在日常生活中可以理解成解決問題或處理事情的技巧,一個方法的形成,需要思考和分析,從而形成一步一步的步驟,最後在實際執行過程中驗證自己的思路。在Java中,方法的形成亦是如此。 方法,指用於封裝一段特定的邏輯功能,如計算百分比、判斷非空、時間日期的轉換等操作,可以在程式中被反覆調用,減少重覆代碼 ...
  • hi.py 的提供的路由裝飾器接受兩個參數,第一個參數指定動態路由的正則模式,第二個參數指定同意的http請求方法列表。 比如: 這個路由指定uri為/client或者/client/,同時請求方法為GET或者POST的http請求由函數client(req,res,param)來處理。uri模式由 ...
  • 看了很多關於捲積的介紹,一直感覺不怎麼理解,今天徹底研究下: 我們知道圖像是由像素構成的,圖像中的行和列一起構成了圖像矩陣,比如一個解析度800*400的圖像,同時也是一個大矩陣,這個矩陣有著400行和800列.假設有一個3*3的濾波小矩陣(捲積核), 在進行捲積運算的時候,我們便利整個圖像大矩陣中 ...
  • yum install gcc libffi-devel python-devel openssl-devel ...
  • 首發日期:2018-03-24 final關鍵字: final的作用:相當於使修飾的變數、方法或類“固定、最終化”,使得修飾的變數、方法、類不能再做改變【可以限制繼承的重寫】。 final可以修飾類、方法、變數。 final修飾的類不可以被繼承。 final修飾的方法不可以被覆蓋(重寫) final... ...
  • C++字元串string類 在C語言里,字元串是用字元數組來表示的,而對於應用層而言,會經常用到字元串,而繼續使用字元數組,就使得效率非常低. 所以在C++標準庫里,通過類string從新自定義了字元串。 頭文件: #include <string> string直接支持字元串連接 string直接 ...
  • 在使用vector容器的時候,需要將一個vector中的內容複製到另一個vector結尾,如何實現呢? 使用vector的insert方法 參數解釋: position:元素在容器中插入的位置,iteratior是一種成員類型,定義為指向元素的隨機訪問迭代器類型。 first,last:iterat ...
  • 在別人代碼里,經常看到std命名空間,比如使用std命名空間里的標準輸入輸出流對象cout: 其中cout相當於控制台輸出(console out),然後通過<<左移操作符,將每個字元列印出來. endl相當於就是'\n'換行. 接下來我們便通過上章學習的操作符重載,來實現上面功能 上面的操作符重載 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...