在Cassandra中启用读取修复有多重要?

在Cassandra中启用读取修复有多重要?,cassandra,Cassandra,如果我理解正确,在写请求时,会将写发送到所有N个副本,并且在收到前W个响应时操作成功。这是正确的吗 如果是的话,再加上暗示的切换,似乎所有副本都将尽快获得所有写入,在这种情况下我们真的必须进行读修复吗 谢谢。每次写入(和读取)都可以更改一致性级别 例如,假设我们有10个节点,复制因子为3 但是,如果我们以任何一致性级别进行写入,当写入调用返回时,最终的3个副本中可能没有一个最初拥有数据。如果我们使用一致性级别1,那么在写入返回之前,最终3个副本中只有一个必须具有数据,因此,如果读取的一致性级别较

如果我理解正确,在写请求时,会将写发送到所有N个副本,并且在收到前W个响应时操作成功。这是正确的吗

如果是的话,再加上暗示的切换,似乎所有副本都将尽快获得所有写入,在这种情况下我们真的必须进行读修复吗


谢谢。

每次写入(和读取)都可以更改一致性级别

例如,假设我们有10个节点,复制因子为3

但是,如果我们以任何一致性级别进行写入,当写入调用返回时,最终的3个副本中可能没有一个最初拥有数据。如果我们使用一致性级别1,那么在写入返回之前,最终3个副本中只有一个必须具有数据,因此,如果读取的一致性级别较低,则在写入之后直接读取可能会看到过时的数据

有关一致性级别的定义,请参见,特别是以下内容:

读取级别1:将返回记录 由第一个复制副本返回到 回应始终需要进行一致性检查 在后台线程中完成以修复任何 一致性问题 使用一致性级别1。这 意味着后续通话将有 即使初始读取失败,也要更正数据 获取较旧的值。(这叫做 重新修复)

另见:

读取修复意味着当查询 根据给定的密钥,我们执行 针对所有副本的摘要查询 ,并按最新的 任何过期副本的版本。 如果使用低稠度级别 指定,则在 返回数据后的背景 从最接近的复制副本到 客户否则,它将在之前完成 返回数据


暗示切换可能由于各种原因而失败。例如,向其写入提示的节点可能会失败。在启用读修复的情况下,如果由于某种原因提示切换不起作用,读修复将修复它。然后,您还应该在节点上运行“nodetool repair”,以捕获读修复和暗示切换都无法修复所有数据的任何情况

查看wiki以了解更多信息


简短的回答:你仍然需要阅读修复

更长的回答是:在任何地方都没有很好地讨论暗示的交接,所以

对于Cassandra 1.0+,请阅读。关键部分是:

乍一看,暗示切换似乎可以让您安全地离开,而无需维修。只有在从未发生过硬件故障的情况下,这才是正确的


但是,如果写入请求已经发送到这些复制副本中的每一个,并且这些机器非常繁忙,以至于在读取时这些请求还没有得到处理,那么如何通过读取修复帮助再次发送相同的写入请求呢?对于节点故障,它们已经通过暗示切换进行了处理,故障节点将在重新启动后立即获得写入。如果写入一致性级别较低,则写入请求不一定已经发送到额外的副本。如果您的写入配置为使用高一致性级别,那么我同意您的看法……但是Cassandra中的读和写都可以使用多种一致性设置。您的意思是,低CL的写入可能不会由代理节点发送到所有N个副本?这是我最初的问题。例如,如果N=10,W=1,写入可能只发送到3个副本?但这不会降低系统的可用性吗?如果3个副本节点全部关闭,但仍有其他副本节点处于运行状态,则写入将不必要地失败。是-我已编辑了我的答案(希望)在这一点上展开。是的,某些设置会降低可用性(但会提高一致性)。有些设置正好相反——这是可调一致性级别的优点。写得好。谢谢你的澄清。