基于Flume日志收集系统架构和设计(一)

2023-11-08

问题导读:

1.Flume-NGScribe对比,Flume-NG的优势在什么地方?
2.架构设计考虑需要考虑什么问题?
3.Agent死机该如何解决?
4.Collector死机是否会有影响?
5.Flume-NG可靠性(reliability)方面做了哪些措施?


 

美团的日志收集系统负责美团的所有业务日志的收集,并分别给Hadoop平台提供离线数据和Storm平台提供实时数据流。美团的日志收集系统基于Flume设计和搭建而成。

《基于Flume的美团日志收集系统》将分两部分给读者呈现美团日志收集系统的架构设计和实战经验。

第一部分架构和设计,将主要着眼于日志收集系统整体的架构设计,以及为什么要做这样的设计。

第二部分改进和优化,将主要着眼于实际部署和使用过程中遇到的问题,对Flume做的功能修改和优化等。

1 日志收集系统简介

日志收集是大数据的基石。

许多公司的业务平台每天都会产生大量的日志数据。收集业务日志数据,供离线和在线的分析系统使用,正是日志收集系统的要做的事情。高可用性,高可靠性和可扩展性是日志收集系统所具有的基本特征。

目前常用的开源日志收集系统有Flume, Scribe等。FlumeCloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,目前已经是Apache的一个子项目。ScribeFacebook开源的日志收集系统,它为日志的分布式收集,统一处理提供一个可扩展的,高容错的简单方案。

2 常用的开源日志收集系统对比

下面将对常见的开源日志收集系统FlumeScribe的各方面进行对比。对比中Flume将主要采用Apache下的Flume-NG为参考对象。同时,我们将常用的日志收集系统分为三层(Agent层,Collector层和Store层)来进行对比。

[td]

对比项

Flume-NG

Scribe

使用语言

Java

c/c++

容错性

AgentCollector间,CollectorStore间都有容错性,且提供三种级别的可靠性保证;

AgentCollector, CollectorStore之间有容错性;

负载均衡

AgentCollector间,CollectorStore间有LoadBalanceFailover两种模式

可扩展性

Agent丰富程度

提供丰富的Agent,包括avro/thrift socket, text, tail

主要是thrift端口

Store丰富程度

可以直接写hdfs, text, console, tcp;写hdfs时支持对textsequence的压缩;

提供buffer, network, file(hdfs, text)

代码结构

系统框架好,模块分明,易于开发

代码简单

3 美团日志收集系统架构

美团的日志收集系统负责美团的所有业务日志的收集,并分别给Hadoop平台提供离线数据和Storm平台提供实时数据流。美团的日志收集系统基于Flume设计和搭建而成。目前每天收集和处理约T级别的日志数据。

下图是美团的日志收集系统的整体框架图。

a. 整个系统分为三层:Agent层,Collector层和Store层。其中Agent层每个机器部署一个进程,负责对单机的日志收集工作;Collector层部署在中心服务器上,负责接收Agent层发送的日志,并且将日志根据路由规则写到相应的Store层中;Store层负责提供永久或者临时的日志存储服务,或者将日志流导向其它服务器。

b. AgentCollector使用LoadBalance策略,将所有的日志均衡地发到所有的Collector上,达到负载均衡的目标,同时并处理单个Collector失效的问题。

c. Collector层的目标主要有三个:SinkHdfs, SinkKafkaSinkBypass。分别提供离线的数据到Hdfs,和提供实时的日志流到KafkaBypass。其中SinkHdfs又根据日志量的大小分为SinkHdfs_bSinkHdfs_mSinkHdfs_s三个Sink,以提高写入到Hdfs的性能,具体见后面介绍。

d. 对于Store来说,Hdfs负责永久地存储所有日志;Kafka存储最新的7天日志,并给Storm系统提供实时日志流;Bypass负责给其它服务器和应用提供实时日志流。

下图是美团的日志收集系统的模块分解图,详解Agent, CollectorBypass中的Source, ChannelSink的关系。

a. 模块命名规则:所有的Sourcesrc开头,所有的Channelch开头,所有的Sinksink开头;

b. Channel统一使用美团开发的DualChannel,具体原因后面详述;对于过滤掉的日志使用NullChannel,具体原因后面详述;

