1. 程式人生 > >分散式日誌收集系統: Facebook Scribe

分散式日誌收集系統: Facebook Scribe

1.分散式日誌收集系統:背景介紹

許多公司的平臺每天會產生大量的日誌(一般為流式資料,如,搜尋引擎的pv,查詢等),處理這些日誌需要特定的日誌系統,一般而言,這些系統需要具有以下特徵:

(1) 構建應用系統和分析系統的橋樑,並將它們之間的關聯解耦;

(2) 支援近實時的線上分析系統和類似於Hadoop之類的離線分析系統;

(3) 具有高可擴充套件性。即:當資料量增加時,可以通過增加節點進行水平擴充套件。

 

2.分散式日誌收集系統:Facebook Scribe主要內容

(1)Scribe簡介及系統架構

(2)Scribe技術架構

(3)Scribe部署結構

(4)Scribe主要功能和使用方案

(5)Scribe的具體應用例項

(6)Scribe的擴充套件

(7)Scribe研究體會

 

3.Scribe簡介

Scribe是facebook開源的日誌收集系統,在facebook內部已經得到大量的應用。 Scribe是基於一個使用非阻斷C++伺服器的thrift服務的實現。它能夠從各種日誌源上收集日誌,儲存到一箇中央儲存系統 (可以是NFS,分散式檔案系統等)上,以便於進行集中統計分析處理。它為日誌的“分散式收集,統一處理”提供了一個可擴充套件的,高容錯的方案。

 

4.Scribe的系統架構

如上圖所示:Scribe從各種資料來源上收集資料,放到一個共享佇列上,然後push到後端的中央儲存系統上。當中央儲存系統出現故障時,scribe可以暫時把日誌寫到本地檔案中,待中央儲存系統恢復效能後,scribe把本地日誌續傳到中央儲存系統上。

 

5.Scribe的技術架構

如上圖所示:Scribe伺服器底層資料通訊框架是Thrift,Thrift也是Facebook開源的,並得到了廣泛的使用。也用到了C++的準標準庫boost,主要使用共享指標和檔案相關的功能。Thrift也用到了libevent開發庫和socket程式設計技術。

 

6.Scribe部署結構

 

7.Scribe的主要功能

1.支援多種儲存型別:7種並且可擴充套件

2.日誌自動切分功能:按檔案大小和時間切分

3.靈活的客戶端:

(1)支援多種常用語言(Thrift提供支援);

(2)可與應用系統整合;可以作實現獨立客戶端

4.支援日誌分類功能(Facebook有上百種日誌分類)

5.其他功能

(1)連線池

(2)靈活的日誌快取大小

(3)多執行緒功能(訊息佇列)

(4)scribe伺服器之間可以轉發日誌

6.以上功能都是可以通過配置檔案來靈活配置

 

8.Scribe使用方案

(1)和產生日誌檔案的應用系統整合

scribe能夠和各種應用系統很好的整合是因為它提供幾乎所有的開發語言的開發包

(2)應用系統在本地產生日誌檔案,使用一個獨立執行的客戶端程式同樣,獨立的客戶端也可以採用各種語言開發,我們採用的是python來開發客戶端

 

9.Scribe的具體應用例項

1.Facebook肯定大量的使用,主要用於處理Facebook級別日誌,一旦有新的日誌分類生成,Scribe將自動處理。(Facebook有上百個日誌分類)。

2. Twitter:一款分散式實時統計系統Rainbird使用了scribe

3.我的公司:

(1)*****

(2)*****

(3)*****

(4)*****

(5)*****

(6)*****

4.其他

 

10.Scribe的擴充套件:存在的問題

雖然scribe系統是如此的優秀,但是也存在著一些不足和問題,針對存在的問題我們對scribe進行擴充套件。我們發現scribe存在的主要問題如下:

1、單點故障問題

有三個地方存在單點故障:

(1)中心伺服器

(2)本地伺服器

(3)收集日誌的客戶端程式

2、日誌丟失問題

當日志文件發生切分的時候可能導致日誌丟失

3、歷史日誌收集問題

4、scribe伺服器掛了沒有及時通知

 

11.Scribe的擴充套件:問題解決方案

針對上面我們提出的問題,主要提供如下相應的解決方案:

1.中心伺服器單點故障

可以部署多箇中心伺服器,然後本地伺服器通過配置檔案可以自動在這些伺服器之間進行切換

2.其餘的問題我們都是通過自己寫的python客戶端解決的

python客戶端我們是基於一個開源的專案進行二次開發的,因為開源的python客戶端功能很簡單,只是跟蹤一個日誌檔案並把日誌檔案的資料讀取匯入到scribe本地伺服器

 

12.Scribe的擴充套件:python客戶端

我們開發的python客戶端主要實現瞭如下功能:

1、解決本地scribe伺服器的單點故障

我們可以通過配置多個本地scribe伺服器(通過配置檔案配置,相當的靈活),python指令碼會根據配置的這些伺服器自動切換(當一個scribe掛掉之後自動切換,如果掛掉本地scribe伺服器重新啟動以後又會自動切換回去。

2、解決日誌丟失的問題

開源的python客戶端是按照固定的時間間隔掃描日誌檔案是否有變化,如果在這個時間段內發生日誌切換會導致日誌丟失。我們同樣是採用這個方式去檢測日誌檔案,不過我們在發生日誌切分的時候會再次去檢測被切分走得日誌檔案是否已經收集完畢。

3、解決歷史日誌收集

如果在我們執行python客戶端以前已經產生了日誌,這部分的日誌收集也是我們新增的一個功能

4、解決自身的單點故障問題

不排除我們的python客戶端也會掛掉的時候,當我們下次啟動怎樣保證我們收集的日誌不重複不丟失是需要解決的問題。我們的解決方案就是對已經收集的日誌檔案的各種資訊做序列化(主要是已經收集日誌檔案的位置)

5、收集日誌檔案怎樣保證按照日誌生成的順序收集

日誌的生成順序就是跟他們檔案的建立時間是相關的,通過這一點我們可以實現。

6、及時通知機制

為了及時的通知到scrib伺服器掛掉的資訊到相關人員,我們開發了郵件通知機制,就是當某一個本地scribe伺服器掛掉以後會觸發郵件傳送

 

13.Scribe研究體會

怎樣從我們工作的內容深入學習?

1.每個人在公司負責開發的內容都是很有限的,怎樣從我們開發的內容入手深入研究和學習更多的知識?

2.Scribe研究的例子!

 

14.總結:以上內容有一些是來至網際網路,在加入了自己的一些理解,希望對需要的人有所幫助!

文末也給大家,分享主要有C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協程,DPDK技術,面試技巧方面的資料技術討論。

感興趣的朋友可