我已经建立了一个 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 设置可以改进什么,或者可能有什么问题。