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:负载均衡,在负载均衡中又有两种分发数据的策略
- round-robin:轮询,将数据轮流发给每一个sink
- 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机器的日志又变回了校验配置文件日志
这样就代表级联模式下的高可用已经实现