【问题标题】:Cassandra DELETE query not being executed when racing UPDATE更新时没有执行 Cassandra DELETE 查询
【发布时间】:2017-12-28 10:33:06
【问题描述】:

我正在 Cassandra 中运行 DELETE 查询。这与具有 IF EXISTS 子句的几个 UPDATE 查询同时发生。预期的行为是,当 DELETE 到达时,它将被执行,然后不会执行后续的 UPDATE,因为 IF EXISTS 子句将解析为 false,因为删除将发生。

这不是一致性问题,因为 Cassandra“集群”是在 docker 容器中运行的单个节点。我查看了日志并在跟踪级别捕获了成功删除与不成功删除相比的 cassandra 日志输出。似乎在失败的情况下,删除根本没有被执行。

删除成功:

删除在第 2 行处理。

更新后立即处理并且不应用,因为删除的行不再存在。

TRACE [Native-Transport-Requests-4] 2017-07-21 14:27:37,012 Message.java:516 - Received: QUERY DELETE FROM monitored_compliance_rules WHERE organisation_id='2' AND id=2cde2468-1c04-480c-9e24-681c04480c9e[pageSize = 5000], v=4/v4
TRACE [Native-Transport-Requests-4] 2017-07-21 14:27:37,012 QueryProcessor.java:212 - Process org.apache.cassandra.cql3.statements.DeleteStatement@77bb560f @CL.LOCAL_ONE 
TRACE [Native-Transport-Requests-1] 2017-07-21 14:27:37,013 Message.java:516 - Received: EXECUTE 346d975e583adeeb6aadbf60e16d9d26 with 4 values at consistency LOCAL_ONE, v=4/v4
TRACE [Native-Transport-Requests-1] 2017-07-21 14:27:37,013 QueryProcessor.java:519 - [1] 'java.nio.HeapByteBuffer[pos=0 lim=4 cap=4]'
TRACE [Native-Transport-Requests-1] 2017-07-21 14:27:37,013 QueryProcessor.java:519 - [2] 'java.nio.HeapByteBuffer[pos=0 lim=12 cap=12]'
TRACE [Native-Transport-Requests-1] 2017-07-21 14:27:37,013 QueryProcessor.java:519 - [3] 'java.nio.HeapByteBuffer[pos=0 lim=1 cap=1]'
TRACE [Native-Transport-Requests-1] 2017-07-21 14:27:37,013 QueryProcessor.java:519 - [4] 'java.nio.HeapByteBuffer[pos=0 lim=16 cap=16]'
TRACE [Native-Transport-Requests-1] 2017-07-21 14:27:37,013 QueryProcessor.java:212 - Process org.apache.cassandra.cql3.statements.UpdateStatement@6d551622 @CL.LOCAL_ONE
TRACE [Native-Transport-Requests-1] 2017-07-21 14:27:37,013 MessagingService.java:945 - /172.18.0.4 sending PAXOS_PREPARE to 3255@/172.18.0.4
TRACE [Native-Transport-Requests-1] 2017-07-21 14:27:37,013 MessagingService.java:948 - Message-to-self TYPE:MUTATION VERB:PAXOS_PREPARE going over MessagingService
TRACE [MutationStage-3] 2017-07-21 14:27:37,015 MessagingService.java:945 - /172.18.0.4 sending REQUEST_RESPONSE to 3255@/172.18.0.4
TRACE [MutationStage-3] 2017-07-21 14:27:37,015 MessagingService.java:948 - Message-to-self TYPE:REQUEST_RESPONSE VERB:REQUEST_RESPONSE going over MessagingService
TRACE [RequestResponseStage-5] 2017-07-21 14:27:37,016 PrepareCallback.java:64 - Prepare response PrepareResponse(true, Commit(bdbe3ea0-6e20-11e7-bc6a-52488cbcfc11, [analytics.monitored_compliance_rules] key=2 columns=[[] | [days_processed days_to_process state]]
    Row: id=4c6ddcbe-c3f7-4287-addc-bec3f7628718 | days_processed=0, days_to_process=180, state=initializing), Commit(13814000-1dd2-11b2-8080-808080808080, [analytics.monitored_compliance_rules] key=2 columns=[[] | []])) from /172.18.0.4
