【问题标题】:Correcting improper usage of Cassandra纠正 Cassandra 的不当使用
【发布时间】:2015-10-22 00:04:56
【问题描述】:

我有一个类似的问题没有得到解答(但有很多 cmets):

How to make Cassandra fast

我的设置: Ubuntu 服务器 AWS 服务 - Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz,4GB Ram。 Cassandra Datastax 社区版的 2 个节点:(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,然后从 datastax 文档中寻找最佳位置: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 启动后我有 72 毫秒,MySQL pre-redis 有 180 毫秒。

【问题讨论】:

    标签: performance cassandra distributed cassandra-2.0


    【解决方案1】:

    第一个问题是您试图对整个系统进行基准测试,而不知道任何单个组件可以做什么。您是否想查看单个操作的速度有多快?或者每秒可以执行多少次操作?他们是不同的价值观。

    我通常建议您从对 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。

    【讨论】:

    • 感谢您的回复并给我一些见解。到目前为止,我已经添加了一些应用程序基准的应用程序基准,而没有内部的 cassandra。我的下一步是采纳您对使用 cassandra-stress 的建议。您能否在答案中添加以下内容:我应该从什么命令开始强调它。我已经从供应商包中切换了驱动程序,因为驱动程序提供异步而不是同步,并且 datastax 建议使用异步而不是大批量。你对此有何看法。请将其添加到您的回复中。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    相关资源
    最近更新 更多