failover sink processor根据优先级从sink组中选择宿。具有最高优先级的接收器将写入数据直到其失败(接收器的故障甚至可能是因为下游代理在RPC陷阱的情况下死亡),然后选择组中其他接收器中具有最高优先级的接收器。选择不同的接收器才能在当前接收器写入数据失败时写入数据。这确保了当没有故障时,第二层上的所有代理都有一个从每个机器写入的接收器,并且只有在某些机器看到更多的传入数据时才会发生故障。
但是,故障切换机制不会选择新的接收器,除非当前接收器出现故障。这意味着即使可能的是,具有最高优先级的代理可能失败并重新联机,failover sink processor不会使sink写入该代理,直到当前活动的sink遇到错误为止。failover sink processor的工作流程如图所示。
如表 所示,failover sink processor的类型参数为failover。由于每个接收器处理器按照优先顺序激活接收器,所以必须在配置中使用优先级设置接收器的优先级。前缀后面是接收器名称,其值设置为所需的优先级。请注意,优先级按照增加的顺序进行考虑,这意味着优先级的绝对值越高,接收器激活的时间越早。
例如,具有优先级为100的接收器在具有优先级为90的接收器之前被激活。如果没有为特定接收器设置优先级,则基于接收器组配置中指定的接收器的顺序来确定接收器的优先级。每次水槽无法写入数据时,水槽被认为失败并被短时间列入黑名单。这个黑名单时间间隔(类似于负载平衡宿处理器中的退避周期)随着每次连续尝试导致失败而增加,直到达到由maxpenalty指定的值(以毫秒为单位)。一旦黑名单间隔达到此值,进一步的故障将导致在许多毫秒之后尝试接收器。一旦接收器在此之后成功写入数据,则退避周期将重置为0.请查看以下示例:
agent.sinks = s1 s2 s3 s4
agent.sinkgroups.sg1.sinks = s1 s2 s3 s4
agent.sinkgroups.sg1.processor.type = failover
agent.sinkgroups.sg1.processor.priority.s2 = 100
agent.sinkgroups.sg1.processor.priority.s1 = 90
agent.sinkgroups.sg1.processor.priority.s4 = 110
agent.sinkgroups.sg1.processor.maxpenalty = 10000
在此配置中,在故障转移配置中使用了四个接收器,其中s4优先级最高,其次是s2和s1。 sink s3没有设置优先级。 对于没有指定优先级的接收端,优先级设置的第一个接收器优先级为0,下一个给定为优先级-1,下一个给定为-2,依此类推。 这些优先级只能分配给没有设置优先级的接收器。 因此,这里显示的样本配置会隐含地分配sink s3优先级0,所以汇点将按顺序s4,s2,s1,s3进行尝试。 请注意,如果两个接收器具有相同的优先级(隐式或显式分配),则在接收器组中首先指定的接收器是仅激活的接收器。 还要注意,如果显式和隐式的优先级设置在相同的范围内,那么它们的值就被使用。 例如:
agent.sinks = s1 s2 s3 s4
agent.sinkgroups.sg1.sinks = s1 s2 s3 s4 s5 s6
agent.sinkgroups.sg1.processor.type = failover
agent.sinkgroups.sg1.processor.priority.s2 = 0
agent.sinkgroups.sg1.processor.priority.s4 = 110
agent.sinkgroups.sg1.processor.priority.s5 = -5
agent.sinkgroups.sg1.processor.priority.s6 = -2
agent.sinkgroups.sg1.processor.maxpenalty = 10000
在这种配置中,sink s4具有最高优先级,所以s4首先被激活。 Sink s1将被分配为0的优先级 - 与s2相同 - 这意味着s2未被激活。 s3获得优先级-1,所以激活的顺序为s4,s1,s3,s6,s5。 即使在配置中没有指定s3的优先级,其隐含指定的优先级高于s5和s6,所以s3在它们之前被激活。
0.sink处理器
针对sink group而言的,
1.failover
容灾sink处理器,维护了一组sink列表,只有事件可用,就能处理。
选择有限级高的sink处理所有事件,直到sink故障,再选择优先级低的sink继续处理。
没有负载平衡处理。只是做到容灾。
可以如下实现:
a1.sources = r1
a1.channels = c1
a1.sinkgroups = g1
a1.sinks = k1 k2
a1.sources.r1.type=netcat
a1.sources.r1.bind=localhost
a1.sources.r1.port=8888
a1.channels.c1.type = memory
a1.channels.c1.capacity = 100000
a1.channels.c1.transactionCapacity = 100
a1.sinks.k1.type=file_roll
a1.sinks.k1.sink.directory=/home/centos/flume/f1
a1.sinks.k2.type=file_roll
a1.sinks.k2.sink.directory=/home/centos/flume/f2
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = failover
a1.sinkgroups.g1.processor.priority.k1 = 1
a1.sinkgroups.g1.processor.priority.k2 = 2
a1.sinkgroups.g1.processor.maxpenalty = 10000
a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1
a1.sinks.k2.channel=c1