1

集群中有四个节点。假设它们是节点 A、B、C、D。启用提示切换。

1)创建一个RF=2的keyspace,并创建一个表。

2)使节点B,C关闭(nodetool stopdaemon),

3)用cqlsh登录节点A,设置CONSISTENCY ANY,插入一行(假设该行将存储在节点B和C中)。即使节点 B、C 已关闭,该行也已成功插入,因为一致性级别为 ANY。协调器(节点 A)写了提示。

4)关闭节点A(nodetool stopdaemon),然后删除节点A(nodetool removenode ${nodeA_hostId})

5) 让节点 B、C 回来(nodetool start)

6)登录B、C、D的任意一个节点,使用插入行的分区键执行select语句。但是在第 3 步中没有插入行的任何数据。

这些步骤导致数据(在第 3 步被插入的行)丢失。

我上面执行的步骤有什么问题吗?

如果是,这种情况如何处理?</p>

期待您的回复,谢谢。

4

2 回答 2

1

CONSISTENCY.ANY在许多情况下会导致数据丢失。它可以像北极熊在向客户端确认写入后立即将服务器从墙上撕下一样简单(甚至还没有应用于单个提交日志)。这适用于相当于durable_writes=false客户端延迟比实际存储数据更重要的写入。

如果您想确保没有数据丢失,RF 至少为 3 并使用 quorum,那么您获得 ack 的任何写入都可以确信将在单节点故障后幸免于难。RF=2 可以与仲裁一起工作,但这相当于 CL.ALL,这意味着任何节点故障、gc 或打嗝都会导致可用性损失。

重要的是要认识到提示与保证交付无关,只是可能在数据变得不一致时减少收敛时间。仍然需要在 gc_grace_seconds 内进行修复以防止数据丢失。如果您使用弱一致性、持久性和低复制,那么您将面临数据丢失的风险。

于 2018-12-14T17:33:35.557 回答
-1

因为 removenode 不会从将要删除的节点流式传输数据。它告诉集群我要离开集群并平衡现有集群。请参考https://docs.datastax.com/en/cassandra/3.0/cassandra/tools/toolsRemoveNode.html

于 2018-12-14T04:02:36.500 回答