facebook scribe日志搜集系统

来源:互联网 发布:linux安装软件deb 编辑:程序博客网 时间:2024/05/22 16:06

    这些天一直在研究facebook的scribe,本以为可以使用的,但是与目前系统接入不太契合,所以领导打算放弃“scribe”。还是打算把最近学习笔记公开下:

 

 

Facebook Scribe 报告

1 scribe 介绍

1.1 scribe概述

scribe是用来收集日志的服务器.它具备很强的扩展能力,并且网络故障及服务器节点故障,都不会对日志收集造成影响

1.2 架构

scribe的架构比较简单,主要包括三部分,分别为scribe agent, scribe和存储系统。

    

(1) scribe agent

scribe agent实际上是一个thrift client。 向scribe发送数据的唯一方法是使用thrift client, scribe内部定义了一个thrift接口,用户使用该接口将数据发送给server

(2) scribe

scribe接收到thrift client发送过来的数据,根据配置文件,将不同topic的数据发送给不同的对象。scribe提供了各种各样的store,如 file, HDFS等,scribe可将数据加载到这些store中。

(3) 存储系统

存储系统实际上就是scribe中的store,当前scribe支持非常多的store,包括file(文件),buffer(双层存储,一个主储存,一个副存储),network(另一个scribe服务器),bucket(包含多个 store,通过hash的将数据存到不同store中),null(忽略数据)thriftfile(写到一个Thrift TFileTransport文件中)和multi(把数据同时存放到不同store中)。

可靠性

2.1 容错机制

Scribe系统设计成能容错:网络或者机器错误故障。如果客户端上的一个scribe实例不能发送消息到中央server,它会将消息保存到本地磁盘,当中央server或者网络故障恢复后,重新发送。为了避免中央server重启时,负载过重重新发送者会等待一个随机事件,再发送。如果中央server接近其处理极限返回TRY_LATER,这就告诉resender间隔几分钟后再试。

中央server在遇到故障时,处理机制类似。

2.2 数据丢失性问题

以下的错误会导致数据丢失

1)客户端不能连接到本地或中央servermessage会丢失。

2)一个scribe server down了,内存中少量的消息会丢失,磁盘上的数据不会丢失。

3)Scribe server不能连接到中央server,本地磁盘溢出,消息会丢失。

4)超时,导致存在重复的消息

配置

配置文件由全局的section和一个或多个storesection组成。

3.1 全局配置变量

Port

    scribe server监听的端口。默认值为0

Max_msg_per_second

    scribe server每秒能处理的最大消息数。默认值为10,000

Max_queue_size

    队列的最大容量,以字节为单位。默认为500,000

Check_interval

单位为秒。控制多长时间对每个store检查一次。

New_thread_per_category

如果为true,为每个category建一个线程来处理。

3.2 store 配置

Scribe server决定基于在配置中定义的store来如何记录消息。每个store必须指定它处理的category

Default storedefault category处理不被其他 store处理的category

    Category=default

Prefix stores:该store处理所有以指定前缀开头的category

    Category=web*

3.2.1 store 配置变量

Category

Type:当前支持类型。

    Filebuffernetworkbucketthriftfilenullmulti

Target_write_size:默认值为16384个字节

    决定了在处理消息之前,允许指定category的消息队列能增长到多大。

Max_write_iterval:默认为10

    决定了指定category的消息队列多久被处理一次。

3.2.2 File store

File store 将消息写入文件。

File_path:默认为/tmp

     在启动scribe server时,如果file_path目录不存在,抛异常。

Base_filename:默认为category的名称。

Rotate_periodhourly  daily never。默认为never

     决定了多长时间创建一个新文件。

Rotate_hour0-23,默认为1

     如果rotate_perioddaily,决定了哪个小时点翻转。

Rotate_minute0-59.默认为15

     如果rotation_perioddalilyhourly,决定指定hour后多少分钟翻转。

Max_size:默认为1,000,000,000字节

     在翻转文件之前,该文件最大size

Write_metayes或其他。默认为false

     是否在文件中记录元数据:消息的长度和下个文件名称(最后一行)

Fs_type:当前支持std

Chunk_size:默认为0

     指定chunk_size,文件内没有任何消息将跨越chunk边界,除非有消息大于chunk size

Add_newlines01.默认为0

     设置为1,每个消息后加入换行符。

Create_symlinkyes或其他。默认为yes

     维护一个symlink,指向最频繁使用的写文件

3.2.3 Network store

Network store将消息定位到其他scribe server上。

Remote_host:远程主机的ip或者名称。

Remote_port:远程主机的端口

Timeoutsocket超时时间,默认为default_socket_timeout_ms,在store.h中设定默认为5000毫秒。

Use_conn_poolyes或其他,默认为false

是否使用连接池,而不是对每个远程主机开多个连接。

3.2.4 Buffer Store

Buffer store必须有两个sub-storeprimarysecondrayBuffer store首先尝试记录消息到primary store,当primary store不可达时,记录到secondary store。一旦primary store恢复,将secondary中所有消息读出发送到primary store

Max_queu_length:默认2,000,000个消息。

    如果队列消息中德值超过这个值,buffer store切换到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

3.2.5 Bucket store

Bucket store将消息hash到多个文件,使用每个消息的前缀作为键值。

Bucket store必须有名为bucketsubstore

Num_buckets:默认为1

    Bucket数目。

    不能被hash到任何bucket的消息被放到特殊的bucket 0

Bucket_typekey_hashkey_modulo

Delimiter:必须是0-255之间的ascii代码,默认为0

    消息前缀:第一个分隔符之前的字符串作为键值。

Bucket_subdir:子目录的名称为名称紧跟bucket number

3.2.6 Null store

Null store告诉scribe对给定的category,忽略所有的消息。

3.2.7 Multi store

Multi store将消息发送到多个sub-storeSubstore命名store0store1、等。

Report_successall或者any。默认为all

是否所有substore或者任何substore必须成功,报告消息记录成功。

3.2.8 hdfs store

Scribe 支持将文件写入分布式文件系统上。

    type=file

    fs_type=hdfs

    file_path=hdfs://myhadoopserver:9000/scribedata

4 scribe 接口

Scribe实现了thrift接口

enum ResultCode

{

  OK,

  TRY_LATER

}

struct LogEntry

{

  1:  string category,

  2:  string message

}

service scribe extends fb303.FacebookService

{

  ResultCode Log(1: list<LogEntry> messages);

}

Scribe的独特之处是客户端日志实例包含两个字符串:类别和信息(a category and a message).类别(category),是对预期目标信息的高层次描述。可以在Scribe服务器中进行配置,这样就允许我们可以通过更改配置文件的方式转移数据而不需要更改代码

Scribe服务器也允许基于类别前缀(category prefix)进行配置,缺省状态下可以在文件路径中插入类别名称.灵活性和可扩展性,可通过存储(store)抽象.Stores可以通过一个配置文件静态配置,也可以在运行时无需停止服务器进行更改.

  

 

原创粉丝点击