couchbase集群文档不复制但分裂
Posted
技术标签:
【中文标题】couchbase集群文档不复制但分裂【英文标题】:couchbase cluster document not replicating but splitting up 【发布时间】:2017-11-08 13:46:32 【问题描述】:我已经建立了一个 couchbase 集群,它有 2 个节点,在 4 个存储桶上包含 300k 文档。选项 replicas 被强制为 1,因为只有 2 台机器。
但是文档在一个节点中分成一半在另一个节点中,我需要每个文档的双份副本,因此如果一个节点出现故障,另一个节点仍然向我的应用程序提供所有数据。
我在创建集群时是否遗漏了某个设置?
我仍然可以将集群设置为复制所有文档吗?
希望有人能帮忙。
谢谢
PS:我使用的是 couchbase community 4.5
更新: 我添加了集群 Web 界面和 cbstast 输出的屏幕截图: 以下是只有一个节点的状态
接下来是两个节点都向上的那个:
然后当两个节点都启动并运行时,两个节点上的 cbstats 结果:
您可以看到,只有一个节点显示了一半的项目。这是否意味着另一半作为副本存在但未显示??? 我还能用一个节点稳定地运行我的应用吗???
更新: 我必须手动单击故障转移才能看到副本在剩余节点上变为活动状态。因为只有两个集群自动故障转移被禁用!!!
【问题讨论】:
【参考方案1】:如您所见,Couchbase Server 将跨两个节点对文档进行分区或分片。它还将根据您的单副本配置在这些节点上放置副本。
要访问副本,您必须使用Client SDKs 之一。
例如,如果活动文档检索失败 (get("id")
),此 Java 代码将尝试检索副本 (getFromReplica("id", ReplicaMode.ALL)
)。
bucket.async()
.get("id")
.onErrorResumeNext(bucket.async().getFromReplica("id", ReplicaMode.ALL))
.subscribe();
ReplicaMode.ALL
告诉 Couchbase 尝试所有具有副本的节点和活动节点。
【讨论】:
嗨,Jeff,couchbase 没有放置副本,因为副本配置被强制为 ONE,couchbase 不允许我增加它。它只是说你没有足够的节点用于副本>1 一个副本意味着文档有两个副本,活动副本和副本。您如何确定没有副本?您可以使用cbstats 来验证副本是否存在。例如:/opt/couchbase/bin/cbstats hostname:11210 all -b bucketName | egrep -i "active_num|replica_num"
.
如果两个节点中的一个节点出现故障,则网络接口向我显示每个存储桶中文档数量的一半。如果 bucketA 有 1000 个文档和两个节点,当一个节点出现故障时,我只能看到 bucketA 的 500 个文档。我将尝试使用命令行。谢谢
嗨,我添加了一些屏幕截图并运行 cbstats。查看 Web 界面看起来有一半的文档处于活动状态,而 cbstast 说每个节点有 512 个活动的 512 个副本。当另一个节点关闭时是否使用副本?并且没有显示在网页界面中?
我发现问题如下。感谢杰夫的帮助。【参考方案2】:
所以集群中只有两个节点发生的情况是自动故障转移没有按照此处指定的那样自动启动: https://developer.couchbase.com/documentation/server/current/clustersetup/automatic-failover.html
这意味着除非手动触发故障转移,否则其余节点中未激活的数据副本。
最好的办法是在投入生产之前在集群中拥有两个以上的节点。
说实话,在提出任何问题之前,我应该非常仔细地阅读文档。
感谢 Jeff Kurtz 的帮助,您将我推向了解决方案。 (了解 couchbase 副本策略的工作原理)。
【讨论】:
以上是关于couchbase集群文档不复制但分裂的主要内容,如果未能解决你的问题,请参考以下文章
存储桶是不是跨越 Couchbase 服务器集群中的所有节点?
具有 cbq 和 cbimport 命令组合的 Couchbase 脚本不起作用