0

我已经建立了一个 3 节点集群(Cassandra 1.2.1)和一个复制因子为 3 的列族。

列族称为 metric_hour 并使用列名称保存一小时的 15 秒平均值:

  • 帐户名称
  • 指标名称
  • 值类型(字符串)
  • 单位类型(字符串)
  • m0
  • 米1 ...
  • m239

我正在并行运行 6 个客户端,每个客户端都将数据推送到集群,总共有 210 万个指标值(一个指标为一整年的 15 秒值)。因为我不想为每个度量值读取和写入数据,我正在计算 metric_hours 的完整列表以预先存储并在最后将它们发送到集群,刚刚超过 8500 个插入。使用 BEGIN BATCH ... END BATCH 以 50 个为一组对刀片进行批处理;

大约 5-6 分钟后,Cassandra 集群不堪重负,堆满,节点开始出现故障(要么变得无响应,要么完全死亡)。我已经多次运行此设置,结果相同。

每个 cassandra 节点都在自己的专用硬件、四核 2.3 GHz Intel i7 CPU 和 16GB 物理 RAM 上运行(这些是 Mac Mini Server 机器。数据保存在内部 SSD 上)。我已经通过 cassandra-env 在 2 到 8 GB 的范围内设置了 -Xmx 和 -Xmn。使用 8GB 运行可使集群运行更长时间,但在短时间内仍会失败。

我还将一致性级别设置为 QUORUM,这可以使集群保持更长时间的活动。一分钟左右。

所有 CQL 查询都使用 Datastax java-driver 和 CQL3 发送到 Cassandra 集群。我试过打开和关闭row_cache。

在 Riak 集群上运行完全相同的设置在相对较长的时间内没有问题。所以我想知道 Cassandra 设置可以改进什么,或者可能有什么问题。

4

1 回答 1

2

我们每个节点有 10 亿行,在 10 亿行时遇到了 RAM 问题,稍后会解释(使用 PlayOrm 进行 cassandra)。

50个批次就不错了。我不敢相信你只用了 8500 个插入的 RAM。这是没有意义的。你在哪个版本?RAM 问题与布隆过滤器和索引采样有关,您需要使用 8G 的 RAM 达到 10 亿才能出现问题。

要拥有更多行,就像我们即将做的那样,尝试使用 Leveled Compaction STrategy 的 1.2.2。索引采样(cassandra.yaml)可能也可以降低。Bloomfilters 每 10 亿行占用大约 2 Gig RAM。我们每个节点有超过 10 亿行,因此遇到了内存问题。我们有 32 台 gig RAM 机器,但 cassandra 将其自动配置为 8G RAM,因为 jdk GC 在 8G 以上时变得很糟糕。最近,我们将 JVM 提高到 12G 以解决这个问题,直到我们可以使用 LCS 关闭bloomfilters(我们希望这有助于我们每个节点处理 50 亿行)。

从 1.1.4 迁移到 1.2.2 显着减少了 RAM 使用量(我们今天实际上正在运行升级,但在生产中的节点 5 上进行了测试,发现对于相同数量的行使用更少的 RAM)。我们确实希望通过切换到水平压缩策略来获得 50 亿行时间序列数据,默认情况下不再使用布隆过滤器(布隆过滤器占用 RAM,更多行 = 使用更多 RAM)。

院长

于 2013-03-05T13:50:27.007 回答