Cassandra数据完整性

时间:2013-01-16 07:21:25

标签: cassandra

在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中的值字段进行必要的更新。当有很多CF为Items提供查询时,这会变得复杂。有没有最好的办法呢?

2 个答案:

答案 0 :(得分:2)

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

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

即使是大型电子商务网站,目录和流程中也只有超过一百万件商品每天超过数百万笔交易。具有主/从复制的MySQL可以轻松处理这么多数据。可以设计一个纯粹基于cassandra的电子商务系统,它可以一致地处理事务,但它需要各种技巧,例如分布式行锁或带有Zookeeper或Hazelcast的外部锁。在这个数据量(数百万行)上,SQL数据库将更快,更简单,更稳定。是的,它会有一个单一的失败点。但是,关闭的电子商务应用程序优于执行随机事务的应用程序。

为了构建一个真正可扩展的系统,Cassandra可能用于处理不需要强一致性的数据,如页面视图:如果单个页面视图事件丢失,数据仍然足以用于数据挖掘,则不会出现问题,机器学习等。

答案 1 :(得分: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