分布式日志收集系统: Facebook Scribe

如下是我在公司内部分享的关于分布式日志收集系统的PPT内容,如今与你们分享,但愿对于须要使用的人可以起到基本的入门做用或是了解!python

1.分布式日志收集系统:背景介绍面试

许多公司的平台天天会产生大量的日志(通常为流式数据,如,搜索引擎的pv,查询等),处理这些日志须要特定的日志系统,通常而言,这些系统须要具备如下特征:编程

(1) 构建应用系统和分析系统的桥梁,并将它们之间的关联解耦;后端

(2) 支持近实时的在线分析系统和相似于Hadoop之类的离线分析系统;缓存

(3) 具备高可扩展性。即:当数据量增长时,能够经过增长节点进行水平扩展。服务器

 

2.分布式日志收集系统:Facebook Scribe主要内容多线程

(1)Scribe简介及系统架构架构

(2)Scribe技术架构框架

(3)Scribe部署结构socket

(4)Scribe主要功能和使用方案

(5)Scribe的具体应用实例

(6)Scribe的扩展

(7)Scribe研究体会

 

3.Scribe简介

Scribe是facebook开源的日志收集系统,在facebook内部已经获得大量的应用。 Scribe是基于一个使用非阻断C++服务器的thrift服务的实现。它可以从各类日志源上收集日志,存储到一个中央存储系统 (能够是NFS,分布式文件系统等)上,以便于进行集中统计分析处理。它为日志的“分布式收集,统一处理”提供了一个可扩展的,高容错的方案。

 

4.Scribe的系统架构

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

 

5.Scribe的技术架构

如上图所示:Scribe服务器底层数据通讯框架是Thrift,Thrift也是Facebook开源的,并获得了普遍的使用。也用到了C++的准标准库boost,主要使用共享指针和文件相关的功能。Thrift也用到了libevent开发库和socket编程技术。

 

6.Scribe部署结构

 

7.Scribe的主要功能

1.支持多种存储类型:7种而且可扩展

2.日志自动切分功能:按文件大小和时间切分

3.灵活的客户端:

(1)支持多种经常使用语言(Thrift提供支持);

(2)可与应用系统集成;能够做实现独立客户端

4.支持日志分类功能(Facebook有上百种日志分类)

5.其余功能

(1)链接池

(2)灵活的日志缓存大小

(3)多线程功能(消息队列)

(4)scribe服务器之间能够转发日志

6.以上功能都是能够经过配置文件来灵活配置

 

8.Scribe使用方案

(1)和产生日志文件的应用系统集成

scribe可以和各类应用系统很好的集成是由于它提供几乎全部的开发语言的开发包

(2)应用系统在本地产生日志文件,使用一个独立运行的客户端程序一样,独立的客户端也能够采用各类语言开发,咱们采用的是python来开发客户端

 

9.Scribe的具体应用实例

1.Facebook确定大量的使用,主要用于处理Facebook级别日志,一旦有新的日志分类生成,Scribe将自动处理。(Facebook有上百个日志分类)。

2. Twitter:一款分布式实时统计系统Rainbird使用了scribe

3.个人公司:

(1)*****

(2)*****

(3)*****

(4)*****

(5)*****

(6)*****

4.其余

 

10.Scribe的扩展:存在的问题

虽然scribe系统是如此的优秀,可是也存在着一些不足和问题,针对存在的问题咱们对scribe进行扩展。咱们发现scribe存在的主要问题以下:

一、单点故障问题

有三个地方存在单点故障:

(1)中心服务器

(2)本地服务器

(3)收集日志的客户端程序

二、日志丢失问题

当日志文件发生切分的时候可能致使日志丢失

三、历史日志收集问题

四、scribe服务器挂了没有及时通知

 

11.Scribe的扩展:问题解决方案

针对上面咱们提出的问题,主要提供以下相应的解决方案:

1.中心服务器单点故障

能够部署多个中心服务器,而后本地服务器经过配置文件能够自动在这些服务器之间进行切换

2.其他的问题咱们都是经过本身写的python客户端解决的

python客户端咱们是基于一个开源的项目进行二次开发的,由于开源的python客户端功能很简单,只是跟踪一个日志文件并把日志文件的数据读取导入到scribe本地服务器

 

12.Scribe的扩展:python客户端

咱们开发的python客户端主要实现了以下功能:

一、解决本地scribe服务器的单点故障

咱们能够经过配置多个本地scribe服务器(经过配置文件配置,至关的灵活),python脚本会根据配置的这些服务器自动切换(当一个scribe挂掉以后自动切换,若是挂掉本地scribe服务器从新启动之后又会自动切换回去。

二、解决日志丢失的问题

开源的python客户端是按照固定的时间间隔扫描日志文件是否有变化,若是在这个时间段内发生日志切换会致使日志丢失。咱们一样是采用这个方式去检测日志文件,不过咱们在发生日志切分的时候会再次去检测被切分走得日志文件是否已经收集完毕。

三、解决历史日志收集

若是在咱们运行python客户端之前已经产生了日志,这部分的日志收集也是咱们新增的一个功能

四、解决自身的单点故障问题

不排除咱们的python客户端也会挂掉的时候,当咱们下次启动怎样保证咱们收集的日志不重复不丢失是须要解决的问题。咱们的解决方案就是对已经收集的日志文件的各类信息作序列化(主要是已经收集日志文件的位置)

五、收集日志文件怎样保证按照日志生成的顺序收集

日志的生成顺序就是跟他们文件的创建时间是相关的,经过这一点咱们能够实现。

六、及时通知机制

为了及时的通知到scrib服务器挂掉的信息到相关人员,咱们开发了邮件通知机制,就是当某一个本地scribe服务器挂掉之后会触发邮件发送

 

13.Scribe研究体会

怎样从咱们工做的内容深刻学习?

1.每一个人在公司负责开发的内容都是颇有限的,怎样从咱们开发的内容入手深刻研究和学习更多的知识?

2.Scribe研究的例子!

 

14.总结:以上内容有一些是来至互联网,在加入了本身的一些理解,但愿对须要的人有所帮助!

文末也给你们,分享主要有C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK技术,面试技巧方面的资料技术讨论。

感兴趣的朋友能够加群:812855908

相关文章
相关标签/搜索