Linux 安裝 Scribe

序言php


它可以從各類日誌源上收集日誌,存儲到一箇中央存儲系統(能夠是NFS,分佈式文件系統等)上,以便於進行集中統計分析處理。java

源碼安裝python


一、前提準備
c++

Scibe須要下面的依賴庫,執行下面命令bootstrap

yum -y install gcc gcc-c++ m4 autoconf automake libtool libicu-devel python-devel libevent-devel byacc flex緩存

下面的比較全,不放心的話能夠直接執行下面的ruby

yum install gcc-c++ libevent libevent-devel automake autoconf m4 bison zlib zlib-devel bzip2 bzip2-devel flex pkgconfig python python-devel ruby ruby-devel mono-devel libxml2 libxml2-devel ant openssl-devel bash

刷新動態連接庫服務器

/sbin/ldconfig併發


二、準備安裝包

演示以下版本


三、安裝boost

tar -zxvf boost_1_44_0.tar.gz

cd boost_1_44_0

 ./bootstrap.sh --prefix=/usr/local/boost

./bjam -s HAVE_ICU=1 --prefix=/usr/local/boost  

--includedir=/usr/local/boost/include

--libdir=/usr/local/boost/lib

紅色部分能夠不配置

./bjam install --prefix=/usr/local/boost

echo "/usr/local/boost/lib/" >> /etc/ld.so.conf

sudo /sbin/ldconfig


四、安裝thrift

tar -zxvf thrift-0.8.0.tar.gz

cd thrift-0.8.0

./configure --prefix=/usr/local/thrift --with-csharp=no --with-java=yes

--with-erlang=no --with-perl=no --with-php=no --with-ruby=no
--with-py=yes --with-libevent --with-boost=/usr/local/boost/

   (若是提示沒有權限./configure 那麼先把configure文件賦予可執行權限上述配置較多,可視狀況而定。如:./configure  --prefix=/usr/local/thrift --with-java=no --with-boost=/usr/local/boost  --with-erlang=no --with-perl=no --with-php=no --with-ruby=no)

make && make install

echo "/usr/local/thrift/lib/" >> /etc/ld.so.conf

/sbin/ldconfig


五、安裝thrift-fb303

cd thrift-0.8.0/contrib/fb303

./bootstrap.sh                執行後會出現configure可執行文件

./configure --prefix=/usr/local/thrift/fb303 --with-boost=/usr/local/boost/

--with-thriftpath=/usr/local/thrift/

make

若是報錯多是以下修改方式:

/usr/local/thrift-0.8.0/contrib/fb303/cpp/gen-cpp/FacebookService.h 添加#include <stdint.h>

/usr/local/thrift/include/thrift/transport/TFDTransport.h添加了#include <stdint.h>

/usr/local/thrift/include/thrift/TApplicationException.h添加了#include <stdint.h>

/usr/local/thrift/include/thrift/protocol/TBinaryProtocol.h添加了#include <arpa/inet.h>

make install

注意:若是thrift和thrift-fb303沒法安裝的話那就換版本


六、安裝Scribe

unzip scribe-master.zip               (facebook-scribe-63e4824.tar 也是這個步驟)

cd scribe-master

./bootstrap.sh --with-boost=/usr/local/boost/  執行後,會生成configure文件

./configure --prefix=/usr/local/scribe --with-boost=/usr/local/boost

--with-thriftpath=/usr/local/thrift

--with-fb303path=/usr/local/thrift/fb303


make

make install

至此/usr/local/scribe 目錄建立則安裝完成。


七、測試Scribe是否安裝成功

將scribe-master/examples/下的example*.conf拷貝到/usr/local/scribe下這個是測試的配置文件。

複製到/usr/local/scribe/bin下

(爲了方便起見,能夠講example這個文件夾拷貝到本機上,方便之後使用)

啓動scribe,默認是1463端口:

/usr/local/scribe/bin/scribed -c /usr/local/scribe/example1.conf 

 

測試程序:

echo  "hello world"| /usr/local/scribe/bin /scribe_cat test 

 

查看結果:example1.conf配置的日誌存放路徑就是/tmp/scribetest

