Cassandra作为分布式锁

时间:2017-07-16 07:30:08

标签: cassandra locking

我正在尝试评估分布式锁定的各种选项。我入围的选项很少有Zookeeper,MySQL和Cassandra。

使用Cassandra,我在想的是创建一个表格锁定

create table if not exists app.locks (
    key text,
    primary KEY (key)
);

然后作为 acquireLock 进程的一部分,如果不存在查询,我可以执行插入,如下所示。只有当insert返回true时, acquireLock 进程才会返回。

INSERT INTO app.locks (key) VALUES ('KEY_1') IF NOT EXISTS;

释放锁定可以删除此密钥的数据,以便其他线程可以尝试获取它。

我正在使用我入围的所有选项进行一些性能测试。根据结果​​,Zookeeper和MySQL不显示任何错误,因为Cassandra的结果非常不一致,并且在所有测试中都显示出很少或更多错误。大多数时候错误是“ Cassandra超时写入查询时的一致性QUORUM

我在这里的问题是,Cassandra是否意味着分布式锁定?如果尝试获取此锁的并发线程数超过?

,它可以扩展吗?

期待专家的想法。提前谢谢。

1 个答案:

答案 0 :(得分:2)

Cassandra从CAP定理中选择AP,这意味着可用性和分区容差通常被认为比Cassandra中的一致性更重要。 Cassandra提供了最终的一致性。

Cassandra不提供锁定机制。您正在使用IF NOT EXISTS这是一个轻量级交易。

轻量级交易(IF条款)

  

虽然对于许多用例而言具有最终/可调整性的持久事务处理非常令人满意,但在需要更多用例的情况下确实会出现这种情况。使用线性化一致性的轻量级事务(也称为比较和集合)可能可以满足这些需求。

Cassandra在提出轻量级事务的节点和集群中任何所需的副本之间进行四次往返,以确保正确执行,从而影响性能。

Lightweight Transactions

这听起来像是一个高成本 - 也许太高了。这就是为什么Cassandra会给你超时异常的原因。因此,为绝对必要的情况保留轻量级交易

资料来源: http://www.datastax.com/documentation/cassandra/2.0/cassandra/dml/dml_ltwt_transaction_c.html https://www.datastax.com/dev/blog/lightweight-transactions-in-cassandra-2-0