如果性能不重要,在 Cassandra 中使用 INDEX 是否很糟糕?

Posted

技术标签:

【中文标题】如果性能不重要,在 Cassandra 中使用 INDEX 是否很糟糕?【英文标题】:Is it bad to use INDEX in Cassandra if performance is not important?如果性能不重要,在 Cassandra 中使用 INDEX 是不是很糟糕? 【发布时间】:2015-12-07 17:32:18 【问题描述】:

背景

我们最近启动了一个“大数据”项目,我们希望在该项目中跟踪用户使用我们的产品所做的事情——他们登录的频率、他们点击了哪些功能等等——你的基本用户分析资料。我们仍然不知道我们将要问什么问题,但大部分都是“X 在过去 Y 个月内发生的频率?”类型的东西,所以我们开始尽早存储数据,而不是以后认为我们总是可以在需要时迁移、重新塑造等,但如果我们不存储它,它就永远消失了。

我们现在正在研究可以提出什么样的问题。在典型的 RDBMS 中,这个阶段将包括对许多不同维度的数据进行切片和切块、导出到 Excel、生成图表、寻找趋势等 - 对于 Cassandra 来说,这似乎是相当困难的。

目前我们正在使用 Apache Spark,并提交 Spark SQL 作业以对数据进行切片和切块。这实际上工作得很好,我们正在获取我们需要的数据,但它相当麻烦,因为似乎没有任何我们可以从我们的工作站连接到 Spark 的本机 API,所以我们被困在使用 spark-提交脚本和一个 Spark 应用程序,该应用程序从命令行包装一些 SQL 并输出到一个文件,然后我们必须读取该文件。

问题

在具有约 30 列的表(或列族)中,在 RF 2 的 3 个节点上运行,向每个非 PK 列添加 INDEX 会有多糟糕,这样我们就可以简单地使用 CQL 在任何柱子?会不会对写入的性能产生可怕的影响?磁盘空间使用量会大幅增加吗?

我一直在研究的另一个选项是使用触发器,因此对于插入的每一行,我们填充了另外一些表(本质上是自定义二级索引表)——这是一种更容易接受的方法吗?有人对触发器的性能影响有任何经验吗?

【问题讨论】:

【参考方案1】:

添加更多索引的影响: 这实际上取决于您的数据结构、分布以及您如何访问它;当您将此过程与 RDMS 进行比较时,您是对的。对于 Cassandra,最好先定义查询,然后再构建数据模型。

这些人对二级索引的性能影响写了一篇很好的文章: https://pantheon.io/blog/cassandra-scale-problem-secondary-indexes

主要影响(来自帖子)是二级索引对于每个节点都是本地的,因此为了通过索引值满足查询,每个节点都必须查询自己的记录来构建最终结果集(而不是主索引)关键查询,其中确切知道需要查询哪个节点)。因此,不仅会影响写入,还会影响读取性能。

在计算数据模型的性能方面,我建议使用 cassandra-stress 工具;您可以将它与 Datastax 构建的数据建模工具结合使用,以快速生成配置文件 yaml: http://www.datastax.com/dev/blog/data-modeler

例如,我在默认表上运行了不带二级索引的基本压力配置文件,然后使用二级索引运行,“带索引”批次的写入花费了 40% 多一点的时间来完成。 GC 操作/持续时间等也有所增加。

【讨论】:

以上是关于如果性能不重要,在 Cassandra 中使用 INDEX 是否很糟糕?的主要内容,如果未能解决你的问题,请参考以下文章

利用雅虎ycsb对cassandra做性能测试

使用昆德拉 ORM 编写 Cassandra 的性能

使用Spark+Cassandra打造高性能数据分析平台

cassandra如何使用memtable处理更新

许鹏:使用Spark+Cassandra打造高性能数据分析平台

问底许鹏:使用Spark+Cassandra打造高性能数据分析平台