纠正Cassandra的不当使用

时间:2015-10-22 00:04:56

标签: performance cassandra distributed cassandra-2.0

我有一个类似的问题没有答案(但有很多评论):

How to make Cassandra fast

我的设置: Ubuntu服务器 AWS服务 - 英特尔(R)Xeon(R)CPU E5-2680 v2 @ 2.80GHz,4GB Ram。 2个Cassandra Datastax社区版节点:(2.1.3)。 PHP 5.5.9。使用datastax php-driver

我来自MySQL数据库知识,在ElasticSearch(现在称为Elastic)和MongoDB方面,在文档存储方面具有非常基本的NoSQL实践。

当我读到如何使用Cassandra时,这是我理解的子弹

  • 分发
  • 您可以使用复制的响铃来分发数据
  • 您需要建立分区键以实现最高效率
  • 重新考虑您的查询而不是使用索引
  • 根据查询而非数据建模
  • 删除不好
  • 您只能从主键集的第二个键开始排序
  • Cassandra有“快速写”

我有一个PHP Silex框架API,它接收批量json数据,并且至少插入4个表中,最多6个(主要是由于我需要的不同类型的排序)。

起初我只有两个Cassandra节点。我运行Apache Bench进行测试。然后我添加了第三个节点,并且在更高的批量大小并发性的情况下,它几乎没有被削减一小段时间。

Concurrency Batch size  avg. time (ms) - 2 Nodes avg. time (ms) - 3 Nodes
1                 5                   288              180
1                 50                  421              302
1                 400                 1 298            1 504
25                5                   1 993            2 111
25                50                  3 636            3 466
25                400                 32 208           21 032
100               5                   5 115            5 167
100               50                  11 776           10 675
100               400                 61 892           60 454

批量大小是每次调用时的条目数(到4-6个表)。 所以批量5,意味着它正在制作5x(4-6)表插入数据。在更高的批量大小/并发性时,应用程序会超时。

表格中有5列数据相对较小(大多数是int,文本长度不超过10个字符)

我的密钥空间如下:

 user_data | True | org.apache.cassandra.locator.SimpleStrategy | {"replication_factor":"1"}

我的“主要”问题是:我做错了什么?考虑到Cassandra是以非常高的写入速度在BigDataTable上构建的,这似乎是相对较小的数据集。

  • 为了加快速度,我是否会添加3个以上的节点?
  • 我是否更改了复制因子并进行了Quorum / Read / Write,然后从数据共享文档中寻找最佳位置:http://docs.datastax.com/en/cassandra/2.0/cassandra/dml/dml_config_consistency_c.html
  • 我是否切换框架,例如,将node.js用于更高的并发性。
  • 我是否在修改表格,因为我没有很好的例子来说明如何有效地使用列族?我需要一些暗示这个。

对于表格问题: 我正在跟踪用户的历史记录。用户有一个事件并且与媒体ID相关联,并且还有额外的元数据。 所以列是:event_type,user_id,time,media_id,extra_data。 我需要对它们进行不同的排序,因此我为它们制作了不同的表格(因为我理解Cassandra数据建模应该如何工作......我可能错了)。因此,我正在复制各种表格中的不同数据。

帮助?

在此编辑

该应用程序还为其他感兴趣的CRUD点附加了redis和mysql,例如检索用户数据并将其缓存以便更快地获取。 到目前为止,在使用MySQL和Redis激活的平台上,我在Redis启动后有72ms,在MySQL预启动时有180ms。

1 个答案:

答案 0 :(得分:2)

第一个问题是您在不知道任何单个组件可以做什么的情况下尝试对整个系统进行基准测试。您是否试图了解单个操作的速度有多快?或者你每秒可以做多少次操作?他们有不同的价值观。

我通常建议您从Cassandra基准测试开始。现代Cassandra通常每台服务器每秒可执行20-120k次操作。 RF = 3时,这意味着介于5k到40k读/秒或写/秒之间。使用cassandra-stress确保cassandra正在按照您的期望进行操作,然后尝试在您的应用程序中循环并查看它是否匹配。如果你慢下来,那么你知道应用程序是你的瓶颈,你可以开始考虑各种改进(不同的驱动程序,不同的语言,异步请求而不是同步等)。

现在,你做得太多,分析太少。将问题分解成更小的部分。解决各个部分,然后把拼图放在一起。

编辑:Cassandra 2.1.3变得越来越老了。它有一些严重的错误。使用2.1.11或2.2.3。如果您刚刚开始开发,2.2.3可能没问题(让我们假设您实际上会以2.2.5左右的速度投入生产)。如果您准备明天开始生产,请使用2.1.x。