python分布式日志收集系统_Go实现海量日志收集系统(一)
項目背景
每個系統都有日志,當系統出現問題時,需要通過日志解決問題
當系統機器比較少時,登陸到服務器上查看即可滿足
當系統機器規模巨大,登陸到機器上查看幾乎不現實
當然即使是機器規模不大,一個系統通常也會涉及到多種語言的開發,拿我們公司來說,底層是通過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非???#xff0c;并保證零停機和零數據丟失。
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的開發
Golang 課程火熱招生資料找WeChat:17812796384
總結
以上是生活随笔為你收集整理的python分布式日志收集系统_Go实现海量日志收集系统(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 五项管理行动日志_迈向学习型组织,企业必
- 下一篇: python supper_python