2017-05-30 22 views
2

我们有一个RF = 2的3节点Cassandra集群。读写一致性设置为1。我们也使用Vnodes。可以将这些节点标记为N1,N2和N3。假设N3下降。我的印象是,无论节点何时关闭,其他节点都会存储提示,并且每当N3出现时,提示就会发送到N3,从而确保数据在副本之间保持一致。但是,当我浏览文档时,我遇到了参数max_hint_window_in_ms,默认为3小时。所以,如果一个节点死了超过3个小时,它被认为是永久死亡,并且没有提示被存储。到现在为止还挺好。理解Cassandra中的指示性切换和数据复制

所以,我现在的理解是,如果一个节点停下来说了10个小时,那么前3个小时的提示会在它返回时转移到这个节点,但是这个7小时的写入会对于这个节点会丢失。此外,如果为特定的令牌范围启动读取查询,并且由于此节点也可以为读取令牌范围的请求提供服务,它将返回空值而不是存储在某个其他节点中的实际数据。我的理解是否正确?那么,应该做什么?

+0

这是被测试和行为是意想不到的?或者,如果情景发生,您是否在寻找预期的行为?由于您的一致性级别设置为“1”,因此所有读取/写入都应成功(假设吞吐量不大)。 – daniel

+0

我想评估一下,如果我的某个节点发生故障超过3小时(默认值为max_hint_window_in_ms),那么行为将会是什么。 – Ankush92

回答

2

那么应该做什么?

该文档指出,当您将向下节点(N3)带回时,您必须对其运行修复。

尽管如此,在我们的大多数群集中,我发现简单地移除节点(当它停止时)会更容易,然后将其重新引导到群集中。这通常比计算Merkle树和修复数据流更快。但是,如果每个节点没有大量数据(比如小于20GB),那么运行修复应该不会太痛苦。

+0

我想你是对的。我们每个节点的数据量大约为100 gb,每天增长约5-10 gb。修理相当痛苦。必须让他们过夜。但是由于暗示的切换是修复过程的一部分,并且它们仅保留3小时(默认值),即使在维修之后,我们是否仍然会在3小时后丢失数据? – Ankush92

+1

@ Ankush92不,您的RF = 2确保至少会有一个副本被写入。修复/引导时,目标节点将使用该副本向其传输数据。 – Aaron