TRACE [Native-Transport-Requests-1] 2017-07-21 14:27:37,016 ReadCallback.java:101 - Blockfor is 1; setting up requests to /172.18.0.4
TRACE [Native-Transport-Requests-1] 2017-07-21 14:27:37,016 AbstractReadExecutor.java:116 - reading data locally
TRACE [Native-Transport-Requests-4] 2017-07-21 14:27:37,016 Tracing.java:188 - request complete
TRACE [Native-Transport-Requests-4] 2017-07-21 14:27:37,017 Message.java:535 - Responding: EMPTY RESULT, v=4/v4
TRACE [Native-Transport-Requests-1] 2017-07-21 14:27:37,018 ReadCallback.java:147 - Read: 5 ms.
TRACE [Native-Transport-Requests-1] 2017-07-21 14:27:37,019 Tracing.java:188 - request complete
TRACE [Native-Transport-Requests-1] 2017-07-21 14:27:37,019 Message.java:535 - Responding: ROWS [[applied](analytics, monitored_compliance_rules), org.apache.cassandra.db.marshal.BooleanType]
 | false
---, v=4/v4

删除失败

第 1 行收到删除但未处理。

更新在第 2 行收到并成功发生,因为 IF EXISTS 子句解析为 true,因为删除从未发生。

TRACE [Native-Transport-Requests-1] 2017-07-21 14:27:37,353 Message.java:516 - Received: QUERY DELETE FROM monitored_compliance_rules WHERE organisation_id='2' AND id=5c1b69cd-653d-4d6b-9b69-cd653dbd6b8c[pageSize = 5000], v=4/v4
TRACE [Native-Transport-Requests-3] 2017-07-21 14:27:37,369 Message.java:516 - Received: EXECUTE 346d975e583adeeb6aadbf60e16d9d26 with 4 values at consistency LOCAL_ONE, v=4/v4
TRACE [Native-Transport-Requests-3] 2017-07-21 14:27:37,369 QueryProcessor.java:519 - [1] 'java.nio.HeapByteBuffer[pos=0 lim=4 cap=4]'
TRACE [Native-Transport-Requests-3] 2017-07-21 14:27:37,369 QueryProcessor.java:519 - [2] 'java.nio.HeapByteBuffer[pos=0 lim=12 cap=12]'
TRACE [Native-Transport-Requests-3] 2017-07-21 14:27:37,369 QueryProcessor.java:519 - [3] 'java.nio.HeapByteBuffer[pos=0 lim=1 cap=1]'
TRACE [Native-Transport-Requests-3] 2017-07-21 14:27:37,369 QueryProcessor.java:519 - [4] 'java.nio.HeapByteBuffer[pos=0 lim=16 cap=16]'
TRACE [Native-Transport-Requests-3] 2017-07-21 14:27:37,369 QueryProcessor.java:212 - Process org.apache.cassandra.cql3.statements.UpdateStatement@6d551622 @CL.LOCAL_ONE
TRACE [Native-Transport-Requests-3] 2017-07-21 14:27:37,369 MessagingService.java:945 - /172.18.0.4 sending PAXOS_PREPARE to 3263@/172.18.0.4
TRACE [Native-Transport-Requests-3] 2017-07-21 14:27:37,370 MessagingService.java:948 - Message-to-self TYPE:MUTATION VERB:PAXOS_PREPARE going over MessagingService
TRACE [MutationStage-2] 2017-07-21 14:27:37,374 MessagingService.java:945 - /172.18.0.4 sending REQUEST_RESPONSE to 3263@/172.18.0.4
TRACE [MutationStage-2] 2017-07-21 14:27:37,376 MessagingService.java:948 - Message-to-self TYPE:REQUEST_RESPONSE VERB:REQUEST_RESPONSE going over MessagingService
TRACE [RequestResponseStage-4] 2017-07-21 14:27:37,377 PrepareCallback.java:64 - Prepare response PrepareResponse(true, Commit(bdbe3ea0-6e20-11e7-bc6a-52488cbcfc11, [analytics.monitored_compliance_rules] key=2 columns=[[] | [days_processed days_to_process state]]
    Row: id=4c6ddcbe-c3f7-4287-addc-bec3f7628718 | days_processed=0, days_to_process=180, state=initializing), Commit(13814000-1dd2-11b2-8080-808080808080, [analytics.monitored_compliance_rules] key=2 columns=[[] | []])) from /172.18.0.4