cat  /tmp/scribetest/test/test_current 

出現hello word則表示安裝沒有問題了。


八、還能夠配置系統服務項

在/etc/init.d/下新建一個scribe文件

vi scribe

內容爲以下:

#!/bin/bash

# chkconfig: - 80 12

# description: Distributed log daemon

# processname: scribe

# config: /usr/local/scribe/scribe.conf

# pidfile: /var/run/scribe.pid

 

source /etc/rc.d/init.d/functions

 

### Default variables

USER="root"

OPTIONS="-c /usr/local/scribe2/scribe.conf >> /dev/null 2>&1"

PORT="1464"

 

BIN="/usr/local/scribe2/bin"

### Read configuration

[ -r "$SYSCONFIG" ] && source "$SYSCONFIG"

 

RETVAL=0

prog="scribed"

desc="Distributed logging"

 

start() {

       export BOOST_ROOT=/usr/local/boost2

      export LD_LIBRARY_PATH=/usr/local/boost2/lib::/usr/lib:/usr/local/lib:/usr/local/thrift/lib

        echo -n $"Starting $desc ($prog): "

#        daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE $OPTIONS

        daemon $BIN/$prog -p $PORT  $OPTIONS  &

 

        RETVAL=$?

        echo

        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog

        return $RETVAL

}

 

stop() {

        echo -n $"Shutting down $desc ($prog): "

        #killproc $prog

        /usr/local/scribe2/bin/scribe_ctrl stop $PORT

        RETVAL=$?

        echo

        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog

        return $RETVAL

}

 

restart() {

        stop

        start

}

 

reload() {

        echo -n $"Reloading $desc ($prog): "

        killproc $prog -HUP

        RETVAL=$?

        echo

        return $RETVAL

}

 

case "$1" in

  start)

        start

        ;;

  stop)

        stop

        ;;

  restart)

        restart

        ;;

  condrestart)

        [ -e /var/lock/subsys/$prog ] && restart

        RETVAL=$?

        ;;

  reload)

        reload

        ;;

  status)

        status $prog

        RETVAL=$?

        ;;

   *)

        echo $"Usage: $0 {start|stop|restart|condrestart|status}"

        RETVAL=1

esac

 

exit $RETVAL

 

chmod 755 scribe

這樣就完成了系統服務項配置,若是安裝路徑跟此處不同,那麼作相應修改


Chkconfig --add scribe

chkconfig scribe on

完成了開機系統配置


九、配置文件說明scribe.conf

1、全局配置項

port:指示scribe服務器在哪個端口上監聽,默認是0,經過命令行參數選項-P

能夠指定端口,也可以經過配置文件指定。

check_interval : 設置多長時間檢測一次存儲,默認值是5秒。

max_msg_per_second: 每秒最大日誌併發數,默認爲0,0則表示沒有限制。

           max_queue_site:隊列最大能夠爲多少默認爲5,000,000 bytes

scribeHandler::Log中使用

max_conn最大的連接數

new_thread_per_category:(yes/no)是否爲每一個一個分類建立一個線程,爲

no的話,只建立一個線程爲每一個存儲服務,

對於前綴存儲或默認存儲,若是這個參數設置成

「否」將致使全部匹配這個分類的消息都由一個單

獨的存儲來處理。不然將爲每個惟一的分類名創

建一個新的存儲。默認爲「yes」。

num_thrift_server_threads:(number)接收消息的線程數,默認爲3個


2、store

每一個store表明一個存儲,就是一個日誌,配置多個,表明配置了多種日誌存儲。

下面是store配置變量

1)、categorystore三種存儲分類)

      Category其實就是給該配置的store起一個名字,經過category來肯定用哪一個

store配置,並且默認category的值就是生成的日誌文件名。

有以下三種分類形式:

默認存儲:默認分類存儲,當不符合其餘分類存儲的狀況下,默認調用該分類存儲。

         每一個scribe配置文件中僅可以出現一個默認存儲即:category=default

         若是此時寫入的日誌爲category=abc,並且其餘category都不匹配就會

