2012-09-13 41 views
3

我来自RDBMS背景,设计一个Cassandra作为后端的应用程序,我不确定我设计的有效性和可扩展性。Cassandra DB Design

我正在研究书籍/电影等的某种评价/反馈应用程序。由于卡桑德拉具有灵活的列族的概念(稀疏结构),我想用下面的架构:

user-id (row key): book-id/movie-id (dynamic column name) - rating (column value) 

如果我这样做,这样一来,我会最终拥有数以百万计的列(这本来是行在RDBMS)虽然没有本质上与行键相关联,例如:

user1: {book1:Rating-Ok; book1023:good; book982821:good} 
user2: {book75:Ok;book1023:good;book44511:Awesome} 

由于所有列族都存储在一个单一的文件,我不知道这是否是一个可扩展的设计(或设计可言!)。此外,可能会有像"pick all 'good' reviews of 'book125'"这样的查询。 我应该使用什么方法?

回答

2

此设计具有完美的可扩展性。 Cassandra以稀疏的形式存储数据,因此空单元不消耗磁盘空间。

缺点是卡桑德拉在按价值进行索引时不是很好。有二级索引,但它们应该只用于索引一列或两列,而不是每列数百列。

有两个选项来解决这个问题:

  • 物化视图(描述,例如,在这里:http://maxgrinev.com/2010/07/12/do-you-really-need-sql-to-do-it-all-in-cassandra/)。这允许构建一些预定义的查询,可能非常复杂。
  • 临时查询可以通过某种映射/缩减作业实现,它可以有效地迭代整个数据集。这听起来很可怕,但仍然非常快:Cassandra将所有数据存储在SSTables中,并且可以实现这种迭代以顺序扫描数据文件。从查询的一组期望的
2

启动和组织你的列族来支持这些观点。尤其是在涉及的领域非常少的情况下,每个CF都可以以自己的数据索引视图的方式低价操作。在提取期间,密钥最终将数据分区到一个特定的Cassandra节点,该节点可以按照预定顺序将一组宽行快速地传输到您的应用服务器。这对Cassandra的优势之一起到了作用,因为与在RDBMS表的索引搜索中围绕各种轨道和扇区进行的弹跳相比,物理介质上的读取碎片(当未被缓存时)非常低。

一个可用时是选择你的关键段中的数据,从而在该段中的所有列的全扫描是一个合理的命题,和良好的粗糙适合您的查询有用的方法。然后,即使您的客户端(应用程序服务器)执行了过滤,也可以过滤不需要的内容。所有对电影的评论都是一个很好的例子。即使您过滤了正面评论或仅提供最近的评论或摘要,您仍然可以合理地获取该密钥的所有行,然后抛弃不需要的内容。

0

另一种选择是,如果你能弄清楚(按类别,按时间)如何对数据进行分区,playOrm提供做S-SQL变成一个分区,这是非常快的解决方案。它非常类似于RDBMS,除非您对数据进行分区以保持可伸缩性,并且可以拥有任意数量的分区。分区可以包含数百万行(尽管在分区中我不会超过1000万行)。

以后, 院长