Cassandra 数据完整性

Posted

技术标签:

【中文标题】Cassandra 数据完整性【英文标题】:Cassandra Data Integrity 【发布时间】:2012-12-30 11:07:36 【问题描述】:

在 cassandra 中维护数据完整性的最佳方法是什么?我使用 cassandra 作为电子商务应用程序的主要数据存储。非规范化后数据分散在多个列族中。例如如果我有一个“项目”CF 为:

CF: Items
------------------------------------------------
       | itemName |  price  |  rating  |
ItemId |----------|---------|----------|  ...
       |   value  |  value  |   value  |
------------------------------------------------

我可以有另一个列族来满足查询以获得“所有评分为 5 的项目”。查询列族可以包含有关特定项目的附加信息。

CF: ItemsByRating
----------------------------------------------------------------
         |   itemId1     |   itemId2     |   itemId3     |
5 rating |---------------|---------------|---------------| ...
         | item1 details | item2 details | item3 details |
-----------------------------------------------------------------

我有一个守护程序正在运行,它会收到有关“Items”CF 详细信息更改的通知,并对“ItemsByRating”CF 中的 value 字段进行必要的更新。当有很多 CF 为项目提供查询时,这会变得复杂。有什么最好的方法吗?

【问题讨论】:

“当有很多 CF 为 Item 查询提供服务时,这会变得很复杂”,请详细说明。 【参考方案1】:

对于这种特殊情况(查询具有指定评分的项目),最好在Items CF 中的rating 列上使用二级索引。 Cassandra 将负责索引更新,它比任何外部守护程序都要快得多。在 cassandra 中实现一个提供完整性保证的守护进程非常困难,因为它需要实现整个故障转移层。

至于一般问题(Cassandra 上的电子商务网站),我建议在 Cassandra 外部保持一致的数据,例如在 SQL 数据库中。

即使是大型电子商务网站,目录中的商品也几乎没有超过一百万,每天处理的交易也超过几百万。具有主/从复制功能的 mysql 可以轻松处理这么多数据。可以设计一个完全基于 cassandra 一致地处理事务的电子商务系统,但它需要各种技巧,例如分布式行锁或使用 Zookeeper 或 Hazelcast 的外部锁。在这样的数据量(数百万行)上,SQL 数据库将更快、更简单、更稳定。是的,它会有单点故障。但宕机的电子商务应用比执行随机交易的应用要好。

要构建一个真正可扩展的系统,Cassandra 可能用于处理不需要强一致性的数据,例如页面浏览量:如果单个页面浏览事件丢失也不是问题,数据仍然足以进行数据挖掘、机器学习等。

【讨论】:

【参考方案2】:

Cassandra 中有可配置的一致性: docs.datastax.com/en/cassandra/2.0/cassandra/dml/dml_config_consistency_c.html

但它不是 ACID 中提到的一致性: 强大的titan.blogspot.com/2012/06/understanding-cassandras-consistency.html

Cassandra 的主要问题:没有交易。这特别意味着“没有回滚”。 Cassandra 的理论是:大多数用例不会覆盖相同的数据,而当它们覆盖时,大多数时候您不需要完全回滚: http://docs.datastax.com/en/cassandra/2.0/cassandra/dml/dml_ltwt_transaction_c.html

【讨论】:

以上是关于Cassandra 数据完整性的主要内容,如果未能解决你的问题,请参考以下文章

查询完整的 cassandra 表时,Spark Job 只会停止

如何在 Cassandra 4.0 Docker 容器上启用完整查询日志记录?

我可以在 cassandra 数据库上使用 spark hivecontext 吗?

推荐系统Lambda架构介绍:推荐系统的完整架构设计

探索Cassandra的去中心化分布式架构

全面梳理关系型数据库和NoSQL的使用情景