c. 模块之间内部通信统一使用Avro接口;

4 架构设计考虑

下面将从可用性,可靠性,可扩展性和兼容性等方面,对上述的架构做细致的解析。

4.1 可用性(availablity)

对日志收集系统来说,可用性(availablity)指固定周期内系统无故障运行总时间。要想提高系统的可用性,就需要消除系统的单点,提高系统的冗余度。下面来看看美团的日志收集系统在可用性方面的考虑。

4.1.1 Agent死掉

Agent死掉分为两种情况:机器死机或者Agent进程死掉。

对于机器死机的情况来说,由于产生日志的进程也同样会死掉,所以不会再产生新的日志,不存在不提供服务的情况。

对于Agent进程死掉的情况来说,确实会降低系统的可用性。对此,我们有下面三种方式来提高系统的可用性。首先,所有的Agentsupervise的方式下启动,如果进程死掉会被系统立即重启,以提供服务。其次,对所有的Agent进行存活监控,发现Agent死掉立即报警。最后,对于非常重要的日志,建议应用直接将日志写磁盘,Agent使用spooldir的方式获得最新的日志。

4.1.2 Collector死掉

由于中心服务器提供的是对等的且无差别的服务,且Agent访问Collector做了LoadBalance和重试机制。所以当某个Collector无法提供服务时,Agent的重试策略会将数据发送到其它可用的Collector上面。所以整个服务不受影响。

4.1.3 Hdfs正常停机

我们在CollectorHdfsSink中提供了开关选项,可以控制Collector停止写Hdfs,并且将所有的events缓存到FileChannel的功能。

4.1.4 Hdfs异常停机或不可访问

假如Hdfs异常停机或不可访问,此时Collector无法写Hdfs。由于我们使用DualChannelCollector可以将所收到的events缓存到FileChannel,保存在磁盘上,继续提供服务。当Hdfs恢复服务以后,再将FileChannel中缓存的events再发送到Hdfs上。这种机制类似于Scribe,可以提供较好的容错性。

4.1.5 Collector变慢或者Agent/Collector网络变慢

如果Collector处理速度变慢(比如机器load过高)或者Agent/Collector之间的网络变慢,可能导致Agent发送到Collector的速度变慢。同样的,对于此种情况,我们在Agent端使用DualChannelAgent可以将收到的events缓存到FileChannel,保存在磁盘上,继续提供服务。当Collector恢复服务以后,再将FileChannel中缓存的events再发送给Collector

4.1.6 Hdfs变慢

Hadoop上的任务较多且有大量的读写操作时,Hdfs的读写数据往往变的很慢。由于每天,每周都有高峰使用期,所以这种情况非常普遍。

对于Hdfs变慢的问题,我们同样使用DualChannel来解决。当Hdfs写入较快时,所有的events只经过MemChannel传递数据,减少磁盘IO,获得较高性能。当Hdfs写入较慢时,所有的events只经过FileChannel传递数据,有一个较大的数据缓存空间。

4.2 可靠性(reliability)

对日志收集系统来说,可靠性(reliability)是指Flume在数据流的传输过程中,保证events的可靠传递。

Flume来说,所有的events都被保存在AgentChannel中,然后被发送到数据流中的下一个Agent或者最终的存储服务中。那么一个AgentChannel中的events什么时候被删除呢?当且仅当它们被保存到下一个AgentChannel中或者被保存到最终的存储服务中。这就是Flume提供数据流中点到点的可靠性保证的最基本的单跳消息传递语义。

那么Flume是如何做到上述最基本的消息传递语义呢?

首先,Agent间的事务交换。Flume使用事务的办法来保证event的可靠传递。SourceSink分别被封装在事务中,这些事务由保存event的存储提供或者由Channel提供。这就保证了event在数据流的点对点传输中是可靠的。在多级数据流中,如下图,上一级的Sink和下一级的Source都被包含在事务中,保证数据可靠地从一个Channel到另一个Channel转移。

其次,数据流中 Channel的持久性。FlumeMemoryChannel是可能丢失数据的(当Agent死掉时),而FileChannel是持久性的,提供类似mysql的日志机制,保证数据不丢失。

