在 Cassandra 中混合轻量级事务和正常写入

Posted

技术标签:

【中文标题】在 Cassandra 中混合轻量级事务和正常写入【英文标题】:Mixing lightweight transactions and normal writes in Cassandra 【发布时间】:2016-04-01 14:46:40 【问题描述】:

Datastax documentation 用于轻量级事务状态:

“轻量级事务使用不同于普通操作的时间戳机制,混合 LWT 和普通操作会导致错误。如果轻量级事务用于写入分区内的行,则只有轻量级事务用于读取和应该使用写操作。”

这是非常模糊的(顺便说一句,LWT 用于读取操作是什么意思?)。

对 Cassandra 内部有更深入了解的人能否详细说明混合 LWT 和正常写入时可能出现的问题?

我最好的猜测是并发可能存在问题(显然)。但是我认为,如果我(例如)使用IF NOT EXISTS 插入一行并且如果那成功了,我稍后会在同一分区上执行UPDATE,我会没事的。我错了吗?

【问题讨论】:

【参考方案1】:

我同意文档在 LWT 约束方面不太准确,所以让我澄清一下:

如果你使用INSERT ... IF NOT EXISTS所有删除也应该使用DELETE ... IF EXISTS 如果您使用UPDATE table SET column1=val1 WHERE <filters> IF column2=val2,那么 column1 和 column2 上的所有更新/插入也应该使用 LWT。 column1column2 是同一列时的常见用法。

确实 LWT 有 4 轮:

    向给定分区的所有副本提出 Paxos 投票(一个 timeuuid 值)

    检查条件(IF NOT EXISTSIF EXISTSIF col=val)。如果条件不满足,就在这里失败

    否则,请等待 QUORUM/LOCAL_QUORUM 接受 Paxos 投票

    提交并应用突变(INSERTUPDATEDELETE

步骤bc可以看作是比较和交换

保证所有使用 LWT 的写入彼此之间都是可线性化的,因此它们是原子的隔离的 在分区上。

现在,如果您使用 INSERT ... IF NOT EXISTS,然后使用简单的 DELETE 而不使用 LWT,您就违背了 LWT 的目的,并且 LWT 保证不再适用。

由于比较阶段(步骤 2)和提交阶段(步骤 4)在不同的步骤中,提供原子性的唯一方法是强制其他突变通过 LWT,否则逻辑会被破坏。

与 LWT 的条件更新相同。

【讨论】:

关于分区中这组列的 reads 的 LWT 的注释怎么样?这个想法是,如果使用 LWT,在读取成功之前,写入不会将结果返回给执行写入的客户端。那么,这意味着使用非 LWT 的读取不会对比较和设置阶段发生的操作产生影响,对吧?

以上是关于在 Cassandra 中混合轻量级事务和正常写入的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra - 写入错误。如何解决?

Cassandra 组件

调整 cassandra 中的写入性能

Cassandra集群管理-替换异常节点

Cassandra 写入后读取与 LOCAL_QUORUM 不一致

Uber如何做到每秒100万次写入操作?在多个数据中心使用Mesos和Cassandra