群集中有四个节点。假设它们是节点a、b、c、d。已启用暗示切换。
1) 创建一个rf=2的键空间,并创建一个表。
2) 关闭节点b、c(nodetool stopdemon),
3) 使用cqlsh登录节点a,设置一致性any,插入一行(假设该行将存储在节点b和c中)。即使节点b、c已关闭,该行也已成功插入,因为一致性级别为any。协调器(节点a)编写了提示。
4) 关闭节点a(nodetool stopdemon),然后删除节点a(nodetool removenode${nodea\u hostid})
5) 使节点b、c返回(nodetool start)
6) 登录b,c,d的任意节点。并使用插入行的分区键执行select语句。但在第3步中没有任何数据插入行。
这些步骤导致数据(在步骤3中被插入行)丢失。
我执行的上述步骤有问题吗?
如果是,如何处理这种情况
期待您的回复,谢谢。
2条答案
按热度按时间li9yvcax1#
因为removenode不会从将要删除的节点流式传输数据。它告诉集群我要离开集群并平衡现有集群。请参考https://docs.datastax.com/en/cassandra/3.0/cassandra/tools/toolsremovenode.html
h4cxqtbf2#
CONSISTENCY.ANY
在许多情况下会导致数据丢失。它可以很简单,就像北极熊在客户端确认写操作后就把服务器从墙上撕下来一样(甚至还没有应用到一个commitlog)。这适用于等同于正常的写入durable_writes=false
客户机中的延迟比实际存储数据更重要。如果您想确保没有数据丢失,rf至少为3,并且使用quorum,那么您得到的任何写操作都将是ack,因为您可以确信它将在单节点故障下生存。rf=2可以与quorum一起工作,但这相当于cl。这意味着任何节点故障、gc或hiccup都将导致可用性损失。
重要的是要认识到,提示不是关于保证交付,只是可能减少数据变得不一致时的收敛时间。为了防止数据丢失,仍然需要在gc\u grace\u秒内进行修复。如果您使用的是弱一致性、持久性和低复制,则会导致数据丢失。