TRACE [Native-Transport-Requests-3] 2017-07-21 14:27:37,378 ReadCallback.java:101 - Blockfor is 1; setting up requests to /172.18.0.4
TRACE [Native-Transport-Requests-3] 2017-07-21 14:27:37,378 AbstractReadExecutor.java:116 - reading data locally
TRACE [Native-Transport-Requests-3] 2017-07-21 14:27:37,379 ReadCallback.java:147 - Read: 10 ms.
TRACE [Native-Transport-Requests-3] 2017-07-21 14:27:37,380 MessagingService.java:945 - /172.18.0.4 sending PAXOS_PROPOSE to 3264@/172.18.0.4
TRACE [Native-Transport-Requests-3] 2017-07-21 14:27:37,380 MessagingService.java:948 - Message-to-self TYPE:MUTATION VERB:PAXOS_PROPOSE going over MessagingService
TRACE [MutationStage-2] 2017-07-21 14:27:37,381 MessagingService.java:945 - /172.18.0.4 sending REQUEST_RESPONSE to 3264@/172.18.0.4
TRACE [MutationStage-2] 2017-07-21 14:27:37,383 MessagingService.java:948 - Message-to-self TYPE:REQUEST_RESPONSE VERB:REQUEST_RESPONSE going over MessagingService
TRACE [RequestResponseStage-2] 2017-07-21 14:27:37,383 ProposeCallback.java:62 - Propose response true from /172.18.0.4
TRACE [Native-Transport-Requests-3] 2017-07-21 14:27:37,383 Tracing.java:188 - request complete
TRACE [Native-Transport-Requests-3] 2017-07-21 14:27:37,383 Message.java:535 - Responding: ROWS [[applied](analytics, monitored_compliance_rules), org.apache.cassandra.db.marshal.BooleanType]
 | true
---, v=4/v4

失败不会在驱动程序中返回异常。它只是默默地失败了。

为什么有时不会发生这种删除?这是否表明 Cassandra 本身存在某种错误?

【问题讨论】:

  • 您使用的是哪个版本的 cassandra?
  • 最新版本:3.11

标签: cassandra


【解决方案1】:

这里有一些问题。

我正在 Cassandra 中运行 DELETE 查询。这与具有 IF NOT EXISTS 子句的几个 UPDATE 查询同时发生。预期的行为是,当 DELETE 到达时,它将被执行,然后不会执行后续的 UPDATE,因为 IF NOT EXISTS 子句将在删除发生时解析为 true。

0) DELETE 可能会删除节点,然后IF NOT EXISTS 将是真的,所以它会发出一个UPDATE,这实际上是一个UPSERT(如果不存在则插入),所以根据你的描述(如果它不是错字),它在做正确的事情吗?

第 1 行收到删除但未处理。

更新在第 2 行收到并成功发生,因为 IF NOT EXISTS 子句解析为 true,因为删除从未发生。

1) 您的查询使用 CL:LOCAL_ONE,这意味着修改在返回客户端之前由单个节点确认。您无法保证任何其他节点确实确认了写入,更不用说多数了。此外,即使您向同一个协调器发出查询,协调器也可能将它们发送到不同的副本。

2) 日志行并不表示写入实际命中 memtable 的顺序(这需要写入提交日志,这可能不是您期望的顺序)。

【讨论】:

  • 0) 对不起,我刚刚意识到我在问题中犯了一个错误,我正在运行的查询实际上是一个 IF EXISTS 查询,我只是在问题中写了错误的命令,所以预期的描述行为是正确的。 1) 如前所述,这是一个单节点集群,因此 LOCAL_ONE 在概念上与 ALL 在一致性方面相同。 2) 在失败的情况下,100 毫秒后的未来更新仍然会成功发生,所以除非 DELETE 需要几秒钟才能执行(可能吗?),否则它可能根本不会发生。
猜你喜欢
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多