我在Couchbase群集中有3个节点,副本数设置为1。
在执行1M文档的多线程插入时,我会重新启动其中一个节点。
结果是在插入操作结束时,我缺少大约15%的数据。
知道如何防止数据丢失吗?
答案 0 :(得分:3)
首先,当节点离开集群时,您是否对节点进行了故障转移?在故障转移之前,其他节点上的副本不会被提升为活动状态(因此无法访问任何副本数据)。
其次,您是否正在检查insert
操作的返回值?如果节点不可访问(但在故障转移之前)操作将返回异常(可能是“超时”) - 您应该确保应用程序重试插入。
第三,默认情况下,一旦主节点上发生更新,Couchbase上的大多数CRUD操作都会返回,以获得最佳性能。因此,如果你松开一个节点,那么副本可能还没有被写入 - 所以如果你确实执行了故障转移,那么即使也没有副本。为了防止这种情况,您可以使用observe
操作在副本节点有副本之前不报告操作“完成” - 请参阅Monitoring Items using observe。
请注意,使用observe会导致性能下降,但对于您特别关注的修改,这可能是一个可接受的权衡。