【09笔记】Storm容错

1、架构容错

  1. Zookeeper
    存储Nimbus与Supervisor数据

在Supervisor启动时,Supervisor会主动在Zookeeper上注册相应的信息并建立心跳,Nimbus就会发现信息变化以确定新的Supervisor上线了,Nimbus还可以通过心跳对Supervisor管理和监控。

  1. 节点宕机
    因为Nimbus和Supervisor是快速失败和无状态的,所以当节点出现宕机后,不会影响已经提交的任务,只会影响后续任务的提交。
    1)Nimbus宕机

    Supervisor节点还正常运行对应的worker也是正常工运行,只是Supervisor不能接受Nimbus新任务的分配。

    2)Supervisor宕机

    对应的worker也就挂掉了,但Nimbus节点监控把对应的worker的重新分配到其他的Supervisor节点上运行。

    3)Worker出错

    因拓扑内存溢出或者其它导致Worker 挂掉,Supervisor会重新启动Worker。

2、数据容错

  1. 超时
    Storm会告知用户每一个消息单元是否在一个指定的时间(timeout)内被完全处理,超时后会杀掉该任务释放资源。
  2. ack机制
  • Storm中每一个Topology中都包含有一个acker组件
  • ack本质上是一个或多个task,特殊的task,非常轻量
  • 作用:反馈信息和透传
  • 消息成功执行后会返回ack,所有的节点ack成功,任务才算成功处理
特殊的Task(Acker Bolt)
  • Acker 跟踪每一个spout发出的Tuple树
  • 一个Tuple树完成时,发送消息给Tuple的创造者
  • Acker 的数量默认是1,如果topology里面的Tuple较多,那么把Acker 的数量设置多一点,效率会高一点
缺点:
  • 内存超级大

Acker Task并不显式的跟踪tuple树。 对于那些有成千上万个节点的tuple树,把这么多的tuple信息都跟踪起来会耗费太多的内存。

解决:
  • 内存量是恒定的(20bytes,即用20字节代替了tuple树)
  • 对于100万tuple,也才20M 左右
  • Taskid:ackval
  • Ackval所有创建的tupleid/ack的tuple一起异或

一个acker task存储了一个spout-tuple-id到一对值的一个mapping。这个对子的第一个值是创建这个tuple的taskid, 这个是用来在完成处理tuple的时候发送消息用的。 第二个值是一个64位的数字称作:ack val , ack val是整个tuple树的状态的一个表示,不管这棵树多大。它只是简单地把这棵树上的所有创建的tupleid/ack的tupleid一起异或(XOR)。

异或(xor):

相同为0,不同为1
A:10010 B:01001
A xor B = 11011
A xor A = 0
B xor B = 0
相同两个数据异或结果比是0

对于如下tuple树

  • 一个spout,三个bolt
  • 初始化ark_val=0
  • 每个Tuple都对应有tupleid
  • tupleid的值为val_n
  • 输出和输入都会进行异或
  • 由于输入和输出成对出现,中间不出错的情况下最后结果必为0.
    【09笔记】Storm容错
    【09笔记】Storm容错
出错时:
  • 一个tuple没有ack

解决方法:处理的task挂掉了,超时,重新处理

  • Ack挂掉了

解决方法:

  • 增加多个ack,利用一致性hash
  • 全挂了,超时,重新处理
  • Spout挂掉了

解决方法:重新处理