flume-ng 源码分析 - 整体架构 2【常用架构篇】

本贴最后更新于 1925 天前,其中的信息可能已经事过境迁

##数据流模型
14961138312658.jpg

flume 中基本概念

1.Event:一个流经 Agent 的基本数据单位;Event 从 Source 流向 Channel 最后到 Sink。实现了 Event 接口。在 Event 的流向中,可以设置可选的 header 参数。
2.Agent:一个 Agent 表示一个拥有一些组件(source,channel,sink)的 jvm 进程。这些组件允许,Events 从一个外部源,流向下一个目的地。
3.flow:表示一个数据流向
4.source:source 消费可以识别格式的 Events。这些 Events 可以通过像 web server 的客户端发送。例如 arvoSource 可以从 client 或者其他 flume agent 接受 arvoEvents.当 Source 接受到 Events 时,将它存储在一个或者多个 Channel 中
5.Channel:是一个被动存储。他会存储接收到的 Events 直到这些 Events 被 Sink 消费掉。比如 fileChannel,用贝本地文件系统作为后备存储;
6.Sink:Sink 消费 channel 中的数据。sink 负责将 Event 从 channel 中移除,并且将 Events 放在外部存储如 HDFS(这可以通过 HDFSSINK 实现)或者传送给下一个 Flume agent 中的 source。因为 Flume 中有 Channel 的存在,在一个给定的 Agent 中 source 和 sink 可以异步的执行

简单的日志收集

假设我们要收集 ng 的日志。我们可以按照以下的方案进行部署。

14961161955654.jpg

流程如下

1.每台 websever 上部署一个 flume agent
2.使用 tail 命令
3.channel 可以使用 memorychannel
4.sink 统一写到 es 服务器中。前端使用 kibana 查询

虽然上面的应用场景可以满足需求。但是缺点也是非常的明显

1.各环节丢失数据的可能性较大(如果可以容忍数据丢失,则关系不大)
2.每台 webserver 上部署一个 flume agent,不利于维护。比如 sink 还想往 kafka 写,那么所有的 flume agent 都需要更改。

复杂的日志收集

先来看看 Event 在 flume flow 中的扭转流程:

1.source 接收 Event
2.source 将 Event 传送给 ChannelProcessor
3.在 ChannelProcessor 中收件会将 event 传递给 InterceptorChain,InterceptorChain 中包含多个 Interceptor。Interceptor 的概念就相当于 java web 开发中的 servlet 的概念。提供了一种修改或者删除 Event 的能力.比如 Timestamp Interceptor 将会在 Event 的 header 中加入 Event 被处理的时间戳,key 为 timestamp。
4.当 Event 被 Interceptor 处理后就会通过 ChannelSelector 选择合适的 channel,将 Event 发送到 Channel 中。
flume 中提供了两种方式 :

  • MultiplexingChannelSelector 多路复用选择器
  • ReplicatingChannelSelector 复制选择器

5.sink 从 channel 中消费数据,这里和 source 向 channel 中存放数据是异步的。所以 sink,只需要监听和自己关联的 channel 的变化即可。对于 sink,提供了三种策略:

  • DefaultSinkProcess :失败了就失败了,稍后进行重试
  • LoadBalancingSinkProcessor:负载均衡,有 RandomOrder,RoundRobin 和 FixedOrderSelector 三种选择
  • FailoverSinkProcessor:给多个 sink 定义优先级,如果其中一个失败了,则发送到下一个优先级的 Sink。如果执行过程中 Sink 抛出异常,那么将该 Sink 从存活的队列中移除。然后指数级时间重试。默认开始等待 1s 重试。最大等待时间是 30s。当 Sink 恢复后将会加入存活的队列中。

基于上面分析,可以基本画出 flume event 的基本流转

14961302533427.jpg

基于第一种方式的搜集方式和 Event 数据流转的分析。如果我们需要采集日志,整体架构可以采用下面的方式进行部署。

14961289968437.jpg

  • 在收集层,agent 和 web server 部署在同一台机器上。(这里我们也可以开发 flume 的 Embedded agent)通过 RPC 将数据流入聚合层。这一层应该快速的将日志收集到聚合层。
  • 聚合层进行日志数据的聚合和收集,在这一层,可以做容错处理,如负债均衡或者 failover.以提升可靠性。在这一层,数据量大时可以打开 fileChannel,作为数据缓冲区,避免数据的丢失。以后主要的维护工作也主要在这一层上面。
  • 在存储层,一般会流向 hdfs,kafka 以供离线和实时的数据分析。
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 594 关注
  • sink
    1 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    523 引用 • 4581 回帖 • 690 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 152 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    215 引用 • 462 回帖
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    396 引用 • 3416 回帖
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖 • 3 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 740 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 685 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 589 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 692 关注
  • 反馈

    Communication channel for makers and users.

    123 引用 • 906 回帖 • 192 关注
  • danl
    62 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖 • 1 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 2 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖 • 1 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 594 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 7 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 20 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    180 引用 • 400 回帖
  • V2Ray
    1 引用 • 15 回帖 • 2 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    21 引用 • 140 回帖 • 27 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 513 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 2 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    19 引用 • 31 回帖 • 1 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    207 引用 • 2031 回帖
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 85 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    941 引用 • 1458 回帖 • 150 关注