Scribe安装及配置方法

scribe简介

Scribe是Facebook开源的分布式日志收集系统,目前在各大互联网公司内部已经获得大量的应用。它可以从各类日志源上收集日志,存储到一个中央存储系统(能够是NFS,分布式文件系统等)上,以便于进行集中统计分析处理。 php

它为日志的“分布式收集,统一处理”提供了一个可扩展的,高容错的方案。当中央存储系统的网络或者机器出现故障时,scribe会将日志转存到本地或者另外一个位置,当中央存储系统恢复后,scribe会将转存的日志从新传输给中央存储系统。其一般与Hadoop结合使用,scribe用于向HDFS中push日志,而Hadoop经过MapReduce做业进行按期处理。 java

系统架构

clip_p_w_picpath002

常见部署结构:

clip_p_w_picpath004

准备工做

系统环境: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到更高版本。 缓存

clip_p_w_picpath006

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

安装scribe

编译安装:

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

clip_p_w_picpath008

查看服务器日志

tail -f scribe_service.log

clip_p_w_picpath010

控制工具:

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

使用方法图示以下:

clip_p_w_picpath011

测试scribe功能

测试命令以下:

cd /usr/local/scribe/conf/
echo "hello world" | ./scribe_cat test
cd /usr/local/scribe/data/

测试结果图示以下:

clip_p_w_picpath012

到这里,scribe的安装和配置方法基本上就完整了。若是你们有问题请和我沟通。^_^

关于如何将scribe运用到业务当中,请移步:http://cyr520.blog.51cto.com/714067/1265181

相关文章
相关标签/搜索