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

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

##数据流模型
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 回帖 • 686 关注
  • sink
    1 引用

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    248 引用 • 1342 回帖
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 413 关注
  • 倾城之链
    23 引用 • 66 回帖 • 189 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 36 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 669 关注
  • GraphQL

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

    4 引用 • 3 回帖 • 11 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 660 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    43 引用 • 130 回帖 • 259 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 563 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 847 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    269 引用 • 666 回帖 • 1 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 458 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 60 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    203 引用 • 4025 回帖
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 578 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    27 引用 • 7 回帖 • 92 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    126 引用 • 83 回帖 • 1 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 8 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 98 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    59 引用 • 25 回帖 • 5 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 190 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    173 引用 • 1559 回帖
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 664 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 1 关注
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 80 回帖 • 1 关注
  • sts
    2 引用 • 2 回帖 • 260 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