3

在 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 为项目提供查询时,这会变得复杂。有没有最好的方法呢?

4

2 回答 2

2

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

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

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

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

于 2013-01-16T11:26:26.417 回答
2

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

但它与 ACID 中提到的一致性不同:mighty-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

于 2015-07-17T11:50:37.253 回答