Flume之Failover和Load balancing原理及实例
来源:互联网 发布:c语言编程步骤 编辑:程序博客网 时间:2024/05/11 11:21
Failover Sink Processor
Failover Sink Processor维护了一个sink的优先级列表,具有故障转移的功能,具体的配置如下(加粗的必须配置):
default
组件的名称,必须是:failover
processor.priority.<sinkName>–优先级值。<sinkName> 必须是sinks中有定义的。优先级值高Sink会更早被激活。值越大,优先级越高。注:多个sinks的话,优先级的值不要相同,如果优先级相同的话,只会有一个生效。且failover时,同优先级的不会Failover,就算是同优先级的还存在也会报All sinks failed to process。processor.maxpenalty30000失败的Sink最大的退避时间(单位:毫秒)(退避算法(退避算法为我们在解决重试某项任务的时候,提供了一个比较好的等待思想。),参考:http://qiuqiang1985.iteye.com/blog/1513049)
示例:
a1.sinkgroups = g1a1.sinkgroups.g1.sinks = k1 k2a1.sinkgroups.g1.processor.type = failovera1.sinkgroups.g1.processor.priority.k1 = 5a1.sinkgroups.g1.processor.priority.k2 = 10a1.sinkgroups.g1.processor.maxpenalty = 10000
Load balancing Sink Processor
Load balancing sink processor 提供了多个sinks负载均衡的能力。它维护了一个active sinks列表,该列表中的负载必须是分布式的。实现了round_robin(轮询调度) 或者 random(随机) 的选择机制,默认是:round_robin(轮询调度)。也可以通过继承AbstractSinkSelector类来实现自定义的选择机制。
当被调用时,选择器根据配置文件的选择机制挑选下一个sink,并且调用该sink。如果所选的Sink传递Event失败,则通过选择机制挑选下一个可用的Sink,以此类推。
default
组件的名称,必须是:load_balance
processor.backofffalse是否以指数的形式退避失败的Sinks。processor.selectorround_robin
选择机制。必须是round_robin
, random
或者自定义的类,该类继承了AbstractSinkSelector
processor.selector.maxTimeOut30000默认是30000毫秒,屏蔽故障sink的时间示例:
a1.sinkgroups = g1a1.sinkgroups.g1.sinks = k1 k2a1.sinkgroups.g1.processor.type = load_balancea1.sinkgroups.g1.processor.backoff = truea1.sinkgroups.g1.processor.selector = random
Failover和Load balancing实例
测试环境:
10.0.1.76(Client)
10.0.1.68 (Failover和Load balancing)
10.0.1.70
10.0.1.77
10.0.1.85
10.0.1.86
10.0.1.87
以10.0.1.76作为客户端,通过exec获取nginx的日志信息,然后将数据传到10.0.1.68(配置了Failover和Load balancing)的节点,最后10.0.1.68将数据发送的10.0.1.70,77,85,86,87节点,这些节点最终将数据写到本地硬盘。
10.0.1.76的配置:
获取nginx产生的日志,然后通过avro发送的10.0.1.6810.0.1.68配置(配置A):
10.0.1.70和10.0.1.85Load balancing,均衡的方式为轮询调用。10.0.1.70和10.0.1.86为Failover,10.0.1.70和10.0.1.87为Failover
10.0.1.70,77,85,86,87配置:
每次往nginx发2w个请求,然后查看10.0.1.70,77,85,86,87四台服务器接受数据的情况。我们做几组测试:
注:表格中的 * 表示关闭关闭该服务器Flume进程。
测试一:
发送2w个请求到Nginx中,查看各个节点接受数据的行数:
其实无论测试2w次请求,还是测试100w次请求,10.0.1.77都无法接受到数据。
测试二:
问题1: 作为Failover的节点86,87为何可以接受数据,而77没有将接收数据呢?
作为failover,我们会认为只有一个节点生效,其他节点只有在优先级节点down掉才能替补上去,在Flume中关于failover的实现,首先我们要了解Flume加载配置文件是有顺序的。如果配置文件的顺序不同,会导致failover出乎我们的意料,现在我们把上面的(配置A)关于failover和load_balance修改成如下(部分代码):
如果修改成如下的配置,启动时报如下错误:报异常的原因,我们可以查看源码,找到答案,FlumeConfiguration类的isValid()方法:上述是主要的源码片段,可以Debug进去看看,大致的流程:以validateGroups为例,Flume根据sinkgroups顺序的解析配置文件,然后把sink放到变量名为usedSinks的Map当中,每个sink只能使用一次,如果sink在前面某个sinkgroups已经使用,那么就会在该sinkgroups中删除这个sink。按上面的配置,Flume开始解析sinkgroups的g1,则g1包含k85,k87和k77三个有效sink;然后解析sinkgroups的g2,则g2包含k70和k86;解析sinkgroups的g3时,因为k70和k85已经在g1和g2存在了,所以g3包含的sink为空,才导致报如上的错误。也就是说Flume是根据usedSinks来实现failover和load_balance的,因为配置的原因,可能会跟你想象的效果相差甚远。在AbstractConfigurationProvider类的getConfiguration方法,代码片段:
验证完之后,加载Channels,Sources,Sinks,根据验证的结果g1,g2,g3的usedSinks分配如下(配置A):
g1 的usedSinks是:k70和k85
g2 的usedSinks是:k86
g3 的usedSinks是:k87,k77
以loadSinks为例,加载Sink,先调用AbstractConfigurationProvider类的loadSinks方法,然后调用loadSinkGroups方法来初始化Sink,g1的usedSinks有k70和k85,所以k70和k85这两个节点通过round_robin方式balance来接收数据;g2的usedSinks只有k86(由于k70已经在g1中被占用了),所以只有k86接收数据,自然也不会有failover的功能;g3的usedSinks有k87和k77,由于Failover会选取优先级最高的接收数据,所以k87接收数据,当k87挂掉的时候,k77替补上去接收数据。这也就是为何其他节点都可以接收数据,唯独只有k77没有数据的原因。
再者每个sinkgroups都会启动一个SinkRunner线程去调用FailoverSinkProcessor和LoadBalancingSinkProcessor的process()方法去获取数据,这也就是为啥Failover和balance都能接收数据的原因,具体的实现细节,可以自行阅读源码。
2,Failover的情况下,是否优先级越高的就先生效?
是的,同一个Failover下的sink都存放在TreeMap下,然后取最大优先级的Sink作为activeSink。
3,Failover的情况下,如果优先级相同是怎么做失败转移的?
优先级相同的sink节点在failover中只会有一个生效,看源码可以很容易的发现,因为Failover中live的Sink存放在TreeMap中,用优先级作为key,同等优先级的Sink只能保存一个。
总结
1,load_balance配置中的Sink都可以接收数据。
2,load_balance根据均衡策略接收数据。
3,没有Sink既能failover又能load_balance。
4,failover中的Sink优先级不要设置为相同的值。
5,failover配置中的Sink只有优先级最高及没有被之前加载的sinkgroups占用的Sink接收数据,如果优先级高的Sink挂掉,则转到优先级次之的Sink。
6,failover可以做失败转移,如果因为加载顺序的问题,导致failover的Sink已经被占用,failover会造成配置在failover中的sink都能接收数据的假象,其实只是在剩余的sink中实施failover策略。
- Flume之Failover和Load balancing原理及实例
- Flume之Failover和Load balancing原理及实例
- Flume--Load Balancing Sink Processor
- RMI Load Balancing , Failover and High-Availability
- Failover and Load balancing in Oracle
- 【Apache Flume系列】Flume-ng failover 以及Load balance测试及注意事项
- Flume 负载平衡配置(Flume load balancing configuration)和测试
- flume-ng负载均衡load-balance、failover集群搭建
- flume-ng负载均衡load-balance、failover集群搭建
- flume-ng负载均衡load-balance、failover集群搭建
- flume-ng负载均衡load-balance、failover集群搭建
- flume-ng负载均衡load-balance、failover集群搭建
- Load Balancing
- load balancing
- Load Balancing
- Load Balancing
- 10g & 11g Configuration of TAF(Transparent Application Failover) and Load Balancing [ID 453293.1]
- 10g & 11g Configuration of TAF(Transparent Application Failover) and Load Balancing
- oracle 增加日志组和日志文件
- 【Wannafly挑战赛1】A Treepath 【树形DP】or 【黑白染色 找规律】
- POJ-3268 Silver Cow Party
- Android-Java Md5加密技术
- App数据分析到底要分析什么
- Flume之Failover和Load balancing原理及实例
- 【python 处理亿级数据】使用 Pandas 处理亿级数据
- 局部内部类里面的方法如何调用类所在方法里面的变量
- ajax跨域请求传输cookie
- 宽字节SQL注入原理
- java 设计模式
- [2017.12.02-03]多线程
- 进程间通信方式
- 开发高并发系统时保护系统的三把利器:缓存、降级和限流