使用具有N个节点的分区数据库。假设W是需要锁定要写入的节点数的节点数,R是为了读取它们而需要锁定的节点数。
在哪些情况下,建议采用策略W = 1& R = N +在哪种情况下我应该使用W = N& R = 1?在这种情况下,我不应该使用W = 1& R = 1。
据我所知 - W = N& R = 1是一致的写作。
答案 0 :(得分:1)
首先,了解W and R speak about replicas(也称为副本)非常重要 - 不是节点。例如,您的群集可能有5个节点,N = 3。这意味着只有三个节点将拥有特定密钥的副本。
其次,Riak没有锁定。通过更改R / W,您可以控制客户的成功。假设你在N = 3时写入W = 3的密钥,并且失败。这并不意味着没有写入任何内容,并且所有后续读取都将看到旧值。仍有可能更新了一个或两个副本。由客户决定如何处理这样的故障,但通常是重试。在任何情况下,如果至少有一个副本成功,新值将最终传播到所有副本(如果没有被更新的副本替换)。
如果在上面的示例中您使用R = 1或R = 2读取,您可能会看到新值或旧值,具体取决于到目前为止已更新的副本数量,以及您首先击中的副本(显然,R = 2给出更好的机会,看到新的值,并且读取修复将启动)。当R = 3时,每个人都保证看到相同的值 - 旧的(0次成功写入)或新的(至少一次成功写入)。如果至少有一个副本不可用,则读取也可能失败,但至少客户端可以确定它没有看到过时的值。
权衡是延迟。在W / R = 1的情况下,客户端不必等待多次写入/读取的结果。你付出了一致性和可靠性。
因此,如果您想要快速写入,请使用W = 1,但不要介意丢失写入(Riak报告成功,但节点在此之后就会失败)。如果您想要快速读取并且不介意获取陈旧值或“未找到”,请使用R = 1.
我还要补充一点,了解Riak中的slopy vs strict quorum 非常重要。