我们有一个3节点的Cassandra集群,RF = 2.读写一致性设置为ONE。我们也在使用Vnodes。让我们将这些节点标记为N1,N2和N3。让我们说N3下降了。我的印象是,每当节点发生故障时,其他节点都会存储提示,每当N3出现时,提示将被发送到N3,从而确保数据在副本之间保持一致。但是,当我浏览文档时,我遇到了参数max_hint_window_in_ms
,默认为3小时。因此,如果一个节点已经死了超过3个小时,它将被视为永久死亡并且不会存储任何提示。到目前为止,非常好。
所以,我现在的理解是,如果一个节点停机了10个小时,那么前3个小时的提示会在它恢复时转移到这个节点,但这7小时的写入时间是丢失了这个节点。此外,如果针对特定标记范围触发了读取查询,并且由于此节点也可以为令牌范围的读取请求提供服务,它将返回null而不是存储在某个其他节点中的实际数据。我的理解是否正确?那么,应该做什么?
答案 0 :(得分:2)
那么应该做什么?
文档说明当你将关闭节点(N3)带回来时,你必须对其进行修复。
老实说,在我们的大多数集群中,我发现简单地删除节点(当它关闭时)然后重新引导到集群中会更容易。这通常比Merkle树的计算和修复数据流更快。但是,如果每个节点没有大量数据(比如少于20GB),那么运行修复不应该太痛苦。