Cassandra是否会丢弃失败的写入记录或在读取修复期间传播它?

Cassandra是否会丢弃失败的写入记录或在读取修复期间传播它?,cassandra,Cassandra,假设我有一个复制因子为2的2节点集群 以一致性2启动写入 一个节点完成写入,另一个节点在完成写入之前失败 客户端收到失败的响应,因为无法满足一致性级别 另一个客户端以一致性2读取同一行 一个节点具有最新数据(失败记录),另一个节点具有旧数据,因此启动读取修复 问题1。在读修复过程中,Cassandra是否会丢弃失败的写入,即使它具有最新的时间戳,还是会传播上面步骤2中失败写入期间写入的值,因为它是具有最新时间戳的值 问题2。如果我们将步骤1到3替换为一致性为1的写入并成功写入,那么读取修复期间的

假设我有一个复制因子为2的2节点集群

  • 以一致性2启动写入
  • 一个节点完成写入,另一个节点在完成写入之前失败
  • 客户端收到失败的响应,因为无法满足一致性级别
  • 另一个客户端以一致性2读取同一行
  • 一个节点具有最新数据(失败记录),另一个节点具有旧数据,因此启动读取修复

  • 问题1。在读修复过程中,Cassandra是否会丢弃失败的写入,即使它具有最新的时间戳,还是会传播上面步骤2中失败写入期间写入的值,因为它是具有最新时间戳的值

    问题2。如果我们将步骤1到3替换为一致性为1的写入并成功写入,那么读取修复期间的结果是什么?读修复如何将其与部分失败的写入区分开来

    以下文本来自数据税务文档

    例如,如果使用复制因子为3的写入一致性仲裁级别,则数据库会将写入复制到群集中的所有节点,并等待来自两个节点的确认。如果写入在一个节点上失败,但在另一个节点上成功,则Cassandra报告在该节点上复制写入失败,但在另一个节点上成功的复制写入不会自动回滚

    Cassandra使用客户端时间戳来确定列的最新更新。请求数据时,最新的时间戳总是获胜的,因此如果多个客户端会话同时更新一行中的相同列,则最近的更新就是读卡器看到的更新

    Q1.在读修复过程中,Cassandra会放弃失败的写入,即使它具有最新的时间戳,还是会传播上面步骤2中失败写入过程中写入的值,因为它是具有最新时间戳的值

    答:尽管写入失败,因为未满足对节点成功写入的所需数量,但存储在成功写入的节点中的最新值仍将保持不变,且不会回滚。当其他节点联机时,将启动读取修复,并使用新数据更新节点

    “问题2.如果我们用一致性为1的写入和成功写入替换步骤1至3,则读修复期间的结果是什么?读修复如何将其与部分失败的写入区分开来?”

    答:如果写入一致性为1,并且一个节点成功地更新了数据,则认为写入成功。当另一个节点联机时,将启动读取修复,并在故障节点中添加/更新值。只要有2个节点处于活动状态,读取就会成功,如果数据不匹配,将接收最新数据,并使用数据更新另一个节点

    您可以看看这个问题。在读修复期间,Cassandra会放弃失败的写入,即使它具有最新的时间戳,还是会传播上面步骤2中失败写入期间写入的值,因为它是具有最新时间戳的值

    答:尽管写入失败,因为未满足对节点成功写入的所需数量,但存储在成功写入的节点中的最新值仍将保持不变,且不会回滚。当其他节点联机时,将启动读取修复,并使用新数据更新节点

    “问题2.如果我们用一致性为1的写入和成功写入替换步骤1至3,则读修复期间的结果是什么?读修复如何将其与部分失败的写入区分开来?”

    答:如果写入一致性为1,并且一个节点成功地更新了数据,则认为写入成功。当另一个节点联机时,将启动读取修复,并在故障节点中添加/更新值。只要有2个节点处于活动状态,读取就会成功,如果数据不匹配,将接收最新数据,并使用数据更新另一个节点


    你可以看看这个

    谢谢。所以Cassandra甚至没有在部分写入失败的情况下提供最终的一致性?(如果是最终一致的失败写入,至少在它告诉客户端写入失败后一段时间应该被丢弃)是的,按照惯例,当我们收到失败写入时,这意味着写入根本没有通过,但根据Cassandra的说法,失败写入意味着它无法保证写入成功。应用程序可以对失败的写入进行重试,直到成功。cassandra说,它最终具有一致性,因为有时我们读取数据时,可能会得到旧数据。这是写/读速度和一致性之间的折衷。这可以根据应用程序的需要进行调整。我同意,当客户端读取的数据可能会过时一段时间,但最终会得到纠正时,这是最终的一致性,大多数情况下都是如此。然而,在这种情况下,永远是错误的数据。是的,写操作就是这样。我们需要在应用程序中处理这个问题。失败的写入消息具有误导性,并导致数据不一致。也许在未来的版本中,卡桑德拉可以处理这个问题。但现在我们必须明确处理。谢谢。所以Cassandra甚至没有在部分写入失败的情况下提供最终的一致性?(如果是最终一致的失败写入,至少在它告诉客户端写入失败后一段时间应该被丢弃)是的,按照惯例,当我们收到失败写入时,这意味着写入根本没有通过,但根据Cassandra的说法,失败写入意味着它无法保证写入成功。应用程序可以对失败的写入进行重试,直到成功。cassandra说,它最终具有一致性,因为有时我们读取数据时,可能会得到旧数据。这是写/读速度和一致性之间的折衷。这可以根据应用程序的需要进行调整