引子:後端
Scribe是Facebook開源的日誌收集系統,在Facebook內部已經獲得大量的應用。它可以從各類日誌源上收集日誌,存儲到一箇中央存儲系統(能夠是NFS,分佈式文件系統等)上,以便於進行集中統計分析處理。它爲日誌的「分佈式收集,統一處理」提供了一個可擴展的,高容錯的方案。當中央存儲系統的網絡或者機器出現故障時,scribe會將日誌轉存到本地或者另外一個位置,當中央存儲系統恢復後,scribe會將轉存的日誌從新傳輸給中央存儲系統。其一般與Hadoop結合使用,scribe用於向HDFS中push日誌,而Hadoop經過MapReduce做業進行按期處理。緩存
Scribe從各類數據源上收集數據,放到一個共享隊列上,而後push到後端的中央存儲系統上。當中央存儲系統出現故障時,scribe能夠暫時把日誌寫到本地文件中,待中央存儲系統恢復性能後,scribe把本地日誌續傳到中央存儲系統上。須要注意的是,各個數據源須經過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後端存儲爲file、network和buffer時的操做方法和流程,演示示例程序位於scribe/examples目錄,目錄結構以下所示:[hadoop@hadoop1 examples]$ ls
example1.conf example2client.conf hdfs_example.conf scribe_cat
example2central.conf hdfs_example2.conf README scribe_ctrl分佈式
1、Example1:fileoop
#step_01:建立消息文件存放目錄
mkdir /tmp/scribetest
#step_02:啓動Scribe
src/scribed examples/example1.conf
#step_03:發送消息到scribe
echo "hello world" | ./scribe_cat test
#step_04: 驗證消息記錄
cat /tmp/scribetest/test/test_current
#step_05: 檢查scribe狀態
./scribe_ctrl status
#step_06: 查看scribe計數
./scribe_ctrl counters
#step_07: 中止scribe運行
./scribe_ctrl stop性能
2、Example2:Network
this
#step_01:建立工做目錄
mkdir /tmp/scribetest2
#step_02:啓動中心scribe程序,服務端口1463,記錄方式爲file
src/scribed examples/example2central.conf
#step_03:啓動中心client程序,服務端口1464,存儲模式爲Network,寫入消息到中心scribe
src/scribed examples/example2client.conf
#step_04:發送消息到client scribe
echo "test message" | ./scribe_cat -h localhost:1464 test2
echo "this message will be ignored" | ./scribe_cat -h localhost:1464 ignore_me
echo "123:this message will be bucketed" | ./scribe_cat -h localhost:1464 bucket_me線程
#step_05:驗證消息被中心scribe接收和記錄到文件
cat /tmp/scribetest/test2/test2_current
#step_06:驗證消息分組,不一樣category的數據存放到不一樣目錄中
cat /tmp/scribetest/bucket*/bucket_me_current日誌
#step_07:狀態檢查消息計數檢查,若是管理命令不加參數默認爲1643
./scribe_ctrl status 1463
./scribe_ctrl status 1464
./scribe_ctrl counters 1463
./scribe_ctrl counters 1464
#step_08:關閉服務進程
./scribe_ctrl stop 1463
./scribe_ctrl stop 1464blog
3、Example3:buffer
#step_01:啓動中心scribe,服務端口1463
src/scribed examples/example2central.conf
#step_02:啓動客戶端scribe,服務端口1464
src/scribed examples/example2client.conf
#step_03:發送消息到客戶端scribe
echo "test message 1" | ./scribe_cat -h localhost:1464 test3
#step_04:驗證消息是否接受,在中心scribe消息存儲目錄查找
cat /tmp/scribetest/test3/test3_current
#step_05:中止中心scribe服務,咱們期待看到結果是緩存
./scribe_ctrl stop 1463
#step_06:驗證中心scribe運行狀態
./scribe_ctrl status 1463
#step_07:發送消息到客戶端-此時消息期待結果是緩存
echo "test message 2" | ./scribe_cat -h localhost:1464 test3
#step_08:超時客戶端scribe會有報警信息
./scribe_ctrl status 1464
#step_09:重啓中心scribe
src/scribed examples/example2central.conf
#step_10:驗證scribe狀態
./scribe_ctrl status 1463
./scribe_ctrl status 1464
#step_10:驗證中心scribe是否接收到緩存的消息
cat /tmp/scribetest/test3/test3_current
#step_11:關閉服務進程
./scribe_ctrl stop 1463
./scribe_ctrl stop 1464
4、工做流程
經過以上實例,咱們能夠看到scribe核心的工做原理和處理流程,具體流程以下圖所示: