为什么有人会在一个Cassandra行中存储多行?

时间:2014-12-12 08:53:23

标签: json performance cassandra

我正在寻找在Cassandra中存储嵌套动态文档的方法,并找到了一个演示文稿,他们建议只创建几行并在每行中存储许多JSON对象:https://speakerdeck.com/dzello/store-json-the-hard-way?slide=112

我理解根据属性路径创建列名的想法,我理解连接较小的对象通常会导致更高的吞吐量,但我认为这是一个很大的开销。

每行存储单个对象的C *中的性能是否真的如此糟糕,以至于创建列表的这个混乱是否值得?是否有关于C *的遗漏?

1 个答案:

答案 0 :(得分:4)

在Store Json Hard Way幻灯片中,应该注意到这些是Cassandra的专家,他们在Cassandra的正常操作之外执行大量的辅助压缩和墓碑清除。

数据位置是获得卓越性能的关键,在单个C *分区中拥有多个逻辑行是关键。所有CQL模式定义都旨在使开发人员更容易指定同一分区中的数据。

例如

CREATE TABLE soda_sold_per_store ( 
    store text, date timestamp, soda_name text, soda_count int, 
    PRIMARY KEY (store,date,soda_count,soda_name)

描述一个表,其中每个商店只有一个Cassandra分区,在该分区内,信息按日期排序,然后是soda_count,最后是soda_name。

这意味着查询特定商店中销售的苏打水的数量随着时间的推移会非常快(它们只会打到已经在磁盘上排序的连续数据的单个分区。)但是,此架构的其他查询会非常困难,例如“特定日期所有商店的苏打水总量是多少?”涉及所有存储的查询需要使用此表从所有节点接收数据,并且数据在磁盘上不会是连续的。 Cassandra强加了这种权衡,很好的模型化表格会非常快,但它们只能快速进行某些查询。幸运的是,在Cassandra写的非常便宜,所以通常的做法是拥有多个表,每个表都满足您的一个高需求查询。