背景
我们最近启动了一个“大数据”项目,我们想要跟踪用户在使用我们的产品时做了什么 - 他们登录的频率,他们点击的功能等等 - 您的基本用户分析内容。我们仍然不确切地知道我们会问什么问题,但大多数问题将是“过去几个月X出现的频率是多少?”事物的类型,所以我们开始存储数据,而不是后来认为我们可以随时迁移,重新塑造等等,但如果我们不存储它就会永远消失。
我们现在正在研究我们可以提出的问题。在典型的RDBMS中,这个阶段包括对许多不同维度的数据进行切片和切割,导出到Excel,生成图形,查找趋势等等 - 对于Cassandra来说,这似乎很难做到。
目前我们正在使用Apache Spark,并提交Spark SQL作业来对数据进行切片和切块。这实际上工作得很好,我们正在获取我们需要的数据,但它相当麻烦,因为我们可以从工作站连接到Spark似乎没有任何本机API,因此我们不得不使用火花 - 提交脚本和一个Spark应用程序,它从命令行包装一些SQL并输出到我们必须阅读的文件。
问题
在一个表(或列系列)中,在3个节点上使用RF 2运行~30列,将INDEX添加到每个非PK列有多糟糕,这样我们就可以使用CQL在任何列上查询它柱?写入的性能是否会产生可怕的影响?磁盘空间使用量会大幅增加吗?
我一直在调查的另一个选项是使用触发器,因此对于插入的每一行,我们填充了另外一些表(基本上是自定义二级索引表) - 这是一种更可接受的方法吗?有没有人对触发器的性能影响有任何经验?
答案 0 :(得分:1)
添加更多索引的影响: 这实际上取决于您的数据结构,分布以及访问方式;在将此过程与RDMS进行比较之前,您就是对的。对于Cassandra,最好先定义查询,然后再构建数据模型。
这些人对二级索引的性能影响进行了很好的描述: https://pantheon.io/blog/cassandra-scale-problem-secondary-indexes
主要影响(来自帖子)是二级索引是每个节点的本地索引,因此为了通过索引值满足查询,每个节点必须查询自己的记录以构建最终结果集(而不是主要密钥查询,确切地知道哪个节点需要被请求。因此,不仅会影响写入,还会影响读取性能。
在计算数据模型的性能方面,我建议使用cassandra-stress工具;您可以将它与Datastax构建的数据建模工具结合使用,以快速生成配置文件yamls: http://www.datastax.com/dev/blog/data-modeler
例如,我在默认表上运行基本压力配置文件,然后使用二级索引,并且“带索引”批量写入需要花费超过40%的时间才能完成。 GC操作/持续时间等也有所增加。