Linux 安装 Scribe

我与影子孤独终老i 提交于 2019-12-07 13:19:33

序言


它能够从各种日志源上收集日志,存储到一个中央存储系统(可以是NFS,分布式文件系统等)上,以便于进行集中统计分析处理。

源码安装


1、前提准备

Scibe需要下面的依赖库,执行下面命令

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

下面的比较全,不放心的话可以直接执行下面的

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 

刷新动态链接库

/sbin/ldconfig


2、准备安装包

演示如下版本


3、安装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


4、安装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


5、安装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无法安装的话那就换版本


6、安装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 目录创建则安装完成。


7、测试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则表示安装没有问题了。


8、还可以配置系统服务项

在/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

完成了开机系统配置


9、配置文件说明scribe.conf

一、全局配置项

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个


二、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、test1、test_1、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>

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


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!