Storm的数据可靠性(理论)
.note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB","STHeiti","Microsoft YaHei","WenQuanYi Micro Hei",SimSun,Song,sans-serif;}
.note-content h2 {line-height: 1.6; color: #0AA89E;}
.note-content {background: #FFFFFF;}
.note-content h1 {color: #7AB3A7;}
.note-content h3 {color: #147A67;}
Storm的数据可靠性(理论)
我们都知道,分布式计算系统一般都管理着许多的机器。我们假设,现在有1000台机器的集群,假设每天每台机器出故障的几率只有1/1000,也就是说三年出一次故障,那么我们来算算每天至少有一台机器出故障的概率是多少?
也就是说,即使平均每台机器三年才出一次故障,这么对于1000台机器的集群,每天也会有一半以上的概率机器会挂掉。
所以说,分布式计算里面经常需要考虑任何的机器(Worker)挂掉,数据依然能够正常处理
故障处理
○ Nimbus故障,换台机器重启即可
○ Supervisor挂掉,迁移其上Worker即可
○ Worker挂掉,迁移走数据能正确处理吗?也就是说,如果Storm把所有数据发到Worker上面计算,它又是如何保证这些数据正确的恢复?如何保证这些数据不被重复计算?
Storm是使用一种叫做源端重放的方法来保证其可靠性的。
也就是说,Worker在运行其间有些什么原因导致数据丢失或者处理超时,这个时候Storm会通过一种叫Acker的机制来计算出这个错误是由源端的哪个tuple产生的,然后通知产生tuple的那个spout”这个tuple处理失败了,重发一下”,这个时候就会重发一个tuple使得下游能处理完
Spout数据保障
- 不丢:Acker机制保证数据如果未成个处理,可以及时发现,并通知Spout重发
- 不重:使用msgID去重
Spout容错
- NextTuple中,emit时,指定msgID
1._collector.emit(new Values(sentence),1111);//1111为msgID
- 如果哪个tuple处理超时了,那么fail就会被调用
1.@Override2.public void fail(Object id){3.}
返回一个msgID,这样就知道哪一个tuple fail了,重发哪个tuple
Bolt容错
- emit时,锚定输入Tuple
- ack输入tuple
Trident API
- 为用户屏蔽掉一些状态与计算一致的细节
- 使用户更方便书写可容错的作业