许多公司的平台每天会产生大量的日志一般为流式数据如搜索引擎的pv查询等处理这些日志需要特定的日志系统一般而言这些系统需要具有以下特征1 构建应用系统和分析系统的桥梁并将它们之间的关联解耦2 支持近实时的在线分析系统和类似于Hadoop之类的离线分析系统3 具有高可扩展性。即当数据量增加时可以通过增加节点进行水平扩展。2.分布式日志收集系统Facebook Scribe主要内容1Scribe简介及系统架构2Scribe技术架构3Scribe部署结构4Scribe主要功能和使用方案5Scribe的具体应用实例6Scribe的扩展7Scribe研究体会3.Scribe简介Scribe是facebook开源的日志收集系统在facebook内部已经得到大量的应用。 Scribe是基于一个使用非阻断C服务器的thrift服务的实现。它能够从各种日志源上收集日志存储到一个中央存储系统 可以是NFS分布式文件系统等上以便于进行集中统计分析处理。它为日志的“分布式收集统一处理”提供了一个可扩展的高容错的方案。4.Scribe的系统架构如上图所示Scribe从各种数据源上收集数据放到一个共享队列上然后push到后端的中央存储系统上。当中央存储系统出现故障时scribe可以暂时把日志写到本地文件中待中央存储系统恢复性能后scribe把本地日志续传到中央存储系统上。5.Scribe的技术架构如上图所示Scribe服务器底层数据通信框架是ThriftThrift也是Facebook开源的并得到了广泛的使用。也用到了C的准标准库boost主要使用共享指针和文件相关的功能。Thrift也用到了libevent开发库和socket编程技术。6.Scribe部署结构7.Scribe的主要功能1.支持多种存储类型7种并且可扩展2.日志自动切分功能按文件大小和时间切分3.灵活的客户端1支持多种常用语言Thrift提供支持2可与应用系统集成可以作实现独立客户端4.支持日志分类功能Facebook有上百种日志分类5.其他功能1连接池2灵活的日志缓存大小3多线程功能(消息队列)4scribe服务器之间可以转发日志6.以上功能都是可以通过配置文件来灵活配置8.Scribe使用方案1和产生日志文件的应用系统集成scribe能够和各种应用系统很好的集成是因为它提供几乎所有的开发语言的开发包2应用系统在本地产生日志文件使用一个独立运行的客户端程序同样独立的客户端也可以采用各种语言开发我们采用的是python来开发客户端9.Scribe的具体应用实例1.Facebook肯定大量的使用主要用于处理Facebook级别日志一旦有新的日志分类生成Scribe将自动处理。Facebook有上百个日志分类。2. Twitter一款分布式实时统计系统Rainbird使用了scribe3.我的公司1*****2*****3*****4*****5*****6*****4.其他10.Scribe的扩展存在的问题虽然scribe系统是如此的优秀但是也存在着一些不足和问题针对存在的问题我们对scribe进行扩展。我们发现scribe存在的主要问题如下1、单点故障问题有三个地方存在单点故障1中心服务器2本地服务器3收集日志的客户端程序2、日志丢失问题当日志文件发生切分的时候可能导致日志丢失3、历史日志收集问题4、scribe服务器挂了没有及时通知11.Scribe的扩展问题解决方案针对上面我们提出的问题主要提供如下相应的解决方案1.中心服务器单点故障可以部署多个中心服务器然后本地服务器通过配置文件可以自动在这些服务器之间进行切换2.其余的问题我们都是通过自己写的python客户端解决的python客户端我们是基于一个开源的项目进行二次开发的因为开源的python客户端功能很简单只是跟踪一个日志文件并把日志文件的数据读取导入到scribe本地服务器12.Scribe的扩展python客户端我们开发的python客户端主要实现了如下功能1、解决本地scribe服务器的单点故障我们可以通过配置多个本地scribe服务器通过配置文件配置相当的灵活python脚本会根据配置的这些服务器自动切换当一个scribe挂掉之后自动切换如果挂掉本地scribe服务器重新启动以后又会自动切换回去。2、解决日志丢失的问题开源的python客户端是按照固定的时间间隔扫描日志文件是否有变化如果在这个时间段内发生日志切换会导致日志丢失。我们同样是采用这个方式去检测日志文件不过我们在发生日志切分的时候会再次去检测被切分走得日志文件是否已经收集完毕。3、解决历史日志收集如果在我们运行python客户端以前已经产生了日志这部分的日志收集也是我们新增的一个功能4、解决自身的单点故障问题不排除我们的python客户端也会挂掉的时候当我们下次启动怎样保证我们收集的日志不重复不丢失是需要解决的问题。我们的解决方案就是对已经收集的日志文件的各种信息做序列化主要是已经收集日志文件的位置5、收集日志文件怎样保证按照日志生成的顺序收集日志的生成顺序就是跟他们文件的建立时间是相关的通过这一点我们可以实现。6、及时通知机制