python分布式日志收集系统_Go实现海量日志收集系统(一)
項(xiàng)目背景
每個(gè)系統(tǒng)都有日志,當(dāng)系統(tǒng)出現(xiàn)問題時(shí),需要通過日志解決問題
當(dāng)系統(tǒng)機(jī)器比較少時(shí),登陸到服務(wù)器上查看即可滿足
當(dāng)系統(tǒng)機(jī)器規(guī)模巨大,登陸到機(jī)器上查看幾乎不現(xiàn)實(shí)
當(dāng)然即使是機(jī)器規(guī)模不大,一個(gè)系統(tǒng)通常也會(huì)涉及到多種語言的開發(fā),拿我們公司來說,底層是通過c++開發(fā)的,而也業(yè)務(wù)應(yīng)用層是通過Python開發(fā)的,并且即使是C++也分了很多級別應(yīng)用,python這邊同樣也是有多個(gè)應(yīng)用,那么問題來了,每次系統(tǒng)出問題了,如何能夠迅速查問題? 好一點(diǎn)的情況可能是python應(yīng)用層查日志發(fā)現(xiàn)是系統(tǒng)底層處理異常了,于是又叫C++同事來查,如果C++這邊能夠迅速定位出錯(cuò)誤告知python層這邊還好,如果錯(cuò)誤好排查,可能就是各個(gè)開發(fā)層的都在一起查到底是哪里引起的。當(dāng)然可能這樣說比較籠統(tǒng),但是卻引發(fā)了一個(gè)問題:
當(dāng)系統(tǒng)出現(xiàn)問題后,如何根據(jù)日志迅速的定位問題出在一個(gè)應(yīng)用層?
在平常的工作中如何根據(jù)日志分析出一個(gè)請求到系統(tǒng)主要在那個(gè)應(yīng)用層耗時(shí)較大?
在平常的工作中如何獲取一個(gè)請求到達(dá)系統(tǒng)后在各個(gè)層測日志匯總?
針對以上問題,我們想要實(shí)現(xiàn)的一個(gè)解決方案是:
把機(jī)器上的日志實(shí)時(shí)收集,統(tǒng)一的存儲到中心系統(tǒng)
然后再對這些日志建立索引,通過搜索即可以找到對應(yīng)日志
通過提供界面友好的web界面,通過web即可以完成日志搜索
關(guān)于實(shí)現(xiàn)這個(gè)系統(tǒng)時(shí)可能會(huì)面臨的問題:
實(shí)時(shí)日志量非常大,每天幾十億條(雖然現(xiàn)在我們公司的系統(tǒng)還沒達(dá)到這個(gè)級別)
日志準(zhǔn)實(shí)時(shí)收集,延遲控制在分鐘級別
能夠水平可擴(kuò)展
關(guān)于日志收集系統(tǒng),業(yè)界的解決方案是ELK
ELK的解決方案是通用的一套解決方案,所以不免就會(huì)產(chǎn)生以下的幾個(gè)問題:
運(yùn)維成本高,每增加一個(gè)日志收集,都需要手動(dòng)修改配置
監(jiān)控缺失,無法準(zhǔn)確獲取logstash的狀態(tài)
無法做定制化開發(fā)以及維護(hù)
針對這種情況,其實(shí)我們想要的系統(tǒng)是agent可以動(dòng)態(tài)的獲取某個(gè)服務(wù)器我們需要監(jiān)控哪些日志
以及那些日志我們需要收集,并且當(dāng)我們需要收集日志的服務(wù)器下線了,我們可以動(dòng)態(tài)的停止收集
當(dāng)然這些實(shí)現(xiàn)的效果最終也是通過web界面呈現(xiàn)。
日志收集系統(tǒng)設(shè)計(jì)
主要的架構(gòu)圖為
關(guān)于各個(gè)組件的說明:
Log Agent,日志收集客戶端,用來收集服務(wù)器上的日志
Kafka,高吞吐量的分布式隊(duì)列,linkin開發(fā),apache頂級開源項(xiàng)目
ES,elasticsearch,開源的搜索引擎,提供基于http restful的web接口
Hadoop,分布式計(jì)算框架,能夠?qū)Υ罅繑?shù)據(jù)進(jìn)行分布式處理的平臺
關(guān)于Kakfa的介紹
Apache Kafka是一個(gè)分布式發(fā)布 - 訂閱消息系統(tǒng)和一個(gè)強(qiáng)大的隊(duì)列,可以處理大量的數(shù)據(jù),并使您能夠?qū)⑾囊粋€(gè)端點(diǎn)傳遞到另一個(gè)端點(diǎn)。 Kafka適合離線和在線消息消費(fèi)。 Kafka消息保留在磁盤上,并在群集內(nèi)復(fù)制以防止數(shù)據(jù)丟失。 Kafka構(gòu)建在ZooKeeper同步服務(wù)之上。 它與Apache Storm和Spark非常好地集成,用于實(shí)時(shí)流式數(shù)據(jù)分析。
注:這里關(guān)于Kafka并不會(huì)介紹太多,只是對基本的內(nèi)容和應(yīng)用場景的說明,畢竟展開來說,這里的知識也是費(fèi)非常多的
Kafka中有幾個(gè)基本的消息術(shù)語需要了解:
Kafka將消息以topic為單位進(jìn)行歸納。
將向Kafka topic發(fā)布消息的程序成為producers.
將預(yù)訂topics并消費(fèi)消息的程序成為consumer.
Kafka以集群的方式運(yùn)行,可以由一個(gè)或多個(gè)服務(wù)組成,每個(gè)服務(wù)叫做一個(gè)broker.
Kafka的優(yōu)點(diǎn):
可靠性 - Kafka是分布式,分區(qū),復(fù)制和容錯(cuò)的。
可擴(kuò)展性 - Kafka消息傳遞系統(tǒng)輕松縮放,無需停機(jī)。
耐用性 - Kafka使用分布式提交日志,這意味著消息會(huì)盡可能快地保留在磁盤上,因此它是持久的。
性能 - Kafka對于發(fā)布和訂閱消息都具有高吞吐量。 即使存儲了許多TB的消息,它也保持穩(wěn)定的性能。
Kafka非常快,并保證零停機(jī)和零數(shù)據(jù)丟失。
Kafka的應(yīng)用場景:
異步處理, 把非關(guān)鍵流程異步化,提高系統(tǒng)的響應(yīng)時(shí)間和健壯性
應(yīng)用解耦,通過消息隊(duì)列
流量削峰
關(guān)于ZooKeeper介紹
ZooKeeper是一種分布式協(xié)調(diào)服務(wù),用于管理大型主機(jī)。在分布式環(huán)境中協(xié)調(diào)和管理服務(wù)是一個(gè)復(fù)雜的過程。ZooKeeper通過其簡單的架構(gòu)和API解決了這個(gè)問題。ZooKeeper允許開發(fā)人員專注于核心應(yīng)用程序邏輯,而不必?fù)?dān)心應(yīng)用程序的分布式特性。
Apache ZooKeeper是由集群(節(jié)點(diǎn)組)使用的一種服務(wù),用于在自身之間協(xié)調(diào),并通過穩(wěn)健的同步技術(shù)維護(hù)共享數(shù)據(jù)。ZooKeeper本身是一個(gè)分布式應(yīng)用程序,為寫入分布式應(yīng)用程序提供服務(wù)。
ZooKeeper主要包含幾下幾個(gè)組件:
Client(客戶端):我們的分布式應(yīng)用集群中的一個(gè)節(jié)點(diǎn),從服務(wù)器訪問信息。對于特定的時(shí)間間隔,每個(gè)客戶端向服務(wù)器發(fā)送消息以使服務(wù)器知道客戶端是活躍的。類似地,當(dāng)客戶端連接時(shí),服務(wù)器發(fā)送確認(rèn)碼。如果連接的服務(wù)器沒有響應(yīng),客戶端會(huì)自動(dòng)將消息重定向到另一個(gè)服務(wù)器。
Server(服務(wù)器):服務(wù)器,我們的ZooKeeper總體中的一個(gè)節(jié)點(diǎn),為客戶端提供所有的服務(wù)。向客戶端發(fā)送確認(rèn)碼以告知服務(wù)器是活躍的。
Ensemble:ZooKeeper服務(wù)器組。形成ensemble所需的最小節(jié)點(diǎn)數(shù)為3。
Leader: 服務(wù)器節(jié)點(diǎn),如果任何連接的節(jié)點(diǎn)失敗,則執(zhí)行自動(dòng)恢復(fù)。Leader在服務(wù)啟動(dòng)時(shí)被選舉。
Follower:跟隨leader指令的服務(wù)器節(jié)點(diǎn)。
ZooKeeper的應(yīng)用場景:
服務(wù)注冊&服務(wù)發(fā)現(xiàn)
配置中心
分布式鎖
Zookeeper是強(qiáng)一致的多個(gè)客戶端同時(shí)在Zookeeper上創(chuàng)建相同znode,只有一個(gè)創(chuàng)建成功
關(guān)于Log Agent
這個(gè)就是我們后面要通過代碼實(shí)現(xiàn)的一步分內(nèi)容,主要實(shí)現(xiàn)的功能是:
類似于我們在linux下通過tail的方法讀日志文件,講讀取的內(nèi)容發(fā)給Kafka
這里需要知道的是,我們這里的tailf是可以動(dòng)態(tài)變化的,當(dāng)配置文件發(fā)生變化是,可以通知我們程序自動(dòng)增加需要增加的tailf去獲取相應(yīng)的日志并發(fā)給kafka producer
主要由一下幾部目錄組成:
Kafka
tailf
configlog
小結(jié)
以上是對整個(gè)要開發(fā)的系統(tǒng)的一個(gè)總的概括,以及架構(gòu)的一個(gè)構(gòu)建,并且各個(gè)組件的實(shí)現(xiàn),接下來會(huì)一個(gè)一個(gè)實(shí)現(xiàn)每個(gè)部分的功能,下一篇文章會(huì)實(shí)現(xiàn)上述組件中l(wèi)og Agent的開發(fā)
Golang 課程火熱招生資料找WeChat:17812796384
總結(jié)
以上是生活随笔為你收集整理的python分布式日志收集系统_Go实现海量日志收集系统(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 五项管理行动日志_迈向学习型组织,企业必
- 下一篇: python supper_python