我已经在沙箱中创建了3节点Riak-CS集群,创建了存储桶,上传了一些文件,并且它们在节点之间进行了复制(我希望智能算法将文件主要放在物理上不同的节点上的分区中)。 v_node = 2,默认情况下为其他副本配置。
现在我尝试三个节点中的一个失败时的情况。我刚刚在一个节点上停止了riak和riak-cs服务,并从其余节点获取了这些服务:
s3cmd la s3://
ERROR: S3 error: 403 (InvalidAccessKeyId): The AWS Access Key Id you provided does not exist in our records.
假设一个节点发生故障,群集仍可运行,不是吗?
此外,我尝试将失败的节点标记为Down
,以确保群集状态收敛,但这并没有帮助。
答案 0 :(得分:2)
如果您已将n_val设置为2,则每个键只有2个副本。当您关闭一个节点时,其中一小部分(大约50%)密钥的副本将变为不可用。
查看get_user_with_pbc function的来源,首先尝试使用strong_get_user_with_pbc function
获取用户记录的强大选项是{pr,all}, {r,all}, {notfound_ok,false}
。 PR = all表示get请求将提前失败,除非两个主要vnode都可用。如果您的某个副本不可用,则会因预期pr_val_unsatisfied
而失败。
如果强选项失败,则使用弱选项{r, quorum}, {pr, one}, {notfound_ok,false}
重试weak_get_user_with_pbc function。仲裁意味着(n_val/2 + 1)
,在这种情况下为2.
因此,这仍然需要一个主要的vnode可用,但我们还必须从法定数量的vnode获得响应,在这种情况下,主要和回退。如果该节点刚刚失败,则第一个请求将发现回退为空,因此get请求从回退vnode接收到未发现的消息,并从主要用户接收用户记录。由于选项包括notfound_ok=false
,因此当法定数为2时,这是1个有效响应,因此请求失败。
后续查询可能会成功完成,因为在第一次请求后,回读将由读取修复填充。
我认为你会在Riak和Riak CS中发现很多东西,如果你将n_val减少到3以下,它似乎不能正常工作。例如,如果你把n_val保持在3,那么法定人数是多少3个vnode是2,如果其中一个主要版本处于脱机状态并且还没有填充回退,你仍然可以对弱选项做出有效响应。