1

运行 4 节点集群 cassandra 版本 2.0.9。最近一个月以来,我们看到所有节点上的 CPU 使用率大幅飙升。

节点状态

tpstats 给了我很高的本地传输请求。附上 3 个节点 tpstats 的屏幕截图

节点 1 节点状态 节点 2 节点状态 节点 3 节点状态

我应该从哪里开始调试?

此外,如果您从第一张图片中看到,当负载变高时,读写变低。这是可以理解的,因为大多数请求都放弃了

4

1 回答 1

2

如何减轻墓碑?我可能每个月都会从我们的开发团队那里收到十几次这个问题。最简单的方法是删除,我对此很认真。否则,您可以对表进行建模,以更好地减轻墓碑问题。

例如,假设我有一个简单的表格来跟踪订单状态。由于一个订单可以有几种不同的状态(待处理、拣货、发货、接收、退回等),一种懒惰的方法是每个订单有一行,然后删除或运行就地更新来更改状态(取决于状态是否是您密钥的一部分)。更好的方法是将其转换为时间序列并通过 TTL 执行删除。该表看起来像这样:

CREATE TABLE orderStatus (orderid UUID,
    updateTime TIMEUUID,
    status TEXT,
    PRIMARY KEY (ordered, status))
with CLUSTERING ORDER BY (updateTime DESC);

假设我知道我真的只关心最多 30 天的订单状态,所以所有状态更新的 TTL 都是 30 天......

INSERT INTO orderStatus (orderid,updateTime,status) 
VALUES (UUID(),now(),'pending') USING TTL 2592000;

该表将支持orderid按更新时间降序排序的订单状态查询。这样,我可以从该表中选择一个 LIMIT 1 的 id,并始终获得最新状态。此外,这些状态将在 30 天后自动删除。现在,TTLing 数据仍然会创建墓碑。但是这些墓碑与新订单(我可能更关心的那些)是分开的,所以我通常不必担心那些墓碑会干扰我的查询(因为它们都分组在我不会的分区中经常查询)。

这是一个例子,但我希望减少墓碑建模背后的想法是明确的。主要的想法是对表进行分区,使墓碑与您最常查询的数据分开。

有没有办法可以监控哪些查询在服务器上运行缓慢?

不,真的没有办法做到这一点。但是,您应该能够向您的开发人员请求所有关于问题键空间/表的查询。这应该很容易,因为一个表实际上应该只能支持一两个查询。如果您的开发人员构建了一个支持 5 或 6 个不同查询的表,那么他们做错了。

当您查看查询时,这些是您应该质疑的一些危险信号:

  • 未绑定的查询(没有 WHERE 子句的 SELECT)。
  • 带有 ALLOW FILTERING 的查询。
  • 二级索引的使用。
  • 使用 IN。
  • 使用 BATCH 语句(我之前见过一个批处理语句翻转节点)。
于 2016-08-28T15:18:36.790 回答