我试图评估分布式锁定的各种选项。我的候选名单中很少有动物园管理员,MySQL和卡桑德拉。
对于卡桑德拉,我想的是创建一个表,比如锁
create table if not exists app.locks (
key text,
primary KEY (key)
);然后,作为acquireLock进程的一部分,我可以执行一个insert (如果不存在)查询,如下所示。只有当insert返回true时,acquireLock进程才会返回。
INSERT INTO app.locks (key) VALUES ('KEY_1') IF NOT EXISTS;释放锁可以删除此键的数据,以便其他线程可以尝试获取它。
我做了一些性能测试的所有选项,我已经列出了。有了这些结果,动物管理员和MySQL就不会出现任何错误,因为卡桑德拉的结果是不一致的,而且在所有的测试中都显示了很少或更多的错误。大多数错误是“在一致性仲裁时写入查询期间的Cassandra超时”。
我在这里的问题是,卡桑德拉是否意味着分布式锁定?如果试图获取此锁的并发线程数超过该锁,它是否可以缩放?
期待着专家们的思考。提前谢谢。
发布于 2017-07-16 08:28:46
Cassandra从帽子定理中选择AP,这意味着在Cassandra中,可用性和分区容限通常被认为比一致性更重要。卡桑德拉提供了最终一致性。
Cassandra不提供锁机制。您使用的是IF NOT EXISTS,它是一个轻量级事务。
轻量级事务(如果条款)
虽然对于许多用例来说,具有最终/可调一致性的持久事务是相当令人满意的,但是在需要更多的情况下确实会出现这种情况。使用可线性一致性的轻量级事务(也称为比较和集合)可能可以满足这些需求。
Cassandra在一个节点之间进行了四次往返,提出了一个轻量级事务和集群中任何需要的副本,以确保正确的执行,从而影响性能。

这听起来成本很高--也许太高了。这就是为什么卡桑德拉给你超时值的例外。因此,将轻量级事务保留在绝对必要的情况下。
资料来源:c.html https://www.datastax.com/dev/blog/lightweight-transactions-in-cassandra-2-0
https://stackoverflow.com/questions/45126146
复制相似问题