Scribe日志收集系統介紹
1、 概述
Scribe是非死book開源的日志收集系統,在非死book內部已經得到大量的應用。它能夠從各種日志源上收集日志,存儲到一個中央存 儲系統(可以是NFS,分布式文件系統等)上,以便于進行集中統計分析處理。它為日志的“分布式收集,統一處理”提供了一個可擴展的,高容錯的方案。當中 央存儲系統的網絡或者機器出現故障時,scribe會將日志轉存到本地或者另一個位置,當中央存儲系統恢復后,scribe會將轉存的日志重新傳輸給中央 存儲系統。
scribe的相關資料比較少,主要限于它的主頁(見參考資料1)。此外,它的安裝比較復雜,可參見我的另一篇博文:scribe日志收集系統安裝方法介紹。
2、 架構
如上圖所示,Scribe從各種數據源上收集數據,放到一個共享隊列上,然后push到后端的中央存儲系統上。當中央存儲系統出現故障時,scribe可以暫時把日志寫到本地文件中,待中央存儲系統恢復性能后,scribe把本地日志續傳到中央存儲系統上。
需要注意的是,各個數據源須通過thrift(由于采用了thrift,客戶端可以采用各種語言編寫,關于thrift框架,參見我的這篇博文:Thrift框架介紹) 向scribe傳輸數據(每條數據記錄包含一個category和一個message)。可以在scribe配置用于監聽端口的thrift線程數(默認 為3)。在后端,scribe可以將不同category的數據存放到不同目錄中,以便于進行分別處理。后端的日志存儲方式可以是各種各樣的store, 包括file(文件),buffer(雙層存儲,一個主儲存,一個副存儲),network(另一個scribe服務器),bucket(包含多個 store,通過hash的將數據存到不同store中),null(忽略數據),thriftfile(寫到一個Thrift TFileTransport文件中)和multi(把數據同時存放到不同store中)。
3、 scribe中各種store介紹
(1)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,……
(2) 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。
port=1464
max_msg_per_second=2000000
check_interval=1
max_queue_size=100000000
num_thrift_server_threads=2
# DEFAULT - write all messages to hadoop hdfs
category=default
type=buffer
target_write_size=20480
max_write_interval=1
buffer_send_rate=1
retry_interval=30
retry_interval_range=10
type=file
fs_type=hdfs
file_path=hdfs://localhost:9000/scribedata
create_symlink=no
use_hostname_sub_directory=yes
base_filename=thisisoverwritten
max_size=1000000000
rotate_period=daily
rotate_hour=0
rotate_minute=5
add_newlines=1
type=file
fs_type=std
file_path=/tmp/scribe-central-hdfs
base_filename=thisisoverwritten
max_size=3000000
(3) null
這也是一種常用的store。用戶可以在配置文件中配置一種叫default的category,如果數據所屬的category沒有在配置文件中設置相應的存儲方式,則該數據會被當做default。如果用戶想忽略這樣的數據,可以將它放入null store中。
其它store的介紹,可參見參考資料1。
需要注意的是,Scribe會將數據首先緩存到buffer中,待buffer滿后再flush到HDFS上。當數據量非常少時,由于緩存的原因, 部分數據可能未寫到HDFS中,這時用戶可以調整scribe的相關配置參數或者關閉scribe(如減小max_size),使數據全部寫到HDFS 中。如果用戶采用減小max_size的方案,此時需要注意,HDFS不能很好的保存小文件(可能會丟失數據,見參考資料3)。
4、 總結
總起來說,scribe為日志收集提供了一種容錯且可擴展的方案。scribe可以從不同數據源,不同機器上收集日志,然后將它們存入一個中央存儲 系統,以便于進一步處理。當采用HDFS作為中央系統時,可以進一步利用Hadoop進行處理數據,于是scribe+HDFS+MapReduce方案 便誕生了。具體如下圖(摘自參考資料2)所示:
由于scribe資料比較少,網上討論也不是十分活躍,不少人轉用其它一些日志系統,比如:rsyslog 和 Chukwa。
5、 參考資料
(1) scribe主頁:https://github.com/非死book/scribe
(2) scribe介紹 :http://blog.octo.com/en/scribe-a-way-to-aggregate-data-and-why-not-to-directly-fill-the-hdfs/
(3) HDFS小文件問題:http://www.cloudera.com/blog/2009/02/the-small-files-problem/
(4) Scribe所有資料的匯總:http://sameerparwani.com/posts/非死book-scribe-server-documentation-and-tutorials
原創文章,轉載請注明: 轉載自董的博客