Scribe介绍
目录
- 是什么
- 功能
- 案例
- 用法
- 局限
- 其他
是什么
- 可扩展的分布式日志框架
- 框架(framework)而非系统。
- Scribe = Scribe服务器 + Scribe API
- 可扩展
- 节点可以执行逻辑操作(记录日志)或者转发请求。类似Nginx
- 分布式
- 无状态
功能
独立于应用系统和分析系统的日志收集服务器
- 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
修订记录
- 2017年06月21日 由PPT修改而来。