将节点添加到 Cassandra 集群会导致现有节点上的 CPU 过载

Posted

技术标签:

【中文标题】将节点添加到 Cassandra 集群会导致现有节点上的 CPU 过载【英文标题】:Adding node to Cassandra cluster causes CPU overload on existing nodes 【发布时间】:2014-10-25 09:26:30 【问题描述】:

所以,这是我们目前的设置:

Cassandra 2.0.10,JDK 1.7.0_65-b17 6 个节点(EC2 c3.8xlarge/32 核/60GB RAM,用于数据的 EBS 磁盘, 用于提交日志等的临时 SSD) 相当重的写入负载 - 100Ks/秒 RF=2,1 个直流,2 个机架 在 CPU 消耗低的情况下一切正常 - 平均负载通常在 4-10 左右

现在,我们正在尝试添加一个节点。这种情况下现有节点上的负载很重 - 例如平均负载超过 100 个。集群变得无响应,写入和读取大多失败。

奇怪的观察结果是: - 不添加新节点 CPU 低 - 如果我们在现有节点上添加新节点的同时关闭写入,平均负载会下降到 4-10 并且新节点就好了

我检查了 VisualVM 采样,基本上现有节点上的所有 CPU 都由 org.jboss.netty.channel.socket.nio.SelectorUtil.select() 消耗。

到目前为止我们尝试了什么:

限制流式传输 - 无影响 禁用节点间压缩 - 没有影响 在现有节点上禁用自动压缩 - 没有影响 即使使用 -Dorg.jboss.netty.epollBugWorkaround=true 运行 - 没有影响

到目前为止,我们有点绝望,因为这种行为对我们来说是一个障碍——我们不能承受丢失的写入,我们需要动态扩展 C*。

有人遇到过类似的吗?任何想法/提示?谢谢

编辑:操作系统是 Ubuntu 12.04

编辑:我仍然不知道是什么导致了上述行为,我仍然很好奇。 OTOH,通过使用以下操作序列,我设法添加了几个节点,没有任何中断、cpu 使用率增加等:

设置 auto_bootstrap: false 开始节点,加入 在这个新节点上运行 nodetool rebuild 宾果游戏

此方案将作为我们案例的解决方法。但是看起来有点笨拙

【问题讨论】:

【参考方案1】:

你试过Cassandra virtual node吗? 我猜在 RF=2 的情况下,当您尝试添加一个新节点时,2 个现有节点将非常忙于将它们的数据传输到新节点,同时响应您的繁重写入负载,这可能会导致热发现问题。

【讨论】:

抱歉,错过了这个细节 - 我们使用的是具有 256 个令牌的虚拟节点哈希环。至于重负载 - 事情是每个活动(加入,写入)分别不会导致超过 8 的平均负载,这就像 CPU 的 25%。他们一起将其旋转到 300% cpu(LA 像 120) 哦,好的。实际上,我们从不在如此繁重的运行时间添加节点,而是在晚上或周末添加节点。你的写负载总是那么重?我们的集群规格比你的低很多,我们在添加新节点时确实遇到了一些麻烦,但结果最终还是不错的。 是的,不幸的是负载是永久性的。实际上,这现在只是一个 PoC,在生产中我们期望 x4 负载:-( 哦,好的,我会密切关注您的问题,看看是否可以解决。请告诉我有关此的最新信息,谢谢 当然,我会的。感谢您的及时反应和支持

以上是关于将节点添加到 Cassandra 集群会导致现有节点上的 CPU 过载的主要内容,如果未能解决你的问题,请参考以下文章

在 Cassandra 的现有集群(数据中心)中添加节点时面临的问题

将单个令牌节点添加到现有的 datastax cassandra 集群和数据传输不起作用

cassandra 调试问题

将节点添加到 Cassandra 集群

如何加快 cassandra 集群中的节点加入过程

Cassandra 3.x - 将 3 个节点添加到 6 节点集群