Couchbase Java DCP客户端无法使用恢复文件从所有存储桶启动负载

时间:2018-05-08 03:18:17

标签: couchbase

我正在使用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()

在我的代码中,我检查所有Vbuckets是否有这样的正确连接:

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

因此,出于某种原因,当我从状态文件中读取时,我开始有一些没有打开连接的vBuckets。 什么应该是最好的方法?

1 个答案:

答案 0 :(得分:0)

我发现了与之相关的问题。

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

虽然,当你从所有vBuckets中读取一些数据时,它可以很好地工作。

我的问题是,我正在测试DCP的失败和恢复。我有太多时间处理这个问题而且我开始复制并等待如果有什么不好我们能够从头开始重新加载。一个好处是,工作并没有失败。我们不得不重新启动机器,我们重新启动工作所有工作都很好恢复。 vBuckets重新启动,现在复制正常。

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