我已经和cassandra合作了一年,在我的一个项目中,我必须处理各种查询表中的数据,更新,插入和删除......所有这些都是在"服务"层。我的一个担忧是一致性,我知道cassandra放弃了提供可用性和分区(可以调整的内容,但项目需要A和P而不是C)。
当我说一致性时,我正在考虑这种情况:
Keyspace [User] {
userId,
email,
phoneNumber,
firstName,
lastName
} Primary Key (userID)
LookupTables:
基于我们使用的体系结构,当客户端调用service.save(用户用户)时,它会触发对lookupTables的操作,在所有这些操作中填充数据,假设在插入过程中插入操作失败了?我应该在我的代码中控制它吗?我们使用BatchStatement管理它,它是最好的方法吗?
Cassandra版本:2x
答案 0 :(得分:1)
首先,我想定义一致性。我认为你已经混淆了Cassandra Consistency Level Vs Atomicity的概念。我认为您关注的是如何在相关表格中保持数据一致。
Cassandra Tunable Consistency
一致性是指如何在其所有副本上更新和同步一行Cassandra数据。
Cassandra通常被归类为AP系统,这意味着可用性和分区容差通常被认为比Cassandra的一致性更重要。但Cassandra可以通过复制因子和一致性水平进行调整,以满足C。
Cassandra最适合不需要强度一致性的地方。您将最终获得最新的数据。
现在进入数据建模部分。你是在正确的道路上。 :)
在设计模型之前准备查询非常重要。这种情况有一些可能的解决方案。
您可以在这些列上创建二级索引以进行查询并获取所需的数据。在这种情况下,您不必管理任何查找表,也不会出现表间不一致数据的情况。但这不是这种情况的好方法。其原因在下面的链接中描述:
https://docs.datastax.com/en/cql/3.1/cql/ddl/ddl_when_use_index_c.html
将表作为索引的形式手动维护而不是使用Cassandra内置索引可能更有效。
读取速度也会变慢,因为每个节点都必须查询才能获得所需的结果。由于Cassandra写得快得多,我们维护表(如果需要,每个查询表)来执行索引并提供查询,并且还使数据非规范化以使读取更快。但现在出现了维护这些表之间数据一致性的问题。如果发生更新,如何确保在所有表中保持索引/非规范化数据的一致性。
为了保持这些表之间的数据一致性(取决于用例),如果要确保这些更新之间的原子性,批处理就是解决方案。
如果您的系统(群集运行状况)没问题,Cassandra会确保所有写入都成功。但是,如果任何写入失败(您无法通过他们的电子邮件/移动设备找到用户),那么您可以避免批处理(协调员需要做很多维护批处理的工作)。但在这里你可以使用批处理。
此外,如果您使用的是Cassandra 3.0,您可以使用物化视图概念,其中Cassandra维护表之间的数据一致性。
有很多与此相关的问题
How to ensure data consistency in Cassandra on different tables?