Scribe是Facebook開源的分佈式日誌收集系統,目前在各大互聯網公司內部已經獲得大量的應用。它可以從各類日誌源上收集日誌,存儲到一箇中央存儲系統(能夠是NFS,分佈式文件系統等)上,以便於進行集中統計分析處理。 php
它爲日誌的「分佈式收集,統一處理」提供了一個可擴展的,高容錯的方案。當中央存儲系統的網絡或者機器出現故障時,scribe會將日誌轉存到本地或者另外一個位置,當中央存儲系統恢復後,scribe會將轉存的日誌從新傳輸給中央存儲系統。其一般與Hadoop結合使用,scribe用於向HDFS中push日誌,而Hadoop經過MapReduce做業進行按期處理。 java
系統環境:Centos 5.8 X86_64python
安裝依賴包:c++
yum -y install gcc gcc-c++ m4 autoconf automake libtool libicu-devel python-devel libevent-devel
刷新動態連接庫: git
/sbin/ldconfig
下載安裝包:github
mkdir -p /data/software cd /data/software/ wget http://sourceforge.net/projects/boost/files/boost/1.44.0/boost_1_44_0.tar.gz/download wget http://archive.apache.org/dist/incubator/thrift/0.4.0-incubating/thrift-0.4.0.tar.gz wget https://github.com/downloads/facebook/scribe/scribe-2.1.tar.gz --no-check-certificate
注意:github上使用wget下載程序,須要使用指定--no-check-certificate參數。 apache
編譯安裝boost:bootstrap
cd /data/software/ tar zxvf boost_1_44_0.tar.gz cd boost_1_44_0 ./bootstrap.sh --prefix=/usr/local/boost ./bjam --prefix=/usr/local/boost install echo "/usr/local/boost/lib/" >> /etc/ld.so.conf /sbin/ldconfig
編譯安裝thrift:vim
thrift須要python支持distutils.core,若是看到的不是OK,請升級python-devel到更高版本。 緩存
cd /data/software/ tar zxvf thrift-0.4.0.tar.gz cd thrift-0.4.0 ./configure --prefix=/usr/local/thrift --with-csharp=no --with-java=no --with-erlang=no --with-perl=no --with-php=no --with-ruby=no --with-py=yes --with-libevent --with-boost=/usr/local/boost/ make make install echo "/usr/local/thrift/lib/" >> /etc/ld.so.conf /sbin/ldconfig
編譯安裝thrift-fb303:
cd /data/software/thrift-0.4.0/contrib/fb303/ ./bootstrap.sh --with-boost=/usr/local/boost/ ./configure --prefix=/usr/local/fb303 --with-boost=/usr/local/boost/ --with-thriftpath=/usr/local/thrift/ make make install
編譯安裝:
cd /data/software/ tar zxvf scribe-2.1.tar.gz cd scribe-2.1 ./bootstrap.sh --prefix=/usr/local/scribe --with-thriftpath=/usr/local/thrift/ --with-fb303path=/usr/local/fb303/ --with-boost=/usr/local/boost/ make make install
Scribe的配置文件分爲全局配置和存儲配置兩部分:
全局配置項
port:指示scribe服務器在哪個端口上監聽,默認是0,經過命令行參數選項-P能夠指定端口,也可以經過配置文件指定。在源代碼中就賦值給變量port。
max_msg_per_second:默認值是0,若是這個參數值是0將被忽略。隨着最近的改變這個參數不多被關聯使用到,max_queue_size參數將被應用到限制每秒最大的消息數。在scribeHandler::throttleDeny被使用。
max_queue_size(按字節):接收消息的隊列的最大字節,默認是5,000,000字節。在scribeHandler::Log使用。
check_interval(秒):用於控制多長時間檢查一次存儲,默認值是5.
new_thread_per_category(是/否):若是爲是,將爲每個分類場景建立一個新的線程,不然將創一個單線程爲每個在配置文件中定義的存儲。對於前綴存儲或默認存儲,若是這個參數設置成「否」將致使全部匹配這個分類的消息都由一個單獨的存儲來處理。不然將爲每個惟一的分類名建立一個新的存儲。默認爲「是」。
num_thrift_server_threads:爲接收消息的監聽線程數量,默認是3.
max_conn:最大的連接數。
存儲配置
Scribe服務器決定怎樣將日誌消息寫入是基於在配置中定義的存儲類型和相關參數設置,每個存儲都必須指定一個消息分類來處理三種異常。
默認存儲:默認分類處理任何不能被其餘存儲處理的分類,這兒僅僅可以有一個默認存儲。
前綴存儲:若是指定分類以一個*結尾,這個存儲將處理全部以指定前綴開頭的分類。
多個類別:在一個存儲定義中可以使用‘categories=’建立多個類別。
在上面三種狀況下,在文件存儲中將爲每個惟一的分類建立一個子目錄(除非new_thread_per_category被設置爲false)。
存儲配置變量
category:決定哪些消息被這個存儲處理。
type:存儲類型,有file、buffer、network、bucket、thriftfile、null、mutil。
target_write_size:默認是16,384字節,決定在這些消息處理以前在給定分類的消息隊列能夠增加到多大。
max_batch_size: 默認1,024,000字節(可能沒有被開源),決定在內存存儲隊列中一次可以被處理的數據的總數,這個(加上緩衝文件旋轉的大小)控制多大的一個thrift調用可行。
max_write_interval:默認是10秒,決定在這些消息處理以前在給定分類的消息隊列能夠用多長時間。
must_succeed(yes/no):是否必須成功,若是一個存儲處理消息失敗是否從新進入消息隊列排隊,若是設置成 ‘no’,且一個存儲不能處理這些消息,消息將被丟棄。默認是yes。強烈建議使用緩存來指一個定二級存儲來處理失敗的日誌。
存儲類型
file存儲配置
File存儲寫入消息到一個文件。
file_path:文件路徑,默認是「/tmp」。
base_filename:基本文件名稱,默認是分類名稱。
use_hostname_sub_directory(yes/no):使用服務器的主機名建立一個子目錄,默認是no。
sub_directory:使用指定的名稱建立一個子目錄。
rotate_period:文件建立週期,取值能夠是 「hourly」, 「daily」, 「never」,或者是name[後綴], 「never」是默認值,決定多長時間建立一個新文件,特別的後綴「s」, 「m」, 「h」, 「d」, 「w」分別表明second(默認)、minutes、hours、days和weeks。
rotate_hour:取值0-23,默認是1,若是rotate_period取值是daily,這個就決定天天的何時建立新文件。
rotate_minute:取值0-59,默認是15,若是rotate_period設置爲daily或hourly,這個就決定以一個小時事後多久建立一個新文件。
max_size:文件上限大小,默認1,000,000,000多字節,決定在輪流建立一個新文件之前一個文件可以增加到多大。
write_meta:取值yes或其餘任何,false爲默認值,若是文件被旋轉,最後一行將包含「scribe_meta」,跟着就是下一個文件名。
fs_type:文件類型,支持「std」和「hdfs」兩種格式,「std」爲默認值。
chunk_size:默認值是0,若是一個塊大小被指定,在文件內沒有消息可以跨越塊的邊界,除非有消息的大小超過塊的大小。
add_newlines:取值0或1,默認是0,若是設置爲1,之後的每個消息都寫入一個新行。
create_symlink:yes或其餘任何,默認是yes。若是爲yes,將保持一個符號連接指向最近一個被寫入的文件。
write_stats:yes/no,默認是yes。是否建立一個scribe_stats文件爲每個存儲來保持文件寫入的軌跡。
max_write_size:默認是1000000字節。File存儲將嘗試按max_write_size字節的塊大小刷新數據到文件系統。max_write_size的大小不能超過max_size。因爲target_write_size必定數量的消息被緩存。那麼文件存儲被調用來保持這些消息。File_store以一次性至少max_write_size大小字節的塊來保存這些消息。File存儲的最後一次寫入比max_write_size小;
write_category:寫入一個分類下面;
rotate_on_reopen:循環從新打開。
network存儲配置
Network存儲向其餘scribe服務器發送消息。Scribe保持持久的連接打開以致於它可以發送消息。(爲了錯誤信息或者若是下游機器過載,它將從新打開一個連接)。在正常運行的狀況下,scribe會基於當前緩存中存在多少條消息等待發送而分批次的發送。(若是scribe備份和緩存消息到本地磁盤,scribe會基於緩存文件大小按塊發送消息)
remote_host:發送消息的遠程主機的名稱或IP地址。
remote_port:在遠程主機上的端口。
timeout:socket超時,MS爲單位,默認是DEFAULT_SOCKET_TIMEOUT_MS, 在store.h中被設置爲5000。
use_conn_pool:yes或者任何其餘,默認是false。是否使用鏈接池代替爲每個遠程主機打開的連接。
smc_service:
service_options:
service_cache_timeout:
ignore_network_error:
dynamic_config_type:
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,另外一個是null。
max_queue_length:默認2,000,000條消息。若是在隊列中的消息數量超過了這個值,buffer存儲將切換寫入secondary store。
buffer_send_rate:默認值是1。決定每一次check_interval內,多少次從secondary store讀出一組消息而且發送到primary store中。
retry_interval:默認是300秒。在寫primary store失敗之後等待多長時間從新發送到primary store。
retry_interval_range:默認是60秒。將在指定retry_interval區間內隨機的選擇一個從新發送時間區間。
replay_buffer:取值yes/no,默認是yes。若是設置爲 ‘no’,buffer存儲不能從secondary store移除消息而且發送到primary store中去。
bucket存儲配置
Bucket存儲使用每一個帶前綴的消息做爲key寫入到多個文件中去。可以定義一個隱藏的或明確的bucket。定義隱藏的bucket必需要有一個名稱是 「bucket」 子bucket,這個子bucket能夠是file存儲、network存儲或者thriftfile存儲。
num_buckets:hash進入的bucket個數,默認是1。不能被hash進入任何bucket的消息將被放入一個特別的0號bucket。
bucket_type: 取值是「key_hash」, 「key_modulo」, 或者 「random」。
delimiter:必須是1-255之間的ascii代碼,不然默認是 ‘:’。第一次出如今消息前綴中的delimiter在‘hash/modulo’中將被用做key。Random不使用這個delimiter。
remove_key:取值yes/no,默認是是no。是否從消息中移除key前綴。
bucket_subdir:若是使用的是一個單獨定義的bucket,每個子目錄的名稱根據bucket的數量編號生成。
null存儲配置
忽略被給分類的全部消息。沒有參數。
mutil存儲配置
一個mutil存儲是將全部消息轉發到子存儲中去的一個存儲。一個mutil存儲可能有多個名叫「store0」, 「store1」, 「store2」等等的子存儲。
report_success:取值 「all」 or 「any」, 默認是 「all」。是否全部substores或任何substores必須成功地記錄消息,以報告爲成功的消息記錄在日誌消息
thriftfile存儲配置
Thriftfile存儲相似於file存儲,出了thriftfile存儲是用Thrift TFileTransport file存儲消息。
file_path:文件路徑,默認是「/tmp」。
base_filename:基本文件名稱,默認是分類名稱。
rotate_period:文件建立週期,取值能夠是 「hourly」, 「daily」, 「never」,或者是name[後綴], 「never」是默認值,決定多長時間建立一個新文件,特別的後綴「s」, 「m」, 「h」, 「d」, 「w」分別表明second(默認)、minutes、hours、days和weeks。
rotate_hour:取值0-23,默認是1,若是rotate_period取值是daily,這個就決定天天的何時建立新文件。
rotate_minute:取值0-59,默認是15,若是rotate_period設置爲daily或hourly,這個就決定以一個小時事後多久建立一個新文件。
max_size:文件上限大小,默認1,000,000,000多字節,決定在輪流建立一個新文件之前一個文件可以增加到多大。
fs_type:文件類型,當前只支持「std」,「std」爲默認值。
chunk_size:默認值是0,若是一個塊大小被指定,在文件內沒有消息可以跨越塊的邊界,除非有消息的大小超過塊的大小。
create_symlink:yes或其餘任何,默認是yes。若是爲yes,將保持一個符號連接指向最近一個被寫入的文件。
flush_frequency_ms:毫秒單位,若是沒有指定就使用默認300的 TFileTransport。決定一步到thrift file磁盤時間的頻率。
msg_buffer_size:以字節爲單位,若是沒有指定將使用默認爲0的TFileTransport。若是非零,將拒絕寫入比這個值大的。
mkdir -p /usr/local/scribe/conf (存放起服腳本、測試工具和配置文件) mkdir -p /usr/local/scribe/logs (存放日誌文件) mkdir -p /usr/local/scribe/data (存放數據文件) cd /usr/local/scribe/conf/
編輯啓動scribe服務端腳本
vim start_scribe_service.sh
#!/bin/sh export LANG=de_DE.UTF-8 /usr/local/scribe/bin/scribed /usr/local/scribe/conf/scribe_service.conf 1>/usr/local/scribe/logs/scribe_service.log 2>&1 &
編輯scribe服務配置文件
vim scribe_service.conf
port=1463 max_msg_per_second=2000000 check_interval=3 <store> category=default type=buffer target_write_size=20480 max_write_interval=1 buffer_send_rate=1 retry_interval=30 retry_interval_range=10 <primary> type=network remote_host=192.168.1.25 remote_port=1463 </primary> <secondary> type=file fs_type=std file_path=/data/scribe/data base_filename=log max_size=3000000 </secondary> </store>
編輯scribe_ctrl工具
vim scribe_ctrl
#!/usr/bin/env python import sys from fb303_scripts import * # thrift python packages need to be installed import thrift from thrift import protocol, transport from thrift.transport import TTransport from thrift.protocol import TBinaryProtocol if (len(sys.argv) > 2): port = int(sys.argv[2]) else: port = 1463 if (len(sys.argv) > 1): retval = fb303_simple_mgmt.service_ctrl(sys.argv[1], port, trans_factory = TTransport.TFramedTransportFactory(), prot_factory = TBinaryProtocol.TBinaryProtocolFactory()) sys.exit(retval) else: print 'Usage: scribe_ctrl command [port]' print ' commands: stop counters status version name alive' sys.exit(2)
編輯測試工具
vim scribe_cat
#!/usr/bin/python import sys from scribe import scribe from thrift.transport import TTransport, TSocket from thrift.protocol import TBinaryProtocol if len(sys.argv) == 2: category = sys.argv[1] host = '127.0.0.1' port = 1463 elif len(sys.argv) == 4 and sys.argv[1] == '-h': category = sys.argv[3] host_port = sys.argv[2].split(':') host = host_port[0] if len(host_port) > 1: port = int(host_port[1]) else: port = 1463 else: sys.exit('usage (message is stdin): scribe_cat [-h host[:port]] category') log_entry = scribe.LogEntry(dict(category=category, message=sys.stdin.read())) socket = TSocket.TSocket(host=host, port=port) transport = TTransport.TFramedTransport(socket) protocol = TBinaryProtocol.TBinaryProtocol(trans=transport, strictRead=False, strictWrite=False) client = scribe.Client(iprot=protocol, oprot=protocol) transport.open() result = client.Log(messages=[log_entry]) transport.close() if result == scribe.ResultCode.OK: sys.exit() elif result == scribe.ResultCode.TRY_LATER: print >> sys.stderr, "TRY_LATER" sys.exit(84) # 'T' else: sys.exit("Unknown error code.")
給予執行權限
chmod +x start_scribe_service.sh chmod +x scribe_ctrl chmod +x scribe_cat
啓動scribe服務
./start_scribe_service.sh
查看服務啓動端口狀況
netstat -nutpl|grep 1463
查看服務器日誌
tail -f scribe_service.log
控制工具:
cd /usr/local/scribe/conf/
使用方法:
scribe_ctrl command [port]
可用命令參數以下:
status – 若是服務器運行正常則返回'ALIVE'
version – 返回當前Scribe服務器的版本、
alive – 返回服務器運行時間
stop – 中止Scribe服務器
reload – 從新加載Scribe配置文件
counters – 返回下列統計信息 (若是非零):
received good: 返回Scribe服務器啓動後接收到的信息數
received bad: 接收到的非法信息數
sent:發送到另外一臺Scribe服務器的信息數
denied for queue size: 因信息隊列滿被禁止的請求數
denied for rate: 因爲速度限制而被禁止的請求數
retries: 緩衝儲存重試發送一批消息的次數
requeue: Scribe發送消息到一個Store的次數 (若是must_succeed 啓用).
lost: 沒有記錄的消息的數量。(推薦配置: 使用Buffer Stores 避免信息丟失)
received blank category: 接收到的沒有信息類別的信息數量
使用方法圖示以下:
測試命令以下:
cd /usr/local/scribe/conf/ echo "hello world" | ./scribe_cat test cd /usr/local/scribe/data/
測試結果圖示以下:
到這裏,scribe的安裝和配置方法基本上就完整了。若是你們有問題請和我溝通。^_^
關於如何將scribe運用到業務當中,請移步:http://cyr520.blog.51cto.com/714067/1265181