如何在故障转移期间恢复螺栓状态

时间:2013-11-25 10:21:45

标签: apache-storm

我试图弄清楚如何在故障转移期间恢复风暴螺栓状态。我可以在外部(DB或文件系统)保持状态,但是一旦重新启动bolt实例,我需要指向该bolt实例的特定状态来恢复它。 螺栓的准备方法接收上下文,记录在此http://nathanmarz.github.io/storm/doc/backtype/storm/task/TopologyContext.html

我不清楚的是 - 是否有任何一个这样的上下文唯一标识特定的bolt实例,以便我可以理解指向哪个持久状态?故障转移期间是否保留了该ID?或者,是否可以为故障转移期间保留的特定bolt / instance设置任何变量/对象?任何帮助表示赞赏!

BR SIB

P.S。 stackoverflow的新功能所以请耐心等待......

4 个答案:

答案 0 :(得分:0)

你可以寻找Trident它基本上是一个建立在风暴之上的抽象。文档说

  

Trident拥有一流的抽象,可以阅读和写入有状态的资源。状态可以是拓扑的内部 - 例如,保存在内存中并由HDFS支持 - 或者外部存储在数据库中,如Memcached或Cassandra

如果发生任何故障转移,请说

  

Trident以容错的方式管理状态,以便状态更新在重试和失败时是幂等的。

您可以查看文档以获得进一步的说明。

答案 1 :(得分:0)

答案 2 :(得分:0)

在原始风暴中,spoutbolt都是无国籍的。 Storm可以设法重启节点,但需要一些努力来恢复节点的状态。我能想到两种解决方案:

  1. 如果消息无法处理,Storm将从拓扑的 ROOT 重播,并且replay的逻辑必须由用户实现。因此,在这种情况下,我想在消息中添加更多状态信息(例如,某些外部状态存储的ID和此任务的ID)。
  2. 或者您可以使用Trident。它可以为每个事务提供txid并简化存储过程。
  3. 我可以使用第一个解决方案,因为我的应用程序不需要事务操作,而且我对原始Storm有了更好的理解(Storm会生成比Trident更简单的日志)。

答案 3 :(得分:0)

您可以使用task ID

  

任务ID在拓扑创建时分配,并且是静态的。如果任务死亡/重新启动或在其他地方重新分配,它仍将具有相同的ID。