Flume在同程的实践

Posted TC大数据

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flume在同程的实践相关的知识,希望对你有一定的参考价值。

简介

        Flume 是cloudera公司开源的一款适用于数据收集、聚合和搬运的分布式,可靠的以及高可用的服务,其容错性、可定制化开发以及易拓展性也让flume在大数据的应用中越来越展现他的优势,被企业广泛使用,是顶级的Apache项目之一

常用的场景

    各类MQ、日志-->Flume-实时计算(Storm)

    各类MQ、日志-->Flume-离线计算(Hbase、hdfs)

    各类MQ、日志-->Flume-存储介质(mysql、MongoDB、ElasticSearch)

系统要求

    JRE 1.6及以上,推荐1.7

    内存、硬盘要求是不同场景,不尽相同

官方的Flume-NG架构图

目前最新版本是1.7

    Flume-NG主要有三个组件组成,可实现高度的定制化,就像你买来各种电脑组件,随意组装你想要的各种功能

    Source:数据采集的源头,用于主动获取或者监听或接受外部事件源的信息,包装成event传递到下以目的地,常用的有avro,kafka,日志文件等

    Channel:数据传输的通道,用来保存事件,在sink消费后,才会被清理掉,消费过程具有事务性操作特性,常用的有file channel,memory channel等

    Sink:数据采集后的目的地,发送flume event到执行的外部目标,常用的到hdfs、es等

Flume安装部署

1.从官方下载最新的版本,直接解压就可以了

2.配置demo

agent_tc.sources = avro-AppSrv-source

agent_tc.sinks = hdfs-Cluster1-sink

agent_tc.channels = mem-channel-1

# set channel for sources, sinks

agent_tc.sources.avro-AppSrv-source.channel=mem-channel-1

agent_tc.sinks.hdfs-Cluster1-sink.channel=mem-channel-1

# properties of avro-AppSrv-source

agent_tc.sources.avro-AppSrv-source.type = avro

agent_tc.sources.avro-AppSrv-source.bind = localhost

agent_tc.sources.avro-AppSrv-source.port = 10000

# properties of mem-channel-1

agent_tc.channels.mem-channel-1.type = memory

agent_tc.channels.mem-channel-1.capacity = 1000

agent_tc.channels.mem-channel-1.transactionCapacity = 100

# properties of hdfs-Cluster1-sink

agent_tc.sinks.hdfs-Cluster1-sink.type = hdfs

agent_tc.sinks.hdfs-Cluster1-sink.hdfs.path = hdfs://namenode/flume/webdata

3.启动服务

第一种方式是加载本地文件,本地做简单测试的时候比较方面

bin/flume-ng agent --conf conf --conf-file conf/demo.properties --name agent_tc

第二种方式是加载到ZK上的配置,适用于集群,实现一次配置,多台机器共享的目的

bin/flume-ng agent --conf conf  -z $ZK_SERVER -p /FlumeNode -name agent_tc




讲完基本原理和概念,下面到应用部分

    下图是日志收集到ES的一个实践架构图

需求

    需要收集线上集群上千台机器的日志,放到ES中

架构功能考虑如下

1.高效性

上百台机器不可能每台机器一个配置,故采用读取公共ZK的方式,让各个集群读取到同样的配置文件

使用正则表达式匹配不同的文件目录和文件名,统一采集的数据源

2.实时性

采用TailSource实现实时拉取新增的日志,然后实时发送到ES

3.可拓展性

定制化开发识别不同日志的不同换行符的开关

使用正则获取日志中关键的词如日志中记录的时间,日志等级,自定义event head中展示的部分

4.可用性

使用FileChannel,数据会持久到磁盘

使用MemoryChannel可能会丢失数据(当Agent进程挂掉时)

5.容错性

日志最后落到ES集群,多节点提高容错性

当然还有其他的配置,比较多个source、channel、sink混合使用,本次的sink可以作为下次的source实现消息的转发,还有负载均衡的配置等,用户可以根据实际情况灵活配置。




最后记录下工作中的二点思考

一.可用性

    Agent进程挂掉

    case1 :是整个物理机器或者docker等虚拟环境不可用,比如机房停电了

         ⑴ 对于采集本机日志来说,本机采集的日志信息或者监听的信息已经不可用,不存在服务恢复问题。

         ⑵ 对于外部发来的消息来说,使用failover模式,当此进程挂掉时,消息转到其他机器

    case2 :flume的agent进程挂掉,其他进程服务还是正常的

         ⑴:采用Monitor方式及时发现立即告警

         ⑵:使用监控进程自动拉起来agent进程

         ⑶:特别重要的日志,建议持久化到磁盘

         ⑷:使用failover模式,当此进程挂掉时,消息转到其他机器

二.监控系统

    进程的监控,第一时间知晓告警并恢复服务

    Sink端的文件写入、存储写入等监控,第一时间知道文件写入或者存储写入是否正常

    上游消息队列的积压监控,第一时间知道进程未正常服务,为定位和排查节约时间

    文件个数、大小的监控,第一时间知晓Channel是否有积压,性能问题,及时做调整


以上是关于Flume在同程的实践的主要内容,如果未能解决你的问题,请参考以下文章

同程旅行王晓波:同程凤凰缓存系统在基于 Redis 方面的设计与实践(上篇)

Flink集成Iceberg在同程艺龙的实践

同程旅行Hadoop集群跨机房迁移实践

从Zabbix到Prometheus,同程艺龙数据库监控系统的实践

同程旅行基于 RocketMQ 高可用架构实践

同程旅行基于 RocketMQ 高可用架构实践