執行default的配置,並且type=file,file_path=/var/log,那麼日誌

文件爲/var/log/abc/abc_00000,即會爲該日誌建立一個文件夾,文件夾

名就是abc.

 

       前綴分類:若是該分類存儲是以*結尾的,那麼該存儲將處理全部以指定前綴開頭的

category。 如:category=test*,那麼test、test一、test_一、testxxx

等等都是屬於該分類的存儲。

多個類別:如categories=rock paper* scissors 中間用空格隔開,表示rock分

類,scissors分類,以及之前綴paper開頭的分類都走該配置的store

在上面三種狀況下,scribe將爲每個惟一的category建立一個子目錄,除非new_thread_per_category被設置爲false。

2)、typeStore的存儲類型)

       有以下幾種存儲類型:

file、buffer、network、bucket、thriftfile、null、mutil。

3)、target_write_size

    對應category的消息在處理以前,消息隊列最大能夠爲多大。

默認:16,384 bytes

4)、max_batch_size

    內存存儲隊列一次性能夠處理的消息數量,超過這個大小將調用thrift。

    默認:1,024,000 bytes

5)、max_write_interval

對應category的消息隊列在處理消息這些消息以前能夠維護多長時間

       默認爲1

6)、must_succeed

       消息是否必需要成功處理,一個存儲處理消息失敗是否從新進入消息隊列排隊。若是設置爲no,則若是一個消息存儲失敗,則該條消息會被拋棄.

強烈建議使用type=buffer store去指定一個secondary store去處理失敗的消息


7)、更多配置,根據type不一樣會有更多不一樣的配置

       type=file

              1)file_path                  經常使用

文件路徑默認爲/tmp

              category=test 並且未配置file_path,則日誌寫入到

              /tmp/test_00000

              2)base_file_name             經常使用

基本文件名,默認爲category名字

           base_file_name=test,那麼日誌文件格式形式爲:

           test-2015-01-01_00000.當天的日誌是test_00000

              3)use_hostname_sub_directory:(yes/no)         通常不配置保持默認

                   是否使用服務器的hostname做爲子目錄,默認爲no

                   如:category=test   file_path=/tmp/scribe

                   若是主機名爲zht,那麼日誌爲:

                   /tmp/scribe/zht/test_00000

              4)sub_directory:             經常使用

                    使用指定的名稱來建立一個子目錄,相似上面3)

             不一樣的是3)是使用主機名當子目錄,4)這個建立子目錄名稱比較靈

活,本身指定名稱。

如:category=test   file_path=/tmp/scribe    sub_directory=aqh

那麼日誌爲/tmp/scribe/zht/test_00000

              5)rotate_period        經常使用

                     多長時間建立一個文件。可選值爲:

                     hourly:每一個小時

                     daily:天天

                     never:從不,默認

                     number[suffix]:其中suffix能夠爲s,m,h,d,w,對應秒,分鐘,小時,,

,默認爲s

              6)rotate_hour           經常使用

                     取值爲0-23默認爲1

                     若是rotate_period=daiy,這個就決定天天的何時建立新文件。

            如:rotate_period=daily

             rotate_hour=2

            表示天天2點生成新的日誌文件

              7)rotate_minute              經常使用

                      取值0-59,默認是15

若是rotate_period=dailyhourly,這個決定天天或者每小時的哪一個

分鐘建立新文件

如:rotate_period=hourly

             rotate_minute=10

表示每小時的十點建立新文件

              8)max_site:(bytes)                         通常不配置保持默認

                     文件大約到多大時寫入到一個新的文件

                     默認爲1,000,000,000

              9)write_meta:(yes/任何其餘值)            通常不配置保持默認

是否寫入元數據,若是是yes,則一個文件的最後一行爲write_meta加下一個文件名。默認爲no|false

              10)fs_type:(std/hdfs)               經常使用

                     文件系統類型,stdhdfs

                     默認爲std

              11)chunk_size:(number)         通常不配置保持默認

                     chunk大小,若是指定了則文件內的任何消息都不會越過這個數值,

