Couchbase Java DCP客户端不';t使用恢复文件从所有铲斗开始装载

Couchbase Java DCP客户端不';t使用恢复文件从所有铲斗开始装载,couchbase,Couchbase,我正在使用Couchbase DCP java客户端将一些数据从Couchbase复制到其他地方。当我开始加载没有问题的数据时,效果非常好。但我的桶现在相当大,如果在执行过程中出现任何问题,我会从头开始重新启动,重新加载所有东西。现在,这个负载需要3个多小时 所以我开始每N分钟使用一次状态文件,它创建一个状态文件,如下代码所示: private def saveState(): String ={ val filename = stateFilePath + s"couch

我正在使用Couchbase DCP java客户端将一些数据从Couchbase复制到其他地方。当我开始加载没有问题的数据时,效果非常好。但我的桶现在相当大,如果在执行过程中出现任何问题,我会从头开始重新启动,重新加载所有东西。现在,这个负载需要3个多小时

所以我开始每N分钟使用一次状态文件,它创建一个状态文件,如下代码所示:

private def saveState(): String ={

    val filename = stateFilePath +
      s"couchbase-$bucket-${LocalDateTime.now.format(DateTimeFormatter.ofPattern("YYYYMMdd_HHmmss"))}"

    val state: Array[Byte] = client.sessionState.export(StateFormat.JSON)

    // Write it to a file
    new File(stateFilePath).mkdirs()
    val output: FileOutputStream = new FileOutputStream(new File(filename))
    IOUtils.write(state, output)
    output.close()
    filename
}
然后我加载文件并开始流式处理,如下所示:

client.connect().await()
client.recoverOrInitializeState(StateFormat.JSON, persistedFilePath, StreamFrom.BEGINNING, StreamTo.INFINITY).await()
client.startStreaming().await()
logger.info(s"Number of documents processed: $objectCount")
var vbid = 0
while (vbid < client.numPartitions) {
  val open = client.streamIsOpen(vbid.toShort)
  if (!open) {
    logger.warn("Stream is not open for vBucket: {}", vbid)
  }

  vbid += 1
在我的代码中,我会检查所有VBUCKET是否具有如下正确连接:

client.connect().await()
client.recoverOrInitializeState(StateFormat.JSON, persistedFilePath, StreamFrom.BEGINNING, StreamTo.INFINITY).await()
client.startStreaming().await()
logger.info(s"Number of documents processed: $objectCount")
var vbid = 0
while (vbid < client.numPartitions) {
  val open = client.streamIsOpen(vbid.toShort)
  if (!open) {
    logger.warn("Stream is not open for vBucket: {}", vbid)
  }

  vbid += 1
logger.info(s“处理的文档数:$objectCount”)
var vbid=0
while(vbid
因此,出于某种原因,当我从状态文件读取时,我开始有一些没有打开连接的vBuckets。
最好的方法是什么?

我发现了与此相关的问题

解决方案正在工作,但有一点。如果作业在开始读取每个vBucket中至少1个文档之前失败,则0的vBucket的重新加载将失败。代码将不会启动vBucket的使用者,因此您需要手动启动这些使用者

尽管如此,当您从所有vBuckets读取一些数据时,它工作得非常好

我的问题是,我正在测试DCP和恢复的失败。我花了太多时间在这件事上,我启动了复制,然后等待,如果出现任何问题,我们可以从一开始重新加载。一个好的方面是,作业没有失败。我们必须重新启动机器,重新启动作业,所有这些都可以很好地恢复。vBuckets已重新启动,复制现在正常


感谢所有试图提供帮助的评论。

recoverOrInitializeState
之后,您是否正在调用
client.startStreaming().wait()
recoverOrInitializeState
?。是的,流媒体开始,但当它处于恢复状态时,并非所有的vBucket都开始流媒体。当我使用
client.streamIsOpen(vbid.toShort)检查vBucket时
很少有未打开的。如果没有状态文件启动,则不会发生这种情况。有三种想法:1)DCP客户端中存在大量异步,并且流可能不会立即打开。如果在调用
streamIsOpen
之前需要10秒,这会有什么区别吗?2)它始终是同一个vbuckets,还是它们是di每次都不一样?3)你能发布保存的状态JSON吗?如果启用调试日志记录,日志文件中会出现任何值得注意的内容吗?不知道你是否看到了。@d我等了几分钟,但存储桶没有打开。我可以再等几分钟。而且存储桶不一样,通常vBucket ID会更改。