我理解的是read_repair_chance是在所有副本上触发ReadRepair的概率机会。如果发现不一致,则最新更新将用于修复数据。
ReadRepairs对我来说太贵了,因为我的大多数读取CL都是ONE。 所以我选择read_repair_chance = 0和dclocal_read_repair_chance = 0。
但有时我使用QUORUM而不是ONE。当两个副本响应时,达到了读取QUORUM,但两个记录可能不同。 Cassandra返回具有最新时间戳的那个。它是否试图修复另一个?
答案 0 :(得分:2)
我不清楚'想要达到一致性水平'是什么意思。你怎么知道。请分享您正在使用的复制因子和一致性级别。
我会尝试回答我理解的部分。
通过将两个属性更改为“0”,您已禁用自动修复。
如果您希望自动修复功能,请将其保留为默认值或将其设置为适合您的级别。
You may also want to read up on Replication Factor and how it works with consistency level
C *集群中的数据一致性将取决于一致性级别和复制因子(以及其他内容)。如果您有RF = 3并且在CL = 1时写入,则C *仍将使您的数据“最终”保持一致。拨打这些属性以满足您的需求,这样您的读取将返回一致的数据。
如果您在CL = 1时阅读,可能会得到不一致的数据。您可能希望尝试仲裁或本地仲裁,这将导致read_repair_chance启动以修复任何不一致的数据。
答案 1 :(得分:2)
但有时我使用QUORUM而不是ONE。到达时读取QUORUM 两个副本响应,但两个记录可以不同。卡桑德拉 返回具有最新时间戳的那个。它是否试图修复 另一个?
假设我的RF是3并且写入和读取CL是QUORUM。我的意思是说 说'希望CL到达'至少是两个复制品 回答,这是QUORUM。但没有任何证据证明这两个记录是 相同。 Cassandra返回具有最新时间戳的那个。 但我的问题是它是否试图修复其他记录?
答案是肯定的。
即使read_repair_chance = 0和dclocal_read_repair_chance = 0,Cassandra也会尝试修复另一个。
它被称为消化不匹配'。避免读取修复的唯一方法是读取LOCAL_ONE或ONE,否则不会发生消化不匹配。
答案 2 :(得分:0)
我一直在寻找DataStax文档和教程中对您的问题的答案,并且我无法找到具体记录,当一致性高于最新单元格数据时,将完成修复将被退回。
这是最终一致的工具包,所以我假设只有在使用nodetool修复运行修复时才会进行修复,如果使用默认的gc_grace_seconds或使用read_repair_chance,建议每周修复一次。
不要忘记,即使写入CL为1,也会对所有副本节点进行写入,只要您在写入后不立即执行读取,您应该获得正确的数据。时间,如果您正在进行写操作,那么立即读取您有反模式,将数据保留在您的应用程序中以减少读写操作。