何时使用Cassandra与Solr在DSE中?

8
我正在使用DSE进行Cassandra/Solr集成,以便数据存储在Cassandra中并在Solr中进行索引。使用Cassandra处理CRUD操作并分别使用Solr进行全文搜索非常自然,而DSE确实可以简化Cassandra和Solr之间的数据同步。
然而,在查询方面,实际上有两种方法可供选择:Cassandra二级/手动配置索引与Solr。我想知道何时使用哪种方法,以及一般情况下性能差异如何,特别是在DSE设置下。
以下是我的项目中的一个示例用例。我有一个Cassandra表,存储一些项目实体数据。除了基本的CRUD操作外,我还需要通过某个字段(例如类别)的相等性检索项目,然后按某个顺序排序(在这种情况下是一个like_count字段)。
我可以想到三种不同的处理方式:
1. 在Solr模式中为类别和like_count字段声明“索引=true”,然后在Solr中查询。 2. 创建一个反规范化表,在Cassandra中具有主键(类别、like_count、id) 3. 创建一个反规范化表,在Cassandra中具有主键(类别、顺序、id),并使用外部组件(如Spark/Storm)按like_count对项目进行排序
第一种方法似乎是实现和维护最简单的方法。我只需编写一些微不足道的Solr访问代码,其余的繁重工作将由Solr/DSE搜索处理。
第二种方法需要手动反规范化创建和更新。我还需要维护一个单独的表。如果有过多的删除标记,则可能会出现墓碑问题。好处在于读取可能更快(如果没有过多的删除标记)。
第三种方法可以减轻墓碑问题,代价是需要额外的排序组件。
你认为哪种方法是最佳选择?性能上有什么区别?
1个回答

25

Cassandra的辅助索引有限制使用场景:

  1. 不要超过几个列被索引。
  2. 查询中只能有一个被索引的列。
  3. 对于高基数数据(相对唯一的列值),节点间交互流量太大。
  4. 对于低基数数据(高比例的行将匹配),节点间交互流量太大。
  5. 需要提前知道查询,以便数据模型可以围绕它们进行优化。

由于这些限制,通常的做法是创建“索引表”,其中包含所需的任何列的索引。这要么需要将数据从主表复制到每个索引表中,要么需要在读取索引表后额外执行查询来读取实际行并从主表中读取主键。多列的查询必须提前手动索引,导致临时查询问题。而当数据重复时,需要由程序手动更新到每个索引表中。

除此之外……它们在选择适量的行数和节点数,并且查询已经预先指定且不是临时查询的情况下,可以正常工作。

DSE / Solr更适用于以下情况:

  1. 适度列被索引。
  2. 具有许多列/字段引用的复杂查询——Lucene并行匹配查询中指定的所有字段。Lucene在每个节点上索引数据,因此节点并行查询。
  3. 一般的临时查询,其中精确的查询事先不知道。
  4. 关键字搜索、通配符、模糊/类似、范围、不等式等富文本查询。

使用Solr索引会带来性能和容量成本,因此建议进行概念验证实现,以评估需要多少额外的RAM、存储和节点,这取决于您要索引的列数、索引的文本数量以及任何文本过滤复杂度(例如,n-gram需要更多)。如果所有列都已索引,增加的范围可能在相对较少的索引列的情况下为25%,在所有列均已索引的情况下为100%。此外,您需要足够多的节点,以便每个Solr索引适合于RAM或者在使用SSD时大部分适合RAM。当前不建议在Solr数据中心中使用虚拟节点。


+1 优秀回答。我完全同意辅助索引的使用场景有限。它可能是目前Cassandra中最被误解的工具。 - Aaron
+1 我无法更好地表达了。最近我也遇到了这个困境,发现自己在所有读操作中都使用Solr,因为Cassandra不能在一个查询中过滤多个列(基本上是因为Cassandra二级索引只能在一个列上声明 - 即没有复合索引)。对我来说,这是主要的限制。 - PJ.
太好了,这个答案很棒!您认为SASI索引与DSE / Solr相比如何?我真的很想听听您的意见。 - taylorcressy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接