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: 接收到的没有信息类别的信息数量

相关文章
相关标签/搜索