如果我理解正确,则在写入请求时,写入被发送到所有N个副本,并且当接收到第一个W响应时操作成功。这是对的吗?
如果是,那么结合Hinted Handoff,似乎所有副本都会尽快得到所有写入,在这种情况下我们真的必须进行读取修复吗?
感谢。
答案 0 :(得分:9)
简短的回答:你仍然需要阅读修复。
更长的答案:在任何地方都没有对Hinted Handoff进行过很好的讨论,所以I wrote one。
对于Cassandra 1.0+,请阅读the updated article。关键部分是:
乍一看,Hinted Handoff可能会让您在不需要修理的情况下安全离开。只有在您从未遇到硬件故障时才会出现这种情况。
答案 1 :(得分:2)
由于各种原因,提示切换可能会失败。例如,提示被写入的节点可能会失败。启用读取修复如果由于某种原因提示切换不起作用,则修复将修复它。然后你还应该在节点上运行“nodetool repair”来捕获任何读取修复和暗示切换都无法修复所有数据的情况。
查看维基以获取更多信息。
答案 2 :(得分:1)
每次写入(和读取)的一致性级别可以变化。
例如,假设我们有10个节点,复制因子为3.
但是如果我们使用ANY的一致性级别进行编写,则当写入调用返回时,最终的3个副本都不会初始化数据。如果我们使用一致性级别ONE,那么在写入返回之前只有一个最终的3个副本必须具有数据,因此在写入之后直接读取可能会看到过时的数据如果读取具有低一致性水平。
有关一致性级别的定义,请参阅http://wiki.apache.org/cassandra/API,特别是以下内容:
阅读第一级:将返回记录 由第一个副本返回 响应。始终进行一致性检查 在后台线程中完成修复任何 一致性问题 使用ConsistencyLevel.ONE。这个 意味着后续的电话会有 即使初始读取也能正确识别数据 获得较旧的价值。 (这就是所谓的 ReadRepair)
另见http://wiki.apache.org/cassandra/ReadRepair:
读取修复意味着查询时 针对给定的密钥,我们执行一个 摘要查询所有副本 关键和推动最近的 版本到任何过时的副本。 如果ConsistencyLevel很低 指定,这是在 返回数据后的背景 从最近的复制品到 客户;否则,它是在之前完成的 返回数据。