集群中有四个节点。假设它们是节点A、B、C、D。启用了提示切换。
1( 创建RF=2的密钥空间,并创建一个表。
2( 使节点B、C关闭(nodetool停止守护进程(、
3( 使用cqlsh登录节点A,设置CONSISTENCY ANY,插入一行(假设该行将存储在节点B和C中(。即使节点B、C已关闭,该行也已成功插入,因为一致性级别为ANY。协调器(节点A(编写提示。
4( 关闭节点A(nodetool stopdemon(,然后删除节点A(nodetool removenode${nodeA_hostId}(
5( 使节点B、C返回(节点工具启动(
6( 登录B、C、D的任意节点,使用插入行的分区键执行select语句。但是在步骤3中没有任何插入行的数据。
这些步骤导致数据(在第3步插入行(丢失。
我上面执行的步骤有问题吗?
如果是,如何处理这种情况
期待你的回复,谢谢。
CONSISTENCY.ANY
在许多情况下都会导致数据丢失。它可以像北极熊在向客户端确认写入后立即从墙上撕下服务器一样简单(甚至还没有应用于单个commitlog(。这适用于等同于可以使用durable_writes=false
的写入,其中客户端中的延迟比实际存储数据更重要。
如果你想确保没有数据丢失,RF至少为3,并使用quorum,那么你得到的任何写操作都会在单节点故障后幸存下来。RF=2可以使用quorum,但这相当于CL.ALL,这意味着任何节点故障、gc或打嗝都将导致可用性损失。
重要的是要认识到,提示并不是关于保证交付的,只是可能在数据不一致时缩短收敛时间。为了防止数据丢失,仍然需要在gc_grace_conds中进行修复。如果您使用的是弱一致性、持久性和低复制,则会导致数据丢失。
因为removenode不会从将要删除的节点流式传输数据。它告诉集群我要离开集群并平衡现有集群。请参阅https://docs.datastax.com/en/cassandra/3.0/cassandra/tools/toolsRemoveNode.html