目录(?)[+]

Sink groups允许组织多个sink到一个实体上。 Sink processors能够提供在组内所有Sink之间实现负载均衡的能力,而且在失败的情况下能够进行故障转移从一个Sink到另一个Sink。

简单的说就是一个source 对应一个Sinkgroups,即多个sink,这里实际上与第六节的复用/复制情况差不多,只是这里考虑的是可靠性与性能,即故障转移与负载均衡的设置。

下面是官方配置:

Property Name

Default

Description

sinks

Space-separated list of sinks that are participating in the group

processor.type

default

The component type name, needs to be defaultfailover or load_balance

从参数类型上可以看出有3种Processors类型:defaultfailover(故障转移)和 load_balance(负载均衡),当然,官网上说目前自定义processors 还不支持。

下面是官网例子

a1.sinkgroups=g1

a1.sinkgroups.g1.sinks=k1 k2

a1.sinkgroups.g1.processor.type=load_balance

 

一、Default Sink Processor

DefaultSink Processor 接收单一的Sink,不强制用户为Sink创建Processor,前面举了很多例子。所以这个就不多说了。

 

二、Failover Sink Processor(故障转移)

         FailoverSink Processor会通过配置维护了一个优先级列表。保证每一个有效的事件都会被处理。

         故障转移的工作原理是将连续失败sink分配到一个池中,在那里被分配一个冷冻期,在这个冷冻期里,这个sink不会做任何事。一旦sink成功发送一个event,sink将被还原到live 池中。

         在这配置中,要设置sinkgroups processor为failover,需要为所有的sink分配优先级,所有的优先级数字必须是唯一的,这个得格外注意。此外,failover time的上限可以通过maxpenalty 属性来进行设置。

下面是官网配置:

Property Name

Default

Description

sinks

Space-separated list of sinks that are participating in the group

processor.type

default

The component type name, needs to be failover

processor.priority.<sinkName>

<sinkName> must be one of the sink instances associated with the current sink group

processor.maxpenalty

30000

(in millis)

下面是官网例子

a1.sinkgroups=g1

a1.sinkgroups.g1.sinks=k1 k2

a1.sinkgroups.g1.processor.type=failover

a1.sinkgroups.g1.processor.priority.k1=5

a1.sinkgroups.g1.processor.priority.k2=10

a1.sinkgroups.g1.processor.maxpenalty=10000

这里首先要申明一个sinkgroups,然后再设置2个sink ,k1与k2,其中2个优先级是5和10,而processor的maxpenalty被设置为10秒,默认是30秒。‘

下面是测试例子


[html] view plain copy

  1. #配置文件:failover_sink_case13.conf  

  2. #Name the components on this agent  

  3. a1.sourcesr1  

  4. a1.sinksk1 k2  

  5. a1.channelsc1 c2  

  6.    

  7. a1.sinkgroupsg1  

  8. a1.sinkgroups.g1.sinksk1 k2  

  9. a1.sinkgroups.g1.processor.typefailover  

  10. a1.sinkgroups.g1.processor.priority.k15  

  11. a1.sinkgroups.g1.processor.priority.k210  

  12. a1.sinkgroups.g1.processor.maxpenalty10000  

  13.    

  14. #Describe/configure the source  

  15. a1.sources.r1.typesyslogtcp  

  16. a1.sources.r1.port50000  

  17. a1.sources.r1.host192.168.233.128  

  18. a1.sources.r1.channelsc1 c2  

  19.    

  20. #Describe the sink  

  21. a1.sinks.k1.typeavro  

  22. a1.sinks.k1.channelc1  

  23. a1.sinks.k1.hostname192.168.233.129  

  24. a1.sinks.k1.port50000  

  25.    

  26. a1.sinks.k2.typeavro  

  27. a1.sinks.k2.channelc2  

  28. a1.sinks.k2.hostname192.168.233.130  

  29. a1.sinks.k2.port50000  

  30. # Usea channel which buffers events in memory  

  31. a1.channels.c1.typememory  

  32. a1.channels.c1.capacity1000  

  33. a1.channels.c1.transactionCapacity100  



这里设置了2个channels与2个sinks ,关于故障转移的设置直接复制官网的例子。我们还要配置2个sinks对于的代理。这里的2个接受代理我们沿用之前第六章复制的2个sink代理配置。

下面是第一个接受复制事件代理配置


[html] view plain copy

  1. #配置文件:replicate_sink1_case11.conf  

  2. # Name the components on this agent  

  3. a2.sources = r1  

  4. a2.sinks = k1  

  5. a2.channels = c1  

  6.    

  7. # Describe/configure the source  

  8. a2.sources.r1.type = avro  

  9. a2.sources.r1.channels = c1  

  10. a2.sources.r1.bind = 192.168.233.129  

  11. a2.sources.r1.port = 50000  

  12.    

  13. # Describe the sink  

  14. a2.sinks.k1.type = logger  

  15. a2.sinks.k1.channel = c1  

  16.    

  17. # Use a channel which buffers events inmemory  

  18. a2.channels.c1.type = memory  

  19. a2.channels.c1.capacity = 1000  

  20. a2.channels.c1.transactionCapacity = 100  



下面是第二个接受复制事件代理配置:


[html] view plain copy

  1. #配置文件:replicate_sink2_case11.conf  

  2. # Name the components on this agent  

  3. a3.sources = r1  

  4. a3.sinks = k1  

  5. a3.channels = c1  

  6.    

  7. # Describe/configure the source  

  8. a3.sources.r1.type = avro  

  9. a3.sources.r1.channels = c1  

  10. a3.sources.r1.bind = 192.168.233.130  

  11. a3.sources.r1.port = 50000  

  12.    

  13. # Describe the sink  

  14. a3.sinks.k1.type = logger  

  15. a3.sinks.k1.channel = c1  

  16.    

  17. # Use a channel which buffers events inmemory  

  18. a3.channels.c1.type = memory  

  19. a3.channels.c1.capacity = 1000  

  20. a3.channels.c1.transactionCapacity = 100  