4.3 可扩展性(scalability)

对日志收集系统来说,可扩展性(scalability)是指系统能够线性扩展。当日志量增大时,系统能够以简单的增加机器来达到线性扩容的目的。

对于基于Flume的日志收集系统来说,需要在设计的每一层,都可以做到线性扩展地提供服务。下面将对每一层的可扩展性做相应的说明。

4.3.1 Agent

对于Agent这一层来说,每个机器部署一个Agent,可以水平扩展,不受限制。一个方面,Agent收集日志的能力受限于机器的性能,正常情况下一个Agent可以为单机提供足够服务。另一方面,如果机器比较多,可能受限于后端Collector提供的服务,但AgentCollector是有Load Balance机制,使得Collector可以线性扩展提高能力。

4.3.2 Collector

对于Collector这一层,AgentCollector是有Load Balance机制,并且Collector提供无差别服务,所以可以线性扩展。其性能主要受限于Store层提供的能力。

4.3.3 Store

对于Store这一层来说,HdfsKafka都是分布式系统,可以做到线性扩展。Bypass属于临时的应用,只对应于某一类日志,性能不是瓶颈。

4.4 Channel的选择

Flume1.4.0中,其官方提供常用的MemoryChannelFileChannel供大家选择。其优劣如下:

  • MemoryChannel: 所有的events被保存在内存中。优点是高吞吐。缺点是容量有限并且Agent死掉时会丢失内存中的数据。
  • FileChannel: 所有的events被保存在文件中。优点是容量较大且死掉时数据可恢复。缺点是速度较慢。

 

上述两种Channel,优缺点相反,分别有自己适合的场景。然而,对于大部分应用来说,我们希望Channel可以同提供高吞吐和大缓存。基于此,我们开发了DualChannel

  • DualChannel:基于 MemoryChannel FileChannel开发。当堆积在Channel中的events数小于阈值时,所有的events被保存在MemoryChannel中,SinkMemoryChannel中读取数据; 当堆积在Channel中的events数大于阈值时, 所有的events被自动存放在FileChannel中,SinkFileChannel中读取数据。这样当系统正常运行时,我们可以使用MemoryChannel的高吞吐特性;当系统有异常时,我们可以利用FileChannel的大缓存的特性。

4.5 scribe兼容

在设计之初,我们就要求每类日志都有一个category相对应,并且FlumeAgent提供AvroSourceScribeSource两种服务。这将保持和之前的Scribe相对应,减少业务的更改成本。

4.6 权限控制

在目前的日志收集系统中,我们只使用最简单的权限控制。只有设定的category才可以进入到存储系统。所以目前的权限控制就是category过滤。

如果权限控制放在Agent端,优势是可以较好地控制垃圾数据在系统中流转。但劣势是配置修改麻烦,每增加一个日志就需要重启或者重载Agent的配置。

如果权限控制放在Collector端,优势是方便进行配置的修改和加载。劣势是部分没有注册的数据可能在Agent/Collector之间传输。

考虑到Agent/Collector之间的日志传输并非系统瓶颈,且目前日志收集属内部系统,安全问题属于次要问题,所以选择采用Collector端控制。

4.7 提供实时流

美团的部分业务,如实时推荐,反爬虫服务等服务,需要处理实时的数据流。因此我们希望Flume能够导出一份实时流给Kafka/Storm系统。

一个非常重要的要求是实时数据流不应该受到其它Sink的速度影响,保证实时数据流的速度。这一点,我们是通过Collector中设置不同的Channel进行隔离,并且DualChannel的大容量保证了日志的处理不受Sink的影响。

5 系统监控

对于一个大型复杂系统来说,监控是必不可少的部分。设计合理的监控,可以对异常情况及时发现,只要有一部手机,就可以知道系统是否正常运作。对于美团的日志收集系统,我们建立了多维度的监控,防止未知的异常发生。

5.1 发送速度,拥堵情况,写Hdfs速度

通过发送给zabbix的数据,我们可以绘制出发送数量、拥堵情况和写Hdfs速度的图表,对于超预期的拥堵,我们会报警出来查找原因。

下面是Flume Collector HdfsSink写数据到Hdfs的速度截图:

下面是Flume CollectorFileChannel中拥堵的events数据量截图:

