分布式日志系統:Scribe

jopen 10年前發布 | 21K 次閱讀 分布式/云計算/大數據 scribe

Scribe是非死book開源的日志收集系統,在非死book內部已經得到大量的應用。它能夠從各種日志源上收集日志,存儲到一個中央存 儲系統(可以是NFS,分布式文件系統等)上,以便于進行集中統計分析處理。它為日志的“分布式收集,統一處理”提供了一個可擴展的,高容錯的方案。當中 央存儲系統的網絡或者機器出現故障時,scribe會將日志轉存到本地或者另一個位置,當中央存儲系統恢復后,scribe會將轉存的日志重新傳輸給中央 存儲系統。其通常與Hadoop結合使用,scribe用于向HDFS中push日志,而Hadoop通過MapReduce作業進行定期處理。

Scribe支持的特性:

  1. 構建應用系統和分析系統的橋梁,并將它們之間的關聯解耦;
  2. 支持近實時的在線分析系統和類似于Hadoop之類的離線分析系統;
  3. 具有高可擴展性。即:當數據量增加時,可以通過增加節點進行水平擴展。

如下圖所示,Scribe從各種數據源上收集數據,放到一個共享隊列上,然后push到后端的中央存儲系統上。當中央存儲系統出現故障時,scribe可以暫時把日志寫到本地文件中,待中央存儲系統恢復性能后,scribe把本地日志續傳到中央存儲系統上。

分布式日志系統:Scribe

Scribe使用thrift傳輸log,因此無論是什么語言開發的項目都可以實現log收集,傳送到遠程或主從同步到遠程。Scribe由兩部分 組成:central scribe server和local scribe server。在分布式系統中,每一個節點都會運行一個local scribe server,收集此節點的日志信息,并將其發送給central scribe server。各個數據源需通過thrift向scribe傳輸數據,每條數據記錄包含一個category和一個message。可以在scribe配 置中指定thrift線程數,默認是3。在后端,scribe可以將不同category的數據存放到不同目錄中,以便于進行分別處理。后端的日志存儲方 式可以是各種各樣的store,包括file,buffer(雙層存儲,一個主存儲,一個副存儲),network(另一個scribe服務 器),bucket(包含多個store,通過hash將數據存到不同store中),null(忽略數據),thriftfile(寫到一個 thrift tfile transport文件中)和multi(把數據同時存放到不同store中)。

Scribe中各種store介紹:

file

將日志寫到文件或者NFS中。支持兩種文件格式,即std和hdfs,分別表示普通文本文件和HDFS。可配置的選項有:

  • max_size:文件大小上限,即當文件大小達到max_size時,創建新的文件繼續存儲數據。
  • rotate_period:文件創建周期,可以是hourly,daily,never和number[sufix]。sufix可以是s(second),m(minute),h(hour),d(day),w(week)。
  • sub_directory:子目錄名字
  • base_filename:文件前綴,如news,則會依次將數據存儲到文件news_20110403_00000,news_20110403_00001,……

null

這也是一種常用的store。用戶可以在配置文件中配置一種叫default的category,如果數據所屬的category沒有在配置文件中 設置相應的存儲方式,則該數據會被當做default。如果用戶想忽略這樣的數據,可以將它放入null store中。需要注意的是,Scribe會將數據首先緩存到buffer中,待buffer滿后再flush到HDFS上。當數據量非常少時,由于緩存 的原因,部分數據可能未寫到HDFS中,這時用戶可以調整scribe的相關配置參數或者關閉scribe(如減小max_size),使數據全部寫到 HDFS中。如果用戶采用減小max_size的方案,此時需要注意,HDFS不能很好的保存小文件(可能會丟失數據,見擴展閱讀資料3)。

buffer

這是最常用的一種store。該store中包含兩個子store,其中一個是primary store,另一個是secondary store。日志會優先寫到primary store中,如果primary store出現故障,則scribe會將日志暫存到secondary store中,待primary store恢復性能后,再將secondary store中的數據拷貝到primary store中。其中,secondary store僅支持兩種store,一個是file,另一個是hdfs。

Scribe的技術架構:

分布式日志系統:Scribe

如上圖所示:Scribe服務器底層數據通信框架是Thrift,Thrift也是非死book開源的,并得到了廣泛的使用。也用到了C++的 準標準庫boost,主要使用共享指針和文件相關的功能。Thrift也用到了libevent開發庫和socket編程技術。

Scribe部署結構:

分布式日志系統:Scribe

Scribe的主要功能

  1. 支持多種存儲類型:7種并且可擴展
  2. 日志自動切分功能:按文件大小和時間切分
  3. 靈活的客戶端:

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

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

  1. 支持日志分類功能(非死book有上百種日志分類)
  2. 其他功能

(1)連接池

(2)靈活的日志緩存大小

(3)多線程功能(消息隊列)

(4)scribe服務器之間可以轉發日志

  1. 以上功能都是可以通過配置文件來靈活配置

Scribe使用方案

  1. 和產生日志文件的應用系統集成。scribe能夠和各種應用系統很好的集成是因為它提供幾乎所有的開發語言的開發包
  2. 應用系統在本地產生日志文件,使用一個獨立運行的客戶端程序同樣,獨立的客戶端也可以采用各種語言開發,我們采用的是python來開發客戶端

Scribe存在的問題

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

1、單點故障問題,有三個地方存在單點故障:

(1)中心服務器

(2)本地服務器

(3)收集日志的客戶端程序

2、日志丟失問題。當日志文件發生切分的時候可能導致日志丟失。

3、歷史日志收集問題

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

總起來說,scribe為日志收集提供了一種容錯且可擴展的方案。scribe可以從不同數據源,不同機器上收集日志,然后將它們存入一個中央存儲 系統,以便于進一步處理。當采用HDFS作為中央系統時,可以進一步利用Hadoop進行處理數據,于是scribe+HDFS+MapReduce方案 便誕生了。具體如下圖所示:

分布式日志系統:Scribe

由于scribe資料比較少,網上討論也不是十分活躍,不少人轉用其它一些日志系統,比如:rsyslog 和 Chukwa。

參考資料

  • scribe主頁:https://github.com/非死book/scribe
  • scribe介紹:http://blog.octo.com/en/scribe-a-way-to-aggregate-data-and-why-not-to-directly-fill-the-hdfs/
  • HDFS小文件問題:http://www.cloudera.com/blog/2009/02/the-small-files-problem/
  • Scribe所有資料的匯總:http://sameerparwani.com/posts/非死book-scribe-server-documentation-and-tutorials
引用地址:http://www.biaodianfu.com/scribe.html
     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!