Riak 节点的复制属性

Replication Properties of Riak nodes

具有 N 个节点的分区数据库。假设 W 是节点数,其中需要锁定才能写入的节点数,R 是需要锁定才能读取它们的节点数。

在哪些情况下,建议应用策略W=1 & R=N?在什么情况下我应该使用 W=N & R=1?同样在哪些情况下我不应该使用 W=1 & R=1。

据我所知 - W=N & R=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 次成功写入)或新值(至少 1 次成功写入)。如果至少有一个副本不可用,读取也可能会失败,但至少客户端可以确定它没有看到过时的值。

权衡是延迟。使用 W/R=1,客户端不必等待多个 write/read 的结果。不过,您付出的是一致性和可靠性。

因此,如果您想要快速写入,请使用 W=1,但不要介意丢失写入(Riak 报告成功,但此后节点立即失败)。如果您想要快速读取并且不介意获得过时值或 "not found".

,请使用 R=1

我还要补充一点,理解 Riak 中的 slopy vs strict quorum 很重要。