我从Riak开始,到目前为止一切都很顺利。我现在不关心性能,因为我主要将它用作备份存储。我已经阅读了所有可以找到的文档(littleriakbook.com很好地解释了这些概念)但我似乎还没有掌握一些部分。
情况是我目前只能使用3个物理节点/服务器(而不是建议的5个)。我希望所有数据都复制到所有三个节点。基本上,如果最多2个节点发生故障,我仍然希望能够读取和写入剩余的节点。如果节点再次出现,它们应该再次同步。
我已经完成了所有工作并且riak-admin diag告诉我并非所有数据都满足n_val要求。如何确保所有三个节点(最终)都是相同的副本?是否有可能触发不符合要求的数据的重新分配?
答案 0 :(得分:2)
只有3个节点,不可能满足n_val要求,并确保任何对象存储的三个副本始终位于不同的节点上。原因在于Riak如何分发复制品。
存储或检索对象时,Riak将根据存储桶和密钥计算哈希值,并将此值映射到the ring上的特定分区。确定此分区后,其他N-1个副本将始终放在以下N-1个分区上。如果我们假设我们的环大小为64并将这些分区命名为1-64,那么散列到分区10并且属于n_val设置为3的存储桶的对象也将存储在分区11和12中。
对于3个节点,您经常会看到分区在物理节点之间交替展开。这意味着对于大多数分区,副本将位于不同的物理节点上。对于环的最后2个分区,在我们的情况下为63和64,但是存储将需要环绕到分区1和2上。由于64不能均匀地除以3,因此散列到这些最后分区中的对象将仅存储在2个不同的物理节点上。
当节点在Riak中出现故障或变得不可用时,其余节点将暂时负责属于丢失节点的分区。这些被称为fallback partitions,最初将为空。在更新或插入数据时,这些分区将跟踪它并在其可用后将其交还给拥有节点。如果启用了Active Anti-Entropy,它将随着时间的推移将后备分区与后台中的其他分区同步。