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

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

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

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 996
    13 引用 • 200 回帖 • 11 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    8447 引用 • 38477 回帖 • 154 关注
  • danl
    146 关注
  • 笔记

    好记性不如烂笔头。

    308 引用 • 793 回帖
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    5 引用 • 15 回帖 • 102 关注
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 105 关注
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖 • 1 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    209 引用 • 358 回帖 • 1 关注
  • 爬虫

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

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

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    409 引用 • 1246 回帖 • 587 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    126 引用 • 169 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    728 引用 • 1273 回帖 • 1 关注
  • 面试

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

    325 引用 • 1395 回帖 • 1 关注
  • Notion

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

    7 引用 • 40 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 1 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    178 引用 • 997 回帖
  • Latke

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

    71 引用 • 535 回帖 • 789 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 26 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    27 引用 • 225 回帖 • 163 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • Markdown

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

    167 引用 • 1520 回帖
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 14 关注
  • Webswing

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

    1 引用 • 15 回帖 • 637 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 86 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 76 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