为什么可以';t cassandra在没有节点丢失的情况下仍能存活,而不会丢失数据。复制因子为2

为什么可以';t cassandra在没有节点丢失的情况下仍能存活,而不会丢失数据。复制因子为2,cassandra,replication,consistency,cassandra-3.0,eventual-consistency,Cassandra,Replication,Consistency,Cassandra 3.0,Eventual Consistency,嗨,我正在使用该站点尝试不同的配置 但我无法理解以下显示的配置结果 Cluster size 3 Replication Factor 2 Write Level 1 Read Level 1 您可以在没有节点丢失的情况下生存,而不会丢失数据 作为参考,我看到了这个问题 但这仍然无助于理解为什么写入级别1会与复制2一起使我的cassandra群集在没有节点而没有数据丢失的情况下无法生存 写入请求将发送到所有副本节点,即使1作出响应,也是成功的,因此假设1个节点关闭,所有写入请求将发

嗨,我正在使用该站点尝试不同的配置

但我无法理解以下显示的配置结果

Cluster size  3
Replication Factor  2
Write Level 1   
Read Level 1
您可以在没有节点丢失的情况下生存,而不会丢失数据

作为参考,我看到了这个问题

但这仍然无助于理解为什么写入级别1会与复制2一起使我的cassandra群集在没有节点而没有数据丢失的情况下无法生存

写入请求将发送到所有副本节点,即使1作出响应,也是成功的,因此假设1个节点关闭,所有写入请求将发送到另一个副本节点并返回成功。它最终将是一致的


有人能举个例子来帮助我理解吗。

当你读或写数据时,Cassandra会计算数据的哈希标记并分发到相应的节点。如果有复制因子为2的3节点群集,则表示数据存储在2个节点中。因此,当2个节点发生故障时,负责令牌a的节点不属于节点3,并且该令牌不是节点3的一部分,最终即使只有一个节点,您仍然会有TokenRangeOfflineException


关键是我们需要的是副本(令牌),而不是节点。另请参见所回答的类似问题。

我猜计算器正在处理的是最坏的情况

如果您的数据在三个节点中的两个节点上冗余可用,那么您可以在丢失一个节点的情况下生存下来。写入级别1的问题是,不能保证数据在确认写入后立即出现在两个节点上


假设写入的协调器是保存正在写入的记录副本的节点之一。对于写入级别1,您告诉集群在写入提交到应该保存数据的两个节点之一时立即确认写入。协调器甚至可能在尝试联系其他节点(以提高客户端感知到的延迟)之前就这样做了。如果在那一刻,在确认写操作之后,但在尝试联系第二个节点之前,协调器节点发生故障并且无法恢复,则您丢失了该写操作及其数据。

这种情况是因为写入级别为1。如果您的应用程序只在1个节点上写入数据(并等待数据最终一致/同步,这将花费非零时间),那么如果在同步发生之前丢失一台服务器本身,数据可能会丢失

,因此我的问题是,“您可以在没有数据丢失的情况下生存”这句话正确吗,在上述场景中,我可以在丢失1个数据节点的情况下生存。这取决于当时的哈希令牌,如果您的哈希令牌在幸存节点中可用,那么它将成功,否则它将失败。复制因子是否会使至少1个节点具有该哈希令牌?我是不是错过了什么。我相信一个写入请求会发送到一个协调器节点,协调器节点总是将其发送到所有副本节点,即使有一个节点关闭,我仍然可以成功写入,因此我相信我可以在丢失一个节点的情况下存活下来,而不会丢失数据。Cassandra集群中的每个节点都将拥有一个令牌范围,您可以在nodetool环/状态中看到。例如,节点1、2、3分别带有令牌A、B和C。当协调器节点(比如节点1)接收到数据时,会对其进行哈希运算,并计算出令牌(比如B)。因此,协调器节点将尝试写入节点2(拥有令牌B),然后写入节点3(循环顺序)。如果节点2和3(拥有令牌B和C)关闭,则显然负责令牌的节点不可用,因此操作失败。您必须了解令牌计算和节点分配。但是Cassandra始终向所有副本节点发送写请求,而不管一致性级别如何。以下是最坏的情况:1。Cassandra获取写入请求,将其发送到所有副本节点2。成功的写入请求由单个节点(一致性级别1)确认,然后Cassandra确认写入请求。3.另一个复制副本(它也收到了写请求,但没有确认,因为当时它无法写入该数据。(如果您可以检查此复制副本上的任何场景,是否有用?)4.原始节点确认它已停机。我想您知道最坏的情况。现在的问题是,第3点如何发生?我可以想到的一个原因是过载情况(当节点忙于处理其他请求而无法处理少数请求时)。在此情况下,向其发送的写入请求将超时。虽然可能会在协调器节点上保存提示,但最糟糕的情况是,它也会超过“max\u hint\u window\u in\u ms”。您能确认我的理解吗?以下是最坏的情况:1.Cassandra获取写入请求,将其发送到所有副本节点。2.单个节点(一致性级别1)确认写入请求成功,然后Cassandra确认写入请求。3.另一个副本(也收到了写入请求,但没有确认,因为当时不知何故未能写入该数据。4.确认该请求的原始节点出现故障。如果我的理解是正确的,您能否帮助我定义案例3的场景correct@Hiteshdua1,我更新了我的答案,使之更加具体,并考虑了协调员。这是c正确-计算器正在处理最坏情况,拉尔夫的解释是正确的。