5.2 flumehfds状态的监控

Flume写入Hdfs会先生成tmp文件,对于特别重要的日志,我们会每15分钟左右检查一下各个Collector是否都产生了tmp文件,对于没有正常产生tmp文件的Collector和日志我们需要检查是否有异常。这样可以及时发现Flume和日志的异常.

5.3 日志大小异常监控

对于重要的日志,我们会每个小时都监控日志大小周同比是否有较大波动,并给予提醒,这个报警有效的发现了异常的日志,且多次发现了应用方日志发送的异常,及时给予了对方反馈,帮助他们及早修复自身系统的异常。

通过上述的讲解,我们可以看到,基于Flume的美团日志收集系统已经是具备高可用性,高可靠性,可扩展等特性的分布式服务。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Flume日志收集系统架构和设计(一) 的相关文章

  • flume自定义拦截器实现定制收集日志需求

    flume默认提供了timestamp host static regex等几种类型的拦截器 xff0c timestamp host static等拦截器 xff0c 其实就是在消息头中增加了时间戳 xff0c 主机名 xff0c 键值对
  • Docker部署Grafana Loki日志收集系统

    官方参考文档 https grafana com docs loki latest installation docker Docker部署loki loki配置文件 xff08 二选一 xff09 使用命令下载loki config ya
  • SLF4J: Hbase和Flume的slf4j-log4j12-x.x.xx.jar与hadoop的slf4j-log4j12-x.x.xx.jar冲突

    SLF4J Hbase和Flume的slf4j log4j12 x x xx jar与hadoop的slf4j log4j12 x x xx jar冲突 文章目录 SLF4J Hbase和Flume的slf4j log4j12 x x xx
  • 记flume部署过程中遇到的问题以及解决方法(持续更新)

    项目需求是将线上服务器生成的日志信息实时导入kafka xff0c 采用agent和collector分层传输 xff0c app的数据通过thrift传给agent xff0c agent通过avro sink将数据发给collector
  • 大数据技术面试-Flume、kafka

    大数据技术面试 Flume kafka 1 Flume组成有哪些 2 Flume拦截器有哪些知识点 3 Flume采集数据会丢失吗 4 FileChannel如何优化 5 如何控制Kafka丢不丢数据 6 Kafka分区分配策略默认哪两种
  • flume采集log4j日志到kafka

    简单测试项目 1 新建Java项目结构如下 测试类FlumeTest代码如下 package com demo flume import org apache log4j Logger public class FlumeTest priv
  • scribe日志收集

    https www xiaomastack com 2014 11 11 scribe nginx php 日志管理 4 用scribe收集nginx和php日志 By 小马 十一月 11 2014 Scribe 日志管理 Leave a
  • Scribe配置文件解析

    Scribe的配置文件由全局的section和一个或多个store的section组成 这篇来了解一下scribe的配置文件 在源码包的examples目录下有多个配置文件实例 examples example1 conf 模拟服务端 ex
  • Flink Table API 与 Flink SQL 实现Kafka To Kafka 版本1.12

    Table API版本 0 前提 1 创建流和表执行环境 2 连接Source并创建Table 3 筛选Table对象中的数据 4 连接Sink并创建临时表 5 将Table对象写入临时表 测试 杠精打住 SQL 版本 最近有铁汁问我 一闪
  • flume使用(二):采集远程日志数据到MySql数据库

    本文内容可查看目录 本文内容包含单节点 单agent 和多节点 多agent 采集远程日志 说明 一 环境 linux系统 Centos7 Jdk 1 7 Flume 1 7 0 二 安装 linux中jdk mysql的安装不多赘述 fl
  • Flume之:二、企业开发案例

    Flume之 二 企业开发案例 文章目录 Flume之 二 企业开发案例 三 企业开发案例 1 监控端口数据官方案例 2 实时读取本地文件到HDFS案例 3 实时读取目录文件到HDFS案例 4 flume监控Kafka gt Spark知识
  • 如何在flume中同时使用regex_extractor选择器和多路复用拦截器?

    我正在测试 Flume 将数据加载到 hHase 中 并考虑使用 Flume 的选择器和拦截器进行并行数据加载 因为源和接收器之间的速度差距 所以 我想要用 Flume 做的是 使用拦截器 regexp extract 类型创建事件标头 使
  • Flume-ng 拖尾文件

    我试图了解如何使用 Flume ng 尾部文件 以便可以将数据推送到 HDFS 中 在第一个实例中 我设置了一个简单的conf文件 tail1 sources source1 tail1 sinks sink1 tail1 channels
  • 2023_Spark_实验二十八:Flume部署及配置

    实验目的 熟悉掌握Flume部署及配置 实验方法 通过在集群中部署Flume 掌握Flume配置 实验步骤 一 Flume简介 Flume是一种分布式的 可靠的和可用的服务 用于有效地收集 聚合和移动大量日志数据 它有一个简单灵活的基于流数
  • Flume - 整个文件可以被视为 Flume 中的一个事件吗?

    我有一个用例 需要将目录中的文件提取到 HDFS 中 作为 POC 我在 Flume 中使用了简单的目录假脱机 其中我指定了源 接收器和通道 并且它工作得很好 缺点是我必须为进入不同文件夹的多种文件类型维护多个目录 以便更好地控制文件大小和
  • 由于 JAR 冲突,无法运行 Flume

    我已经手动安装了 Flume 和 Hadoop 我的意思是 不是 CDH 并且我正在尝试运行 twitterexample https github com cloudera cdh twitter example来自Cloudera In
  • Flume的Spool Dir可以在远程机器上吗?

    每当新文件到达特定文件夹时 我就尝试将文件从远程计算机获取到我的 hdfs 我在flume中遇到了spool dir的概念 如果spool dir位于运行flume代理的同一台机器上 那么它工作得很好 有什么方法可以在远程计算机中配置假脱机
  • 使用具有正斜杠的密钥连接到 s3 接收器时出现无效主机名错误

    我有一个forward slash在 aws 密钥中 当我尝试连接到 s3 接收器时 Caused by java lang IllegalArgumentException Invalid hostname in URI s3 xxxx
  • 是否可以将 Flume 标头写入 HDFS 接收器并删除主体?

    text with headers 序列化器 HDFS 接收器序列化器 允许保存 Flume 事件标头而不是丢弃它们 输出格式由标头 后跟空格和正文有效负载组成 我们想删除正文并仅保留标题 对于 HBase 接收器 RegexHbaseEv
  • java.io.IOException:无法获取 LocationBlock 的块长度

    我正在使用 HDP 2 1 对于集群 我遇到了以下异常 并且 MapReduce 作业因此失败 实际上 我们定期使用 Flume 版本的数据创建表 1 4 我检查了映射器尝试读取的数据文件 但我找不到任何内容 2014 11 28 00 0

