我正在使用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。有人可以解释为什么会发生这种情况并且会导致其中一个节点产生高负载吗?
答案 0 :(得分:1)
“我希望每个NodeJS服务器都使用他们的couchbase节点”是什么意思? 在Couchbase中,活动数据集的一部分位于群集中的每个节点上。分片是自动的。当您拥有一个集群时,每个Bucket的1024个活动vBuckets(分片)将分布在集群的所有节点上。因此,对于4个节点,每个节点上将有256个vBucket。鉴于Couchbase SDK使用的一致哈希算法,它将能够从密钥中告知该对象进入哪个vBucket并与从群集中获得的群集映射相结合,知道vBucket在群集中的哪个节点。因此,如果数据均匀分布,应用程序将从群集中的每个节点获取数据。
在文件系统上,作为Couchbase安装的一部分,将安装一个CLI工具调用vbuckettool,它将objectID和clustermap作为参数。它所做的只是一致的散列算法+集群映射。因此,即使物体尚不存在,您也可以实际预测物体的去向。
另一方面,生产中的最佳做法是不在与Couchbase相同的节点上运行您的应用程序。它应该是独立的,以便在其他原因中充分利用其无共享架构。