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

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

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

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • webpack

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

    42 引用 • 130 回帖 • 251 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 737 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 641 关注
  • 又拍云

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

    20 引用 • 37 回帖 • 577 关注
  • Follow
    4 引用 • 12 回帖 • 1 关注
  • Flume

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

    9 引用 • 6 回帖 • 660 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 58 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1443 引用 • 10082 回帖 • 495 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 402 关注
  • 安全

    安全永远都不是一个小问题。

    199 引用 • 818 回帖
  • Spark

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

    74 引用 • 46 回帖 • 568 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 2 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖 • 1 关注
  • 禅道

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

    10 引用 • 15 回帖 • 9 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 1 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖 • 1 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 73 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    172 引用 • 534 回帖
  • 创造

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

    186 引用 • 1020 回帖
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1794 回帖 • 2 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    32 引用 • 99 回帖
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 184 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 144 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    345 引用 • 753 回帖
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖 • 6 关注