【问题标题】:Fetching set of keys?获取密钥集?
【发布时间】:2012-04-10 01:35:28
【问题描述】:

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

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

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

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

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

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

感谢您的帮助

【问题讨论】:

    标签: couchbase


    【解决方案1】:

    有两种不同的方式可以做到这一点,使用 moxi 或不使用 moxi。

    没有 Moxi(智能客户端)

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

    用磨西

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

    Sever Down 场景:

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

    再平衡场景:

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

    【讨论】:

    • 嗯有点难以理解 atm... 对于第一部分,正如我从您的文章中看到的那样,客户端似乎可以完成多个网络调用,您还说“发送每个到包含该多操作中所有密钥的相应服务器“如果那种服务器不存在怎么办?在第二部分中,您说“将它们拆分并发送到适当的服务器”这是否意味着客户端连接到多个服务器并发送适当的请求?在第三部分,如果有 3 个密钥,并且 1 个未能获得。整个请求是否返回错误?想更详细地了解。谢谢
    • 我的回答有点令人困惑,我深表歉意。您开始提出更详细的问题,因此如果您能告诉我您使用哪个客户端连接到 Couchbase,将会有所帮助。这样我才能更好地回答您的问题。
    • 对于客户端,你的意思是我认为的语言......我还没有决定使用哪个库,但是查看 spymemcached(JAVA) 和 libcouchbase(C++)。看起来两者的表现非常相似
    • 我已经为 java 客户端编写了很多代码,所以我将对此进行评论。 Spymemcached 保持与集群中每个服务器的持久连接。对于多重获取,密钥根据它们所属的服务器进行拆分。然后,客户端向每个服务器发送一个 multi-get(因此集群中的每个服务器一个 multi-get)。如果服务器关闭(不存在),则多获取失败。这是一个全有或全无的操作。如果还有什么不清楚的地方请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 2022-11-03
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    相关资源
    最近更新 更多