集群中有四个节点。假定它们是启用了节点A,B,C,D的提示切换。
1)创建一个RF = 2的键空间,并创建一个表。
2)关闭节点B,关闭C(nodetool stopdaemon),
3)用cqlsh登录到节点A,设置CONANYTENCY ANY,插入一行(假设该行将存储在节点B和C中)。即使节点B,C发生故障,该行也已成功插入,因为一致性级别为ANY。协调器(节点A)写了一些提示。
4)关闭节点A(nodetool stopdaemon),然后删除节点A(nodetool removenode $ {nodeA_hostId})
5)使节点B,C回来(nodetool启动)
6)登录B,C,D的任何节点,并使用插入行的分区键执行select语句。但是在步骤3中没有任何数据插入行。
这些步骤导致数据(在第3步插入行)丢失。
我上面执行的步骤是否有问题?
如果是,该如何处理?
期待您的回复,谢谢。
答案 0 :(得分:1)
CONSISTENCY.ANY
将在许多情况下导致数据丢失。它可以像北极熊一样简单,只要将写操作确认到客户端就将服务器从墙上撕掉(甚至还没有应用于单个提交日志)。这适用于与durable_writes=false
相同的写入,其中客户端的延迟比实际存储数据更重要。
如果要确保没有数据丢失,请确保RF至少为3并使用仲裁,那么您对任何写入的确认都将使您确信将在单节点故障中幸免于难。 RF = 2可以使用仲裁,但这相当于CL.ALL,这意味着任何节点故障,gc或打cup都会导致可用性降低。
重要的是,提示与保证传递无关,这可能会减少数据不一致时的收敛时间。为了防止数据丢失,仍必须在gc_grace_seconds内进行维修。如果您使用的是弱一致性,持久性和低复制,那么您很容易遭受数据丢失的困扰。
答案 1 :(得分:-1)
因为removenode不会流将要删除的节点中的数据。它告诉集群我要离开集群并平衡现有集群。 请参阅https://docs.datastax.com/en/cassandra/3.0/cassandra/tools/toolsRemoveNode.html