哪个 couchbase 节点将服务于请求?

Which couchbase node will serve request?

我有 NodeJS 服务,它与 couchbase 集群通信以获取数据。 couchbase 集群有 4 个节点(运行 在 ip1、ip2、ip3、ip4 上)并且服务在相同的 4 个服务器上也是 运行。在所有 NodeJS 服务上,我的连接字符串如下所示:

couchbase://ip1,ip2,ip3,ip4

但是每当我尝试从存储桶 X 中获取一些文档时,控制台都会显示 ip4 上的节点正在执行该操作。无论哪个 NodeJS 应用程序发出请求,相同的 ip4 都会为所有请求提供服务。

我希望每个 NodeJS 服务器都使用它们的 couchbase 节点,以便所有服务器上的 RAM 和 CPU 消耗相等,所以我更改了连接字符串中 IP 的顺序,但每次请求都由相同的服务ip4.

我创建了另一个存储桶并将我的数据放入其中并尝试获取它但它再次转到相同的 ip4。有人可以解释为什么会发生这种情况吗?它会导致其中一个节点负载过高吗?

"I want each NodeJS server to use their couchbase node"是什么意思? 在 Couchbase 中,部分活动数据集位于集群中的每个节点上。分片是自动的。当您拥有集群时,每个 Bucket 的 1024 个活动 vBucket(分片)分布在集群的所有节点上。因此对于您的 4 个节点,每个节点上将有 256 个 vBuckets。鉴于 Couchbase SDK 使用的一致性哈希算法,它将能够从密钥中分辨出该对象进入哪个 vBucket,并结合它从集群中获得的集群映射,知道该 vBucket 位于集群中的哪个节点。因此,如果您正确配置了应用程序,那么应用程序将从集群中的每个节点获取数据,因为数据是均匀分布的。

在文件系统上,作为 Couchbase 的一部分,将安装一个 CLI 工具调用 vbuckettool,它将 objectID 和 clustermap 作为参数。它所做的只是一致性哈希算法+ clustermap。因此,即使对象尚不存在,您也可以实际预测对象的去向。

另一方面,生产中的最佳做法是不要 运行 您的应用程序位于与 Couchbase 相同的节点上。出于其他原因,它确实应该是独立的,以充分利用其无共享架构。