【问题标题】:Cassandra performance issueCassandra 性能问题
【发布时间】:2016-11-29 05:13:48
【问题描述】:

我们有一个看起来像这样的表:

CREATE TABLE arc_dynamic.transit_map (
    sal text,
    pfn text,
    transit_map_id text,
    create_program_id text,
    create_timestamp timestamp,
    cutoff_times map<text, text>,
    derived_priority int,
    effective_date text,
    modify_program_id text,
    modify_timestamp timestamp,
    relationship_type_id text,
    solr_query text,
    stop set<text>,
    transit_days map<text, int>,
    trigger_id text,
    PRIMARY KEY (sal, pfn, transit_map_id)
) WITH CLUSTERING ORDER BY (pfn ASC, transit_map_id ASC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99.0PERCENTILE';

CREATE CUSTOM INDEX arc_dynamic_transit_map_create_timestamp_index ON arc_dynamic.transit_map (create_timestamp) USING 'com.datastax.bdp.search.solr.Cql3SolrSecondaryIndex';
CREATE CUSTOM INDEX arc_dynamic_transit_map_derived_priority_index ON arc_dynamic.transit_map (derived_priority) USING 'com.datastax.bdp.search.solr.Cql3SolrSecondaryIndex';
CREATE CUSTOM INDEX arc_dynamic_transit_map_modify_timestamp_index ON arc_dynamic.transit_map (modify_timestamp) USING 'com.datastax.bdp.search.solr.Cql3SolrSecondaryIndex';
CREATE CUSTOM INDEX arc_dynamic_transit_map_relationship_type_id_index ON arc_dynamic.transit_map (relationship_type_id) USING 'com.datastax.bdp.search.solr.Cql3SolrSecondaryIndex';
CREATE CUSTOM INDEX arc_dynamic_transit_map_solr_query_index ON arc_dynamic.transit_map (solr_query) USING 'com.datastax.bdp.search.solr.Cql3SolrSecondaryIndex';
CREATE CUSTOM INDEX arc_dynamic_transit_map_trigger_id_index ON arc_dynamic.transit_map (trigger_id) USING 'com.datastax.bdp.search.solr.Cql3SolrSecondaryIndex';

当我跑步时:

select * from transit_map where sal='XXX_953';

超时:

ReadTimeout: code=1200 [Coordinator node timed out waiting for replica nodes' 
responses] message="Operation timed out - received only 0 responses." info=
{'received_responses': 0, 'required_responses': 1, 'consistency': 'ONE'}

如果我将其限制为 10 行或更少,它就会返回。还有什么,超时。我试图弄清楚哪里出了问题(太多的sstables,墓碑,其他东西),但我不知道如何解决这个问题。

我已启用跟踪。对于 10 行或更少的限制,它不会“看起来太糟糕”(至少它有一些输出)。

当我输入 11 行限制或将其留空(无限制)时,跟踪不会返回任何输出。

非常感谢任何帮助。我来自 Oracle 的长期背景,不知道如何在 Cassandra 中解决这个问题。

【问题讨论】:

  • 您希望该查询返回多少行?

标签: cassandra datastax


【解决方案1】:

创建地图和其他对象是 Cassandra 的繁重操作。 如果此地图不受大小限制,这样的超时是很常见的。

根据个人经验,地图大小不应超过几十个左右。

尝试以地图大小非常受限的方式对您的数据进行建模,甚至更好的是您根本不使用它们。一种解决方案是将transit_days 更改为uuid 类型并拥有一个看起来像这样的连接表:

CREATE TABLE arc_dynamic.transit_map_days_per ( transit_day_id uuid, data text PRIMARY KEY (transit_day_id) )

然后您就可以从该表中获取“地图”作为元组列表并在您的最后进行操作

【讨论】:

  • raam86,非常感谢您抽出宝贵时间就此提供建议。当我在火中学习时,我的下一个问题是:如何知道这确实是问题所在?我要去哪里看?由于 trace 没有输出任何内容,我什至不知道我还要去哪里看。我试图通过在我的 cqlshrc 文件中设置 client_timeout 值来增加我的客户端超时,但它没有帮助。我的猜测是用于连接,而不是查询,但不确定。即使它确实有效,并且我收到了返回的行,是否有任何线索表明地图是问题所在?
  • 最简单的方法是删除有问题的地图,看看会发生什么。你总是可以线程转储。 JVM 转储并搜索 Cassandra 基准,他们有一些我目前不记得的统计工具,还有aryanet.com/blog/cassandra-garbage-collector-tuning
  • raam86,感谢您的提醒。我从团队中的其他人那里发现,他们在地图中的项目从未超过 14 个,而问题实际上是我们正在使用的 datastax 版本的一个错误,而压缩和修复解决了这个问题。不过,我非常感谢您的回复,并将更多地使用它。每天学习更多...
  • 你用的是什么版本?你能详细说明一下吗?
  • 当然。以下是通过电子邮件发送给我的内容:“XXXXX 昨晚在 transit_map 键空间上运行了压缩,它解决了问题。这是 DSE 4.72 中的错误,已在 4.8.X 中解决。”不确定错误编号。有兴趣可以拿下。
猜你喜欢
  • 2016-02-10
  • 2020-01-26
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 2014-10-13
  • 2017-02-23
  • 2011-07-19
相关资源
最近更新 更多