#敲命令

首先先启动2个接受复制事件代理,如果先启动源发送的代理,会报他找不到sinks的绑定,因为2个接事件的代理还未起来。

flume-ng agent -cconf -f conf/replicate_sink1_case11.conf -n a1 -Dflume.root.logger=INFO,console

flume-ng agent -cconf -f conf/replicate_sink2_case11.conf -n a1 -Dflume.root.logger=INFO,console

在启动源发送的代理

flume-ng agent -cconf -f conf/failover_sink_case13.conf -n a1 -Dflume.root.logger=INFO,console

启动成功后

打开另一个终端输入,往侦听端口送数据

echo "hello failoversink" | nc 192.168.233.128 50000

#在启动源发送的代理终端查看console输出

因为k1的优先级是5,K2是10因此当K2正常运行的时候,是发送到K2的。下面数据正常输出。



然后我们中断K2的代理进程。



再尝试往侦听端口送数据

echo "hello close k2"| nc 192.168.233.128 50000

我们发现源代理发生事件到K2失败,然后他将K2放入到failover list(故障列表)



因为K1还是正常运行的,因此这个时候他会接收到数据。



然后我们再打开K2的大理进程,我们继续往侦听端口送数据

echo " hello open k2 again" | nc192.168.233.128 50000



数据正常发生,Failover SinkProcessor测试完毕。

三、Load balancing SinkProcessor

负载均衡片处理器提供在多个Sink之间负载平衡的能力。实现支持通过round_robin(轮询)或者random(随机)参数来实现负载分发,默认情况下使用round_robin,但可以通过配置覆盖这个默认值。还可以通过集成AbstractSinkSelector类来实现用户自己的选择机制。

当被调用的时候,这选择器通过配置的选择规则选择下一个sink来调用。

下面是官网配置

 

Property Name

Default

Description

processor.sinks

Space-separated list of sinks that are participating in the group

processor.type

default

The component type name, needs to be load_balance

processor.backoff

false

Should failed sinks be backed off exponentially.

processor.selector

round_robin

Selection mechanism. Must be either round_robinrandom or FQCN of custom class that inherits from AbstractSinkSelector

processor.selector.maxTimeOut

30000

Used by backoff selectors to limit exponential backoff (in milliseconds)

下面是官网的例子

a1.sinkgroups=g1

a1.sinkgroups.g1.sinks=k1 k2

a1.sinkgroups.g1.processor.type=load_balance

a1.sinkgroups.g1.processor.backoff=true

a1.sinkgroups.g1.processor.selector=random

这个与故障转移的设置差不多。

下面是测试例子


[html] view plain copy

  1. #配置文件:load_sink_case14.conf  

  2. # Name the components on this agent  

  3. a1.sources = r1  

  4. a1.sinks = k1 k2  

  5. a1.channels = c1  

  6.    

  7. a1.sinkgroups = g1  

  8. a1.sinkgroups.g1.sinks = k1 k2  

  9. a1.sinkgroups.g1.processor.type =load_balance  

  10. a1.sinkgroups.g1.processor.backoff = true  

  11. a1.sinkgroups.g1.processor.selector =round_robin  

  12.    

  13. # Describe/configure the source  

  14. a1.sources.r1.type = syslogtcp  

  15. a1.sources.r1.port = 50000  

  16. a1.sources.r1.host = 192.168.233.128  

  17. a1.sources.r1.channels = c1  

  18.    

  19. # Describe the sink  

  20. a1.sinks.k1.type = avro  

  21. a1.sinks.k1.channel = c1  

  22. a1.sinks.k1.hostname = 192.168.233.129  

  23. a1.sinks.k1.port = 50000  

  24.    

  25. a1.sinks.k2.type = avro  

  26. a1.sinks.k2.channel = c1  

  27. a1.sinks.k2.hostname = 192.168.233.130  

  28. a1.sinks.k2.port = 50000  

  29. # Use a channel which buffers events inmemory  

  30. a1.channels.c1.type = memory  

  31. a1.channels.c1.capacity = 1000  

  32. a1.channels.c1.transactionCapacity = 100  


这里要说明的是,因此测试的是负载均衡的例子,因此这边使用一个channel来作为数据传输通道。这里sinks的对应的接收数据的代理配置,我们沿用故障转移的接收代理配置。

#敲命令

首先先启动2个接受复制事件代理,如果先启动源发送的代理,会报他找不到sinks的绑定,因为2个接事件的代理还未起来。

flume-ng agent -cconf -f conf/replicate_sink1_case11.conf -n a1

-Dflume.root.logger=INFO,console

flume-ng agent -cconf -f conf/replicate_sink2_case11.conf -n a1

-Dflume.root.logger=INFO,console

在启动源发送的代理

flume-ng agent -cconf -f conf/load_sink_case14.conf -n a1

-Dflume.root.logger=INFO,console

 

启动成功后

 

打开另一个终端输入,往侦听端口送数据

echo "loadbanlancetest1" | nc 192.168.233.128 50000

echo "loadbantest2" | nc 192.168.233.128 50000

echo "loadban test3"| nc 192.168.233.128 50000

echo "loadbantest4" | nc 192.168.233.128 50000

echo "loadbantest5" | nc 192.168.233.128 50000

#在启动源发送的代理终端查看console输出

其中K1收到3条数据



其中K1收到2条数据



因为我们负载均衡选择的类型是轮询,因此可以看出flume 让代理每次向一个sink发送2次事件数据后就换另一个sinks 发送。

Sink Processors测试完毕