开发者学堂课程【Flume 基础应用实战-企业全场景解决方案:Apache Flume-高阶-容错(故障转移)功能】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/715/detail/12772
Apache Flume-高阶-容错(故障转移)功能
目录
一、容错的概念
二、如何配置容错的相关核心属性
三、演示
一、容错的概念
容错应该叫做容忍错误的发生(故障转移),它背后所包含的是,当出现单点故障,一个地方出现问题导致整体不可用之后,该怎么办?以 flume 的串联架构为例,简单画个图来梳理一下。
比如说搭建 flume 的一个串联架构,左边是一个 agent,右边再来一个 agent,它们两个之间互相配合,甚至有三个 agent 之间进行一个串联,如果在这样的串联过程当中,它们都正常工作,肯定没有什么问题,怕就怕如果哪一天哪一时刻这台机器突然出现了故障,整个串联的体系就不能正常的运转,这就是一个地方出现故障,导致整体不可用,这叫做单点故障,该怎么去解决它呢?
flume 当中解决单点故障,它容易出问题,可以在这里设置一个备份,比如给第二个再部署一个备份的 flume,当它出现故障之后,备份顶替继续干活,这个顶替的过程就是一个容错的过程。
再出问题,就再部署,可以部署多个备份,备份越多,容错的能力越强,但备份越多,浪费的资源越多,因为同一时刻只能有一个对外提供服务,如果它一直没问题,其它备份都只能闲置。
小结一:
(1)容错又称之为故障转移,叫做容忍错误的发生;
(2)通常用于解决单点故障,给容易出问题的地方设置备份;
备份越多,容错能力越强,但是资源的浪费也越严重。
二、如何配置容错的相关核心属性
容错从价格上来说跟之前所讲的负载均衡差不多,其实用这一套架构也可以去表示容错的一个能力,只不过当中一个机器消费了之后,其他机器不再消费,都做一个备份。
接下来看下图,该怎么样去配置容错的相关核心属性。
首先,指定一个 group,g1,当中有三个 sink,分别为 k1、k2、k3,它组成的不再叫做 load_balance,而是叫作 failover。
讲到容错,这里会有个问题,三台机器容错,到底谁先干活,谁是备份,比如这里的2、3、4,同一时间只能有一个到底是谁,在 flume 当中,通过一个权重的数字来表示的,这个属性叫做优先级,这个词背后的数字的绝对值越大,表示的优先级越高,我们这里有三个 sink, 分别是5、7、6,从绝对值来看,7对应的 k2 优先级最高,它应该先消费,就是说当它消费的时候 k1 和 k3 都是备份,也只有当 k2 出现故障之后,k3 顶上,再之后 k1 可以顶上。
最后还有个参数,叫做最大的惩罚时间20秒钟,就是在 flume 实现容错的时候,会有一个优先级的列表,如果当中有一个 sink 出现故障,比如 k2 出现故障,它会首先把它转移到失败的一个池子当中,给一个冷却的时间。
在这个冷却的时间内,如果能够成功地接受处理一个 sink,就认为能够恢复了,说明没有问题,反之,如果状态没有恢复,这个惩罚的时间将会越来越多,这就是相当于先判一个缓刑,最后判个死刑,如果你能够将功补过,再把你拉回来,就是一个活跃的池子和一个冷却的池子,一个优先级概念,核心要记住,这里面根据属性的优先级来决定谁是备份,谁先干活。如果不指定这三个参数,就根据 sink 的顺序来确定排在前面的先执行,排在后面的后执行。
三、演示
打开参考资料,在资料下面有一个叫做 failover,这里还是以 node-1、node-2、node-3,三台机器来做一个演示,这里面涉及两级。
把这个配置来修改一下,事实上看到这里,可以发现容错跟负载均衡,基本上核心配置差不多,需要改的就是里面的 type,一个叫做 load_banlance,一个叫做failover,接下来做一个相关的修改。
首先来到第一台机器,为了方便,把之前的配置删除掉,接下来使用V编辑器重新编辑一下,把名字复制一下,然后做一个粘贴,接下来把里面的核心配置复制过来。
接下来看一下第二级和第三级跟之前容的一样,,也是接收端口,接收数据绑定即可,把数据打印在屏幕终端上。这一块跟之前一样,这里就不再进行配置了,可以直接使用之前的配置。cd 到 conf 当中做一个查看,可以发现已经配置好了。
启动完成,配置完成之后,接下来就做一个集群的启动,从远离数据的第二节开始启动,复制启动命令,首先来到 node-3,回车,接下来回到 node-2 中,cd.. 也给它做一个启动,启动完之后,接下来到第一级当中,把第一级也启动一下,把第一级的启动命令复制过来,启动完成之后,可以发现2和3两台机器报信息了,说成功的连接上,说明整个串联的架构体系对接完成。接下来去模拟数据的产生,它用来追踪的数据是叫做 456.log,因此接下来可以用循环来写一下,睡0.5秒钟,睡得稍微慢点。
可以发现当执行 shell 命令的时候,文件就会有数据产生,一旦有数据产生,第一台机器就会去采集到数据,接下来可以发现第二台机器开始打印数据了,但第三台机器依然没有任何信息,因为它是一个备份,现在处理数据的全是第二台机器,通过当中的参数,可以确认一下 k1 的权重是10,那么它所代表的机器就是 node-2,node-3 将会存在备份一直在这里,除非 node-2 出现故障。
接下来看一下怎样实现故障转移和容错能力,手动结束一下进程,结束完发现一旦结束,这里立马报了错,说连接失败。
但 node-2 连接不上,第三台的机器依然可以连接,依然可以接受数据,这样就容忍了一次错误的发生或者说发生了一次错误的转移,把第二台机器的故障转移走,第三台接着替它继续干活,保证了业务的稳定性,这就是 failover 的实现。
这时候如果把第三台机器再关掉,就不能再容错了。所以这里会有一个冲突,设置的备份越多,容错能力越强,但是浪费资源越严重。如果第二台机器永远不出故障,后面的机器永远白白地浪费了。
这就是在 failover 在 flume 中的实现,它所解决的就是单点故障问题,一个人容易出现问题,多个人一起来备份的解决,只有当第一个挂掉第二个顶上,第二个挂掉,第三个顶上,要弄清对比理解一下负载均衡跟容错之间的差别。