Flume组件——grouping processor(failover sink processor—实现级联模式下的高可用)

1.grouping processor介绍

Flume中有多个组件,其中最重要的一个组件就是grouping processor / sink processor

sink process的作用:在一个agent中,多个sink可以被组装到一个组,使得一个channel可以连接多个sink,实现数据在组内多个sink之间发送

两种模式:

  • failover sink processor:失败切换,即当下一级的agent由于宕机无法接收数据时,就切换到另一台备用agent及其上级sink继续接收数据
  • load balancing sink processor:负载均衡,在负载均衡中又有两种分发数据的策略
  1. round-robin:轮询,将数据轮流发给每一个sink
  2. random:随机,将数据随机发给下级的多个sink

2.主要运用场景

此处主要介绍failover sink processor具体如何使用

实际上grouping processor最主要的用处在于,实现级联模式下第二级的高可用,如下图所示:

级联模式:简单来说就是公司内部存在多个子网,不同子网之间需要传输数据,就要使用多级agent进行连接,然后采集和存储数据

上图解读:

  • 使用级联模式时,第一级的sink要使用avro sink,第二级的source要使用avro source
  • 正常情况下一个channel只连接一个sink,使用grouping processor后,一个channel可以连接一个sink组
  • 上图中为实现高可用,使用的grouping processor模式为 failover sink processor
  • 在failover sink processor模式下,实际工作的avro sink只有一个,即图中紫色的sink
  • 当所有agent均正常工作时,汇聚者1接收来自第一级三个agent的数据,第一级中绿色的avro sink和汇聚者2实际上也处于工作状态,但是没有传输数据
  • 当第一级中的某个agent宕机时,此时只有那个agent中的数据采集失败,其他数据采集正常
  • 当第二级中接收数据的汇聚者1宕机时,此时无法再接收数据,导致第一级所有与其对接的avro sink无处分发数据
  • 此时由于配置了第二级的高可用,在汇聚者1宕机时,汇聚者2会立刻代替其工作,同时第一级绿色的avro sink开始从上级channel中读取数据,向下分发,从而保证数据的正常采集(汇聚者1和汇聚者2指向相同的数据存储路径)
  • 汇聚者1和汇聚者2的优先级是事先在配置文件中指定的
  • 在配置文件中会设置汇聚者的惩罚时间,每隔一次惩罚时间,都会检测优先级高的汇聚者是否已经恢复
  • 当优先级高的汇聚者重新上线时,则该汇聚者又会夺回采集数据的权限

3.设置配置信息

第一级agent

# 级联高可用,第一级agent配置
a1.sources = r1
a1.sinks = k1 k2
a1.channels = c1

a1.sources.r1.channels = c1
a1.sources.r1.type = TAILDIR
a1.sources.r1.filegroups = g1
a1.sources.r1.filegroups.g1 = /root/test.*
a1.sources.r1.fileHeader = false

a1.channels.c1.type = memory
a1.channels.c1.capacity = 2000
a1.channels.c1.transactionCapacity = 1000

a1.sinks.k1.channel = c1
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = linux02         ## 第二级的汇聚者1
a1.sinks.k1.port = 4444

a1.sinks.k2.channel = c1
a1.sinks.k2.type = avro
a1.sinks.k2.hostname = linux03         ## 第二级的汇聚者2
a1.sinks.k2.port = 4444

a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = failover
a1.sinkgroups.g1.processor.priority.k1 = 200      ## 优先级只管数字大小,大的优先级较高
a1.sinkgroups.g1.processor.priority.k2 = 100
a1.sinkgroups.g1.processor.maxpenalty = 5000      ## 惩罚时间

第二级agent(汇聚者1)

# 级联高可用配置第2级(节点1)
a1.sources = r1
a1.sinks = k1
a1.channels = c1

a1.sources.r1.channels = c1
a1.sources.r1.type = avro
a1.sources.r1.bind = linux02       ## 汇聚者1所在机器
a1.sources.r1.port = 4444
a1.sources.r1.batchSize = 100

a1.channels.c1.type = memory
a1.channels.c1.capacity = 2000
a1.channels.c1.transactionCapacity = 1000

