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 可靠性
2.1 容错机制
Scribe系统设计成能容错:网络或者机器错误故障。如果客户端上的一个scribe实例不能发送消息到中央server,它会将消息保存到本地磁盘,当中央server或者网络故障恢复后,重新发送。为了避免中央server重启时,负载过重重新发送者会等待一个随机事件,再发送。如果中央server接近其处理极限返回TRY_LATER,这就告诉resender间隔几分钟后再试。
中央server在遇到故障时,处理机制类似。
2.2 数据丢失性问题
以下的错误会导致数据丢失
1)客户端不能连接到本地或中央server,message会丢失。
2)一个scribe server down了,内存中少量的消息会丢失,磁盘上的数据不会丢失。
3)Scribe server不能连接到中央server,本地磁盘溢出,消息会丢失。
4)超时,导致存在重复的消息
3 配置
配置文件由全局的section和一个或多个store的section组成。
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 store:default category处理不被其他 store处理的category。
Category=default
Prefix stores:该store处理所有以指定前缀开头的category。
Category=web*
3.2.1 store 配置变量
Category
Type:当前支持类型。
File、buffer、network、bucket、thriftfile、null、multi。
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_period:hourly daily 或never。默认为never。
决定了多长时间创建一个新文件。
Rotate_hour:0-23,默认为1。
如果rotate_period为daily,决定了哪个小时点翻转。
Rotate_minute:0-59.默认为15
如果rotation_period是dalily或hourly,决定指定hour后多少分钟翻转。
Max_size:默认为1,000,000,000字节
在翻转文件之前,该文件最大size。
Write_meta:yes或其他。默认为false。
是否在文件中记录元数据:消息的长度和下个文件名称(最后一行)。
Fs_type:当前支持std。
Chunk_size:默认为0
指定chunk_size,文件内没有任何消息将跨越chunk边界,除非有消息大于chunk size。
Add_newlines:0或1.默认为0
设置为1,每个消息后加入换行符。
Create_symlink:yes或其他。默认为yes。
维护一个symlink,指向最频繁使用的写文件
3.2.3 Network store
Network store将消息定位到其他scribe server上。
Remote_host:远程主机的ip或者名称。
Remote_port:远程主机的端口
Timeout:socket超时时间,默认为default_socket_timeout_ms,在store.h中设定默认为5000毫秒。
Use_conn_pool:yes或其他,默认为false。
是否使用连接池,而不是对每个远程主机开多个连接。
3.2.4 Buffer Store
Buffer store必须有两个sub-store:primary和secondray。Buffer 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必须有名为bucket的substore。
Num_buckets:默认为1。
Bucket数目。
不能被hash到任何bucket的消息被放到特殊的bucket 0。
Bucket_type:key_hash或key_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-store。Substore命名store0、store1、等。
Report_success:all或者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可以通过一个配置文件静态配置,也可以在运行时无需停止服务器进行更改.
- facebook scribe日志搜集系统
- 分布式日志收集系统:Facebook Scribe
- 分布式日志收集系统:Facebook Scribe
- scribe 日志搜集
- 分布式日志收集系统: Facebook Scribe之日志收集方案
- scribe 研究- 一种分布式日志系统(facebook)
- 分布式日志收集系统: Facebook Scribe之配置文件
- 分布式日志收集系统(一):Facebook Scribe
- Facebook Scribe日志聚合框架
- scribe日志收集系统
- scribe日志收集系统
- Scribe日志收集系统
- 分布式日志收集系统: Facebook Scribe之结构及源码分析
- 开源日志系统比较:Facebook-scribe、Hadoop-chukwa、kafka、Cloudera-flume
- scribe日志系统安装笔记
- scribe日志系统安装笔记
- Scribe日志收集系统介绍
- Scribe+HDFS日志收集系统安装方法
- 内核移植(包括LCD液晶屏、OTG-usb)
- Android开发常见低级错误之一:.xml文件命名
- 外键约束
- Android中Java代码和XML布局效率问题
- hql语句中like查询 对于 / ' " % 的处理
- facebook scribe日志搜集系统
- .NET简谈组件程序设计之(delegate与event关系)
- 用git clone实现单个目录下载
- poj 2034(dfs。。。居然别一个水题卡住了)
- 卸载gcc,ubuntu系统崩溃解决
- Android控件开发之DigitalClock
- Windows编程革命简史
- C#中的Equals、RefrenceEquals和==的区别
- 用PHP+MYSQL4.X 做发卡系统如何防止重复发放?