0

我目前正在使用 3 个 cockroachDB 节点测试失败场景。

使用这种情况:

  1. 在循环中插入记录
  2. 关闭 3 个节点中的 2 个(模拟仲裁丢失)
  3. 等待足够长的时间,以便 Postgres JDBC 驱动程序引发 IO 异常
  4. 重启一个节点以恢复 Quorum
  5. 重试上一个失败的语句

然后我遇到了以下异常

Cause: org.postgresql.util.PSQLException: ERROR: duplicate key value (messageid)=('71100358-aeae-41ac-a397-b79788097f74') violates unique constraint "primary"

这意味着当 Quorum 再次可用时,插入在第一次尝试时成功(我从中获得了 IO 异常)。问题是我不知道。

我不能假设“重复键值”异常是由应用程序逻辑问题引起的。是否有任何参数可以调整,以便基础语句在 IO Exception 之前回滚?或者也许是更好的方法?

测试是使用

  • CockroachDB v1.1.5(3个节点)
  • MyBatis 3.4.0
  • PostgreSQL 驱动程序 42.2.1
  • 爪哇 8
4

1 回答 1

1

这里可能会发生几件事。

首先,如果您要杀死的节点之一是网关节点(您的 Java 进程正在连接的节点),则可能只是数据正在提交,但节点在能够发回确认之前就死亡了给客户。在这种情况下,CockroachDB 或任何其他数据库都无能为力。

更微妙的情况是您要杀死的节点是网关节点之外的节点。也就是说,尽管数据已成功提交,但您正在与之交谈的节点向您发送了一个错误。这里的问题是数据一写入 raft 就被提交了,但是如果其他节点已经死亡(并且可能稍后恢复),网关节点无法知道他们是否已经提交了它要求他们提供的数据。在这种情况下,CockroachDB 会返回“模糊结果错误”。我不确定 jdbc 在这种情况下如何公开返回给客户端的错误的细节,但如果您检查错误本身,它应该会说明这一点。

CockroachDB 中的模棱两可的结果在其Jepsen 分析中进行了简要讨论,有关可返回的错误类型的信息,请参阅CockroachDB 文档中的此页面。

于 2018-02-22T18:33:00.970 回答