随机推荐

  • /libcublas.so.11: symbol cublasLtHSHMatmulAlgoInit version libcublasLt.so.11 not defined in file lib

    GLUE root cd163c5c74c9 cd root miniconda3 GLUE root cd163c5c74c9 miniconda3 ls LICENSE txt bin compiler compat conda met
  • Aruba为边缘赋“能”

    点击上方关注我们 我们不断重复着 万物互联 万物智能 那些曾在电影中多次出现的带有科幻意味的 智能 今天已经在生活中变成现实 而我们似乎已经对此见怪不怪 我们有充足的理由相信 云 AI 5G 将再次颠覆整个世界 哦 对了 必须再加上一个 边
  • Zotero插件「Better BibTex」实现自定义导出格式

    Better BibTex插件设置 介绍 实现 最近在撰写论文时 由于发现Zotero Better BibTex导出参考文献时 会与Google Scholar上有诸多不一致 引起了很多不必要的麻烦 奈何网上关于如何自定义导出格式的教程寥
  • Python数据分析,学习路径拆解及资源推荐(附详细思维导图)

    关于Python数据分析 其实网上能够找到的学习资源很多 主要分为两类 一类是提供各种资源的推荐 比如书单 教程 以及学习的先后顺序 另一类是提供具体的学习内容 知识点或实际案例 但很多繁琐而又杂乱的内容 除了给初学者增加理解和认识的噪音外
  • Flutter中回调函数

    文章目录 一 前言 二 示例代码 二 函数 三 定义一个函数变量 四 函数回调的写法1 Function 五 函数回调的写法2 typedof 六 函数回调的写法3 系统默认 一 前言 如果对回调函数概念了解的话可以跳过本段内容和第二段内容
  • 基于VS平台的库生成与使用

    基于VS平台的库生成与使用 动态库的创建连接参考链接 https www cnblogs com codingmengmeng p 6287425 html 静态库的创建连接参考链接 https www cnblogs com zqh201
  • 【华为OD机试真题】We Are A Team(C++&java&python)100%通过率 超详细代码注释 代码优化

    We Are A Team 题目描述 总共有n个人在机房 每个人有一个标号 1 lt 标号 lt n 他们分成了多个团队 需要你根据收到的m条消息判定指定的两个人是否在 一个团队中 具体的 1 消息构成为abc 整数a b分别代表两个人的标
  • python生成100个随机数_每日任务:Python对随机生成的100个数进行排序

    author wuwa coding utf 8 import random 随机生成100个10至1000之间的数 对生成的100个数进行排序 禁止使用Python自带的排序函数 要自己实现排序函数 class MySort 生成随机数
  • 动态规划算法刷题

    第一天 使用滚动数组 1 菲波那切数列 斐波那契数 通常用 F n 表示 形成的序列称为 斐波那契数列 该数列由 0 和 1 开始 后面的每一项数字都是前面两项数字的和 也就是 F 0 0 F 1 1 F n F n 1 F n 2 其中
  • C++按行读/写txt文件

    将 hello 写入F test txt的第1行 include
  • 在ASP.NET中显示进度条

    在ASP NET中显示进度条 孟宪会之精彩世界 对于加载时间比较长的ASP NET页面 我们可以在客户端浏览器中显示进度条来显示页面正在装载 下面就是具体的实现过程 新建项目 名字为WebPortal 在项目类型中选择Visual C 项目
  • STM32单片机并口通信编程实例:代码详解与应用案例

    引言 单片机并口通信是一种传统而常用的通信方式 通过并行方式进行数据传输 尽管串口通信在现代应用中更加普遍 但并口通信在一些特定领域的应用仍然具有重要意义 本文将介绍单片机并口通信的原理 配置和实践方法 并给出STM32单片机的示例代码和详
  • 类属性、实例属性

    实例属性 对象属性 顾名思义 类属性就是类对象所拥有的属性 它被所有类对象的实例对象所共有 在内存中只存在一个副本 这个和C 中类的静态成员变量有点类似 对于公有的类属性 在类外可以通过类对象和实例对象访问 类属性 实例如下 class P
  • 根据字节大小分割字符串(java)

    public List
  • JAVA学习进程、线程

    1 进程 进程 是正在进行的程序 是系统进行资源分配和调用的独立单位 每一个进程都有它自己的内存空间和系统资源 2 线程 线程 是进程中的单个顺序控制流 是一条执行路径 分为 单线程和多线程 多线程的实现方式 设置和获取线程名称 线程的调度
  • t-SNE手写字识别案例

    参考链接 https scikit learn org stable auto examples manifold plot lle digits html sphx glr auto examples manifold plot lle
  • Unity C# 计算导弹抛物线弹道和转向

    在三维空间中 利用抛物线公式计算弹道 得到一个发射初速度 让导弹打击到指定地点效果 脚本使用 只需指定目标点即可可以通过Hight调整导弹的飞行高度可以通过Gravity调整导弹的飞行速度 通过以下两个脚本实现 工具脚本计算弹道 Missi
  • Docker部署ELK(配置密码登录)及Elastalert企业微信告警配置

    ELK部署记录 部署Elasticsearch Kibana Cerebro 通过docker进行部署 可以避免很多缺少依赖的问题 推荐使用centos7环境进行部署 请提前安装好docker服务 docker compose服务 先新建一
  • jquery two class

    This should work a b If you want an intersection just write the selectors together without spaces in between So for some
  • 基于Flume日志收集系统架构和设计(一)

    问题导读 1 Flume NG与Scribe对比 Flume NG的优势在什么地方 2 架构设计考虑需要考虑什么问题 3 Agent死机该如何解决 4 Collector死机是否会有影响 5 Flume NG可靠性 reliability