除非消息自己比chunk,默認爲0

              12)add_newlines:(0/1)           通常不配置保持默認

                     1表示之後的每個消息都寫入一個新行,每寫入一個消息就新增

一行默認爲0

              13)create_symlink:(yes/no)           通常不配置保持默認

                     若是爲yes,則會有一個符號連接指向當前寫入的文件

                     默認爲yes

                     如:category=test ,當create_symlink=yes                                 就會出現下面的test_current。若是爲no就沒有這個了

             14)write_stats:(yes/no)          通常不配置保持默認

                     是否會爲每個store建立一個scribe_stats文件去跟蹤文件寫

                     默認爲yes

              15)max_write_size:(byte)             通常不配置保持默認

                     當塊大小大到max_write_size,store會將數據刷新到文件系

,max_write_size不能超過max_site.因爲target_write_size大小

的消息被緩存,file-store會被調用去保存這些緩存中的消息.file-

store每次最少會保存max_write_size大小的消息,file-store

後一次保存消息的大小確定會小於max_write_size.

                     默認值爲1,000,000

        type=network

              此時scribe能夠向其餘機器的scribe發送消息,scribe會保持長鏈接到其

scribe,除非發生錯誤或者超載纔會從新鏈接。在正常運行的狀況下,scribe會基

於當前緩存中存在多少條消息等待發送而分批次的發送。

1)remote_host                    經常使用

                     要發送到的scribe服務器的主機名或者ip

              2)remote_port                 經常使用

                     要發送到的scribe服務器的端口

              3)timeout:(毫秒)                     通常不配置保持默認

                     socket超時時間

                     默認爲5000,對應DEFAULT_SOCKET_TIMEOUT_MS變量

              4)use_conn_pool:(yes/no)            通常不配置保持默認

                     是否使用鏈接池

                     默認爲false

       type=buffer                            較爲經常使用的store存儲

               這是最經常使用的一種store,該store包含兩個子store,其中一個是primary

store,另外一個是secondary store。這兩個子store的配置參數跟store同樣。即:

  <store>

         …….                                    1

<primary>

      ……..                                   2

</primary>

         <secondary>

      ……..                                   3

</secondary>

</store>

              日誌會先嚐試將消息寫到primary,若是寫入不成功會暫時寫到secondary

裏,一旦primary恢復正常,buffer-store會從secondary讀取消息再發送到

Primary(除非replay_buffer=no)。其中,secondary僅支持兩種typefile null

       Primarysecondary節點立面配置的內容就是type=xxx,以及xxx的參數配置

       下面是配置參數是配置在上面配置形式中1位置上的內容。

1)buffer_send_rate:(number)           經常使用,基本爲1

                     每次check_interval週期內,執行多少次將secondary-store的數據

發送到primary-store

                     默認爲1

              2)retry_interval:(second)                     經常使用

                     primary失敗後,等待多久從新發送primary中數據        

                     默認爲300

              3)retry_interval_range:(second)         經常使用

                     retry_interval範圍內隨機產生一個時間間隔從新發送

                     默認爲60

              4)replay_buffer:(yes/no)               通常保持默認不配置

                     若是設置爲yes,會將失敗的消息從secondary移到primary

               若是設置爲no不從secondary移除消息而且發送到primary 中          默認爲yes    

       type=null

              忽略指定category的消息,沒有參數

              如:以tps_report開頭的消息,將被忽略

<store>

                     category=tps_report*

                     type=null

              </store>

 

       type=bucket

bucke能夠理解爲並行store,會經過每個消息的前綴做爲key散列以後寫到多個文件.你能夠隱式(只使用一個bucket定義)或顯式的定義bucket(每一個bucket使用一個bucket定義).隱式定義的bucket必須有一個名爲bucket的子store,而且這個子storetype只能是filenetworkthriftfile

              1)num_buckets

                     多少個bucket,若是消息沒法hash則會放入一個編號爲0bucket

                     默認爲1

              2)bucket_type:

                     bucket類型, 取值爲:key_hash,key_modulo,random

              3)delimiter

                     第一次出如今消息前綴中的delimiterkey_hashkey_modulo

中被看成keyrandom不會使用delimiter.

必須是1-255之間的ascii代碼,不然默認是‘:’  

              4)remove_key:(yes/no)

                     若是爲yes,則會刪除每一個消息的前綴key

                     默認爲false

              5)bucket_subdir

                     若是是使用單個bucket定義即只出現一個<bucket>,則每一個文件的

子目錄名字爲該值加buckethash編號,此時該項必須配置。

若是爲有num_bucket爲n個並且出現n個<bucket>那麼能夠不配

置該項

 

       注意:無論num_buckets爲多少,都會出現一個編號爲0的目錄,出現這個目錄

目的是,當消息沒法hash後,默認放到這個編號爲0的目錄中。

       <store>

category=bucket_me    type=bucket  num_buckets=2           

bucket_subdir=bucketdir      bucket數量爲2,並且下面只有一個<bucket>那麼此項必須配

bucket_type=key_hash  delimiter=58

              <bucket>

                   type=file        fs_type=std

                   file_path=/tmp/scribetest      base_filename=bfn

</bucket>

</store>

       這樣配置結果是:/tmp/scribetest目錄下出現三個

   

其中000是默認會建立的,001002就是配置的num_buckets=2

       在三個目錄下會有日誌文件fbn_00000

      

<store>

category=bucket_me       type=bucket    num_buckets=2

bucket_type=key_hash             下面爲每個bucket都配置了那麼就不用配置bucket_subdir

      <bucket0>

            type=file          fs_type=std   file_path=/tmp/scribetest/b0

            base_filename=bucket0

        </bucket0>

      <bucket1>

type=file             fs_type=std    file_path=/tmp/scribetest/b1

    base_filename=bucket1

  </bucket1>

  <bucket2>

              type=file    fs_type=std           file_path=/tmp/scribetest/b2

base_filename=bucket2

  </bucket2>

</store>

       這樣配置在/tmp/scribetest出現了

   

 

     type=multi

       multi-store會將消息存儲到它的多個子store.一個multi-store有多個子store,

名爲store0,store1,store2等,個數任意.其實就是把日誌向多個地方同時打印,一條日

志存儲在多

個日誌文件中。

       1)report_success:(all/any)

              是否全部子sotre存儲成功再報告爲成功仍是隻要任何一個子sotre存儲成

功就回報爲成功默認爲all

     如:

       <store>          category=mu         type=multi

  <store0>

    type=file

    file_path=/tmp/store0

   </store0>

                <store1>

                   type=file

                   file_path=/tmp/store1

               </store1>

</store>

       運行後會出現以下結果:在/tmp下有


   每一個文件夾下有mu_00000日誌文件,用於存儲

       echo "loglog" | /usr/local/scribe/bin/scribe_cat mu會想着兩個日誌文件存儲消息。

       若是配置更多的store3store4…..那麼就會出現更多的文件夾同時存儲日誌

 

      type=thriftfile

       thriftfile-store也是file的一種,只不過存儲消息到的文件爲TFileTransport文件

              1)file_path

              2)base_filename

              3)rotate_period

              4)rotate_hour

              5)rotate_minute

              6)max_site                 

              7)fs_type

              8)chunk_size

              9)create_symlink

                10)flush_frequency_ms: (毫秒)

                     多長時間同步thrift文件到硬盤

                     默認爲3000毫秒

               11)msg_buffer_site: (字節)

                     store將會拒絕存儲大於msg_buffer_site

                      默認爲0無限制

       <store>

category=sprockets

type=thriftfile

file_path=/tmp/sprockets

base_filename=sprockets_log

max_size=1000000

flush_frequency_ms=2000

</store>

十、Scribe_ctrl命令介紹

scribe_ctrl  status    若是服務器運行正常則返回'ALIVE'

scribe_ctrl version    返回當前Scribe服務器的版本、

scribe_ctrl alive 返回服務器運行時間

scribe_ctrl stop  中止Scribe服務器

scribe_ctrl reload       從新加載Scribe配置文件

scribe_ctrl 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: 接收到的沒有信息類別的信息數量

相關文章
相關標籤/搜索