LookupTables 一致性
LookupTables consistency
我已经使用 cassandra 一年了,在我的一个项目中,我必须处理各种查找表中的数据,更新、插入和删除......所有这些都是在 "service" 层。我担心的问题之一是一致性,我知道 cassandra 放弃了它以提供可用性和分区(可以调整的内容,但该项目需要 A 和 P 而不是 C)。
当我说一致性时,我正在考虑这种情况:
Keyspace [User] {
userId,
email,
phoneNumber,
firstName,
lastName
} Primary Key (userID)
查找表:
- UserByPhoneNumber
- UserByEmail
- UserByLastName
根据我们使用的架构,当客户端调用 service.save(User user) 时,它会触发对 lookupTables 的操作,将数据填充到所有表中,假设在插入过程中插入失败怎么办他们中的?我是否应该在我的代码中控制它?我们使用 BatchStatement 来管理它,这是最好的方法吗?
卡桑德拉版本:2x
首先我想定义一致性。我认为您混淆了 Cassandra 一致性级别与原子性的概念。我认为您关心的是如何使相关表之间的数据保持一致。
Cassandra 可调一致性
Consistency refers to how up-to-date and synchronized a row of Cassandra data is on all of its replicas.
Cassandra is typically classified as an AP system, meaning that availability and partition tolerance are generally considered to be more important than consistency in Cassandra. But Cassandra can be tuned with replication factor and consistency level to also meet C.
Cassandra 最适合不需要强一致性的地方。您最终将获得最新的数据。
现在进入数据建模部分。你走在正确的道路上。 :)
在设计模型之前准备查询非常重要。对于这种情况,有一些可能的解决方案。
- Cassandra 二级索引的使用
您可以在这些列上创建二级索引来查询和获取您想要的数据。这样你就不用管理任何查找表,也不会出现表间数据不一致的情况。但这不是这种情况的好解决方案。原因如下 link:
https://docs.datastax.com/en/cql/3.1/cql/ddl/ddl_when_use_index_c.html
It would probably be more efficient to manually maintain the table as a form of an index instead of using the Cassandra built-in index.
另外,读取速度也会变慢,因为每个节点都必须查询才能获得所需的结果。由于 Cassandra 写入速度快得多,我们维护表(如果需要,每个查询都有表)来做索引和服务查询,并对数据进行非规范化以加快读取速度。但是现在出现了维护这些表之间的数据一致性的问题。如果发生更新,如何确保 indexed/denormalized 数据在所有表中保持一致。
- 使用批量操作
如果要确保这些更新批次之间的原子性,则保持这些表之间的数据一致性(取决于用例)是解决方案。
如果您的系统(集群运行状况)没问题,Cassandra 会确保所有写入成功。但是,如果万一任何写入失败(您无法通过他们的 email/mobile 找到用户是可以的),那么您可以避免批处理(协调器需要做很多工作来维护批处理)。但是这里可以使用batch.
此外,如果您使用的是 Cassandra 3.0,则可以使用物化视图概念,其中 Cassandra 维护表之间的数据一致性。
与此相关的问题太多了
我已经使用 cassandra 一年了,在我的一个项目中,我必须处理各种查找表中的数据,更新、插入和删除......所有这些都是在 "service" 层。我担心的问题之一是一致性,我知道 cassandra 放弃了它以提供可用性和分区(可以调整的内容,但该项目需要 A 和 P 而不是 C)。
当我说一致性时,我正在考虑这种情况:
Keyspace [User] {
userId,
email,
phoneNumber,
firstName,
lastName
} Primary Key (userID)
查找表:
- UserByPhoneNumber
- UserByEmail
- UserByLastName
根据我们使用的架构,当客户端调用 service.save(User user) 时,它会触发对 lookupTables 的操作,将数据填充到所有表中,假设在插入过程中插入失败怎么办他们中的?我是否应该在我的代码中控制它?我们使用 BatchStatement 来管理它,这是最好的方法吗?
卡桑德拉版本:2x
首先我想定义一致性。我认为您混淆了 Cassandra 一致性级别与原子性的概念。我认为您关心的是如何使相关表之间的数据保持一致。
Cassandra 可调一致性
Consistency refers to how up-to-date and synchronized a row of Cassandra data is on all of its replicas.
Cassandra is typically classified as an AP system, meaning that availability and partition tolerance are generally considered to be more important than consistency in Cassandra. But Cassandra can be tuned with replication factor and consistency level to also meet C.
Cassandra 最适合不需要强一致性的地方。您最终将获得最新的数据。
现在进入数据建模部分。你走在正确的道路上。 :)
在设计模型之前准备查询非常重要。对于这种情况,有一些可能的解决方案。
- Cassandra 二级索引的使用
您可以在这些列上创建二级索引来查询和获取您想要的数据。这样你就不用管理任何查找表,也不会出现表间数据不一致的情况。但这不是这种情况的好解决方案。原因如下 link:
https://docs.datastax.com/en/cql/3.1/cql/ddl/ddl_when_use_index_c.html
It would probably be more efficient to manually maintain the table as a form of an index instead of using the Cassandra built-in index.
另外,读取速度也会变慢,因为每个节点都必须查询才能获得所需的结果。由于 Cassandra 写入速度快得多,我们维护表(如果需要,每个查询都有表)来做索引和服务查询,并对数据进行非规范化以加快读取速度。但是现在出现了维护这些表之间的数据一致性的问题。如果发生更新,如何确保 indexed/denormalized 数据在所有表中保持一致。
- 使用批量操作
如果要确保这些更新批次之间的原子性,则保持这些表之间的数据一致性(取决于用例)是解决方案。
如果您的系统(集群运行状况)没问题,Cassandra 会确保所有写入成功。但是,如果万一任何写入失败(您无法通过他们的 email/mobile 找到用户是可以的),那么您可以避免批处理(协调器需要做很多工作来维护批处理)。但是这里可以使用batch.
此外,如果您使用的是 Cassandra 3.0,则可以使用物化视图概念,其中 Cassandra 维护表之间的数据一致性。
与此相关的问题太多了