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 容器上启用完整查询日志记录?