我最近在调查我以前的问题时似乎遇到了一个非常有趣的问题——一个 ColumnFamily 只将数据放置在 4 个节点中的 3 个上
我们有一个很长的行,里面有超过 800,000 列。它存储用户详细信息;每个用户的详细信息占一列。不了解这种设计背后的原因,根据文档,这应该没问题,但我们遇到了巨大的性能问题。
似乎整行都被操作系统缓存了,而 Cassandra——因为它是相当经常使用的行——花费了大部分 CPU 时间来序列化该行以从中获取数据(即使应用程序查询是关于行中的特定列)。
我做的第一件事就是在存储此行的 ColumnFamily 上启用行缓存。这似乎立即解决了 CPU 使用率过高的问题,也解决了性能问题……直到第一次安排的手动修复。
在手动修复的某个时刻(可复制;每次我尝试运行手动修复时都会发生这种情况),节点与其他节点失去联系(反之亦然!)并且所有受影响的节点(通常是四个中的两个)都报告堆几乎已满(堆已满 0.9977127109734825...)。受影响的节点正在死亡(例如 Cassandra,而不是主机本身)。
我们已经解决了根本问题——改变了在有问题的 ColumnFamily 中存储数据的方式,但是我仍然不明白为什么我会遇到这些问题,如果有人能阐明问题的潜在根源,我将不胜感激?
我们所做的事情真的很糟糕吗?
我们使用的是 0.8.7,超过 4 个节点的集群,RF=3。堆设置为 16GB,这些是 48GB 的盒子。