理解Hinted Handoff

Hinted Handoff在读Dynamo论文的时候,对这个名字就不是很理解。现在要深入了解Cassandra,想要翻译这个词,在网上找了一下,大概两种翻 译:

1)提示移交;

2)永远可写入。

我比较倾向于第一个翻译,因为对于Cassandra,永远可写入并不总是成立的。不过,作为专有的名词出现,我在下 文就不进行翻译了。

【正文开始】

Hinted Handoff作为写操作的可选的一部分,主要目的是当不要求一致性的时候,提高写的高可用性。

其次,Hinted Handoff缩短了暂时失败的节点恢复一致的时间。尤其是在一些奇怪的网络问题下,更加有用。(网络短时间不可用之类)

Hinted Handoff并不是修复机制的代替品。

具体机制

当需要向一个已知宕机的节点写入数据的时候,Cassandra会将数据作为提示数据写入另一个正常的复本节点。稍后会对恢复的宕机节点进行数据重放。如果所有的复本节点都不能访问,则将提示数据写入到协调者本地。(能够理解提示的含义么) 当一个节点,通过Gossip发现它所存储的提示数据的所属节点恢复正常,他就会将提示数据发送到其所属目标节点。

Hinted Handoff和一致性级别

当 一致性等级设定为ONE,QUORUM,或者ALL的时候,提示的写并不参与到一致性级别的计数中。如果没有足够的节点满足写的一致性级别需要,会抛出 UnavailableException而不是触发Hinted Handoff。(这是Casssandra和Dynamo复制模型不一样的地方之一)

举例,一个集群有两个节点:A和B,并且设定复制份数(RF)为1:每行数据至存储在一个节点之上。

假设,当我们以ConsistencyLevel.ONE写入一行数据K到节点A的时候,节点A宕机了,那么写必将失败。回想一致性级别的约定,当W+R>RF的时候,读总是读到最近写得数据。

如果此时,我们将提示数据写入节点B,由于确实数据写入了,所以写操作成功了。但是这违背了一致性级别的约定,因为直到节点A恢复,节点B向节点A发送了提示数据之前,无论采用什么样的一致性级别都是无法读取数据的。

极端的写可用性

为了能够满足即使在所有正常的复本节点都宕机的情况下仍能写入的需求,Cassandra提供了一个特殊的一致性等 级:ConsistencyLevel.ANY。ConsistencyLevel.ANY保证了写的可靠性,而且,只要有一个复本节点恢复正常,并且接 受到了提示数据,就可以提供读。

性能

Cassandra的Hinted Handoff的设计是为了最小化集群的负载,从而避免了级联失败。

【未完待续】

posted on 2012-07-09 22:35  sing1ee  阅读(2690)  评论(0编辑  收藏  举报