a1.sinks.k1.channel = c1
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.kafka.bootstrap.servers = linux01:9092,linux02:9092,linux03:9092  ## kafka机器
a1.sinks.k1.kafka.topic = failover      ## 将数据存入 failover topic
a1.sinks.k1.kafka.producer.acks = 1

第二级agent(汇聚者2)

# 级联高可用配置第2级(节点2)
a1.sources = r1
a1.sinks = k1
a1.channels = c1

a1.sources.r1.channels = c1
a1.sources.r1.type = avro
a1.sources.r1.bind = linux03
a1.sources.r1.port = 4444
a1.sources.r1.batchSize = 100

a1.channels.c1.type = memory
a1.channels.c1.capacity = 2000
a1.channels.c1.transactionCapacity = 1000

a1.sinks.k1.channel = c1
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.kafka.bootstrap.servers = linux01:9092,linux02:9092,linux03:9092
a1.sinks.k1.kafka.topic = failover
a1.sinks.k1.kafka.producer.acks = 1

上述配置信息要分别放入到不同的机器中(实际上只有linux02在向kafka中写数据)

4.启动

  • 要先启动第二级机器,开启avro source服务,等待接收数据
  • 再启动第一级机器,开始采集数据,将数据发送到第二级机器
## 先在linux02和linux03中的flume目录下执行如下命令,再在linux01中flume安装目录下执行

bin/flume-ng agent -c conf/ -f agentconf/failover.conf -n a1 -Dflume.root.logger=DEBUG,console

由于linux02机器是汇聚者1,linux03机器是汇聚者2,实际情况中linux03中的agent应该是开启状态,但是没有数据发过去

全部都开启后,linux03会处于开启状态,但是没有日志数据往来,所以不会打很多日志,只会重复检查配置文件是否发生改变

2020-10-08 15:16:57,009 (conf-file-poller-0) [DEBUG - org.apache.flume.node.PollingPropertiesFileConfigurationProvider$FileWatcherRunnable.run(PollingPropertiesFileConfigurationProvider.java:131)] Checking file:agentconf/failover.conf for changes
2020-10-08 15:17:27,010 (conf-file-poller-0) [DEBUG - org.apache.flume.node.PollingPropertiesFileConfigurationProvider$FileWatcherRunnable.run(PollingPropertiesFileConfigurationProvider.java:131)] Checking file:agentconf/failover.conf for changes
2020-10-08 15:17:57,011 (conf-file-poller-0) [DEBUG - org.apache.flume.node.PollingPropertiesFileConfigurationProvider$FileWatcherRunnable.run(PollingPropertiesFileConfigurationProvider.java:131)] Checking file:agentconf/failover.conf for changes

此时先将linux02机器关掉,观察是否还能使用kafka的消费者消费数据

## 进入到kafka安装目录下

bin/kafka-console-consumer.sh --bootstrap-server doitedu01:9092,doitedu02:9092,doitedu03:9092 --topic failover

发现消费者可以继续消费最新接收的数据,而且此时linux03的日志发生了如下变化,开始输出许多日志

2020-10-08 15:22:57,020 (conf-file-poller-0) [DEBUG - org.apache.flume.node.PollingPropertiesFileConfigurationProvider$FileWatcherRunnable.run(PollingPropertiesFileConfigurationProvider.java:131)] Checking file:agentconf/failover.conf for changes
2020-10-08 15:23:27,021 (conf-file-poller-0) [DEBUG - org.apache.flume.node.PollingPropertiesFileConfigurationProvider$FileWatcherRunnable.run(PollingPropertiesFileConfigurationProvider.java:131)] Checking file:agentconf/failover.conf for changes
2020-10-08 15:23:37,825 (New I/O worker #1) [DEBUG - org.apache.flume.source.AvroSource.appendBatch(AvroSource.java:336)] Avro source r1: Received avro event batch of 97 events.

并且linux01处的日志信息也发生了变化

可以看出新连接了linux03作为数据输出端

并且此时还可以持续消费到最新产生的日志数据

最后再重启linux02机器,数据还是可以正常持续消费,并且linux03机器的日志又变回了校验配置文件日志

这样就代表级联模式下的高可用已经实现

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值