2

当 Fetchinig 多个密钥集时,我可以看到客户端以一个长字符串发出请求并发送到连接的 couchbase 服务器(协议似乎也包括每个密钥的 vbucket 映射)

因此,来自客户端的一个网络调用包含所有密钥,即他们的 vbucketmaps。

服务器如何响应这个请求?

如果连接的服务器具有所有请求的值,那么我希望连接的服务器只提供请求的值。

但是,如果有多个集群,则连接的服务器可能没有请求的密钥。服务器在这种情况下会做什么?我可以看到请求包括 vbucket 映射,由此,我可以预期连接的服务器可以向特定 Key 的主服务器询问其值。这只是我的猜测,我想知道服务器在这种情况下如何响应。

此外,如果存在 Key 会发生什么,但是,由于“服务器忙”或其他一些错误,服务器无法返回该值。

总是感谢您的帮助

4

1 回答 1

3

有两种不同的方式可以发生这种情况,使用 moxi 或不使用 moxi。

无磨西(智能客户端)

客户端与 Couchbase 建立连接,它将首先获取集群中所有服务器的列表和 vbucket 映射。然后它与集群中的每个服务器建立连接。当您执行多操作时,客户端将咨询它包含的 vbucket 映射并确定服务器属于哪个 vbucket。如果我们有三台服务器,那么客户端将最多组合三个多操作,并将每个操作发送到包含该多操作中所有密钥的相应服务器。每个服务器都会响应客户端,客户端会将所有结果放在一起,形成一组结果。

与磨西

在这种情况下,客户端不知道集群或 vbucket 映射,但 moxi 知道。客户端会将所有密钥发送到 moxi,然后 moxi 将负责将它们拆分并将它们发送到适当的服务器。

切断方案:

如果服务器关闭或忙碌,则该服务器特定的多操作中的所有键都将失败。客户端应该向您返回它可以从其他服务器获取的密钥并提醒您错误。

再平衡场景:

在重新平衡期间,请求被发送到错误服务器的可能性很小。在这种情况下,客户端应该在正确的服务器上重试操作。在重新平衡期间,每个客户端都应该收到一个“快进”vbucket 映射,说明重新平衡后所有 vbucket 的位置。它将使用此 vbucket 映射中的服务器进行重试。

于 2012-04-11T23:59:28.533 回答