Cassandra 2.0中的高CPU使用率

时间:2016-08-26 05:33:25

标签: cassandra datastax cassandra-2.0 datastax-php-driver

运行4节点集群cassandra版本2.0.9。最近一个 我们看到所有节点的CPU使用量都出现了大幅增长。

Node status

tpstats为我提供了很高的本机传输请求。附上截图 对于3个节点tpstats

节点1 Node status 节点2 Node status 节点3 Node status

我应该从哪里开始调试?

另外,如果从第一张照片中看到负载变高时的读数 写得很低。这是可以理解的大部分 请求丢弃

1 个答案:

答案 0 :(得分:2)

如何减轻墓碑?我可能每个月都会从我们的开发团队那里得到这个问题十几次。最简单的方法是做DELETE,我对此非常认真。否则,您可以通过以更好的方式缓解墓碑的方式对表进行建模。

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

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

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

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语句(我之前看过一个批处理语句翻译节点)。