Scribe介绍

Scribe介绍

目录

  • 是什么
  • 功能
  • 案例
  • 用法
  • 局限
  • 其余

是什么

  1. 可扩展的分布式日志框架
    • 框架(framework)而非系统。
    • Scribe = Scribe服务器 + Scribe API
  2. 可扩展
    • 节点能够执行逻辑操做(记录日志)或者转发请求。相似Nginx
  3. 分布式
  4. 无状态

功能

独立于应用系统和分析系统的日志收集服务器编程

  • Scribe从各类数据源上收集数据,放到共享队列上,而后push到后端的中央存储系统上。当中央存储系统出现故障时,scribe能够暂时把日志写到本地文件中,待中央存储系统恢复性能后,scribe把本地日志续传到中央存储系统上。

良好的水平扩展性能后端

  • 支持多种编程语言,使用Thrift
  • 高性能、低消耗,使用Libevent
  • 多种存储格式
  • 支持HFDS
  • 能够与应用集成
  • 灵活的日志缓存大小
  • 多线程/消息队列

转发写日志请求缓存

  • 日志分类
  • 日志过滤,category

案例

Facebook日志收集

  • 上百种日志分类
  • 10000+ Scribe节点
  • 每秒1000000条日志
  • 天天10000000000条日志

Twitter的Rainbird系统

  • 统计网站中每一个页面的点击次数
  • 统计内部监控数据,Scribe用于收集这些数据
  • 存储到HDFS中
  • 数据源:JavaScript, RoR,
  • Scala, ...
  • 数据量:7 TB/day

测试

  • 每条日志1K
  • 3台机器同时发送,每台机器循环发送40万条
  • 耗时最多的机器用了298秒
  • 1.31M/s
  • 0.000745s/K

用法

Python

category='test'
message='hello world'
log_entry = scribe.LogEntry(category, message)
socket = TSocket.TSocket(host='localhost', port=1456)
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()

PHP

$msg1['category'] = 'hello';
$msg1['message'] = 'world';
$entry1 = new LogEntry($msg1);
$messages = array($entry1);
$socket = new TSocket('183.61.6.104', 1463, true);
$transport = new TFramedTransport($socket);
$protocol = new TBinaryProtocol($transport, false, false);
$scribe_client = new scribeClient($protocol, $protocol);
$transport->open();
$exit_code = $scribe_client->Log($messages);
$transport->close();

局限

  • 偏向于收集应用层日志
  • 没法收集历史数据
  • 日志切分是可能发生日志丢失
  • 单点问题

其余

设计服务服务器

  • 逻辑处理+请求转发 Nginx Scribe
  • 无状态 == 水平扩展性
  • Create a service iff required
  • Create a common framework and toolset that will allow for easier creation of services
  • Use the right language, library and tool for the task

修订记录

  1. 2017年06月21日 由PPT修改而来。
相关文章
相关标签/搜索