2017-07-16 45 views
0

我想评估分布式锁定的各种选项。很少有我入围的选项是Zookeeper,MySQL和Cassandra。卡桑德拉作为分布式锁

随着卡桑德拉,我在想什么是创建一个表,说锁

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

然后作为acquireLock过程的一部分,我如果不存在查询象下面执行插入。 acquireLock只有插入返回true时,才会返回进程。

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

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

我正在进行一些性能测试,并列出了我入围的所有选项。结果,Zookeeper和MySQL不会显示任何错误,因为Cassandra的结果非常不一致,并且在所有测试中都显示出几个或更多的错误。大多数时间的错误是“卡桑德拉超时写入查询时一致QUORUM

问题我在这里是,卡桑德拉的意思是分布式锁?如果尝试获取此锁的并发线程数超过,它可以扩展吗?

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

+1

如果你需要分布式的锁看看hazelcast:http://docs.hazelcast.org/docs/latest /手动/ HTML单/#锁 – Mandraenke

回答

0

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

卡桑德拉不提供锁定机制。您正在使用IF NOT EXISTS这是轻量级交易。

轻型交易(IF条款)

虽然与最终/可调一致性耐用的交易是许多使用情况比较满意,就出现这样的情况更需要的地方。使用线性化一致性的轻量级事务(也称为比较和集合)可能可以满足这些需求。

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

Lightweight Transactions

这听起来像一个高性价比,或许太高。这就是为什么卡桑德拉给你超时例外。因此,保留对这些情形的轻量级交易,他们是绝对必要的

来源: 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