Riak-CS 集群仅在 1/3 节点失败后崩溃!您提供的 AWS 访问密钥 ID 在我们的记录中不存在

Riak-CS cluster broken after only 1/3 node failed! The AWS Access Key Id you provided does not exist in our records

我已经在沙箱中创建了 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 以确保集群状态已收敛,但这无济于事。

如果您将 n_val 设置为 2,则每个密钥只有 2 个副本。当您关闭一个节点时,很大一部分(大约 50%)密钥的副本之一将变得不可用。

查看 get_user_with_pbc function, it first tries with the 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 的仲裁中获得响应,在这种情况下,包括主要和备用。如果节点刚刚发生故障,第一个请求会发现 fallback 为空,因此 get 请求从 fallback vnode 收到一个 notfound,从 primary 收到用户记录。由于选项包括notfound_ok=false,即1个有效响应,而quorum为2,因此请求失败。

后续查询可能会成功完成,因为回退将在第一个请求后由读取修复填充。

我认为如果将 n_val 减少到 3 以下,您会发现 Riak 和 Riak CS 中的很多东西似乎都无法正常工作。例如,如果您保持 n_val 在 3,因为 3 个 vnode 的法定人数是 2,如果其中一个主节点离线并且回退尚未填充,您仍然可以获得对弱选项的有效响应。