使用的数据库:Datastax cassandra community 3.0.9 集群:3 x(8核64GB AWS),300GB io1和3000iops。 分配的Java堆内存= 8g 写入一致性:仲裁,读取一致性:ONE复制因子:3
问题:我为我们的服务器加载了50,000个用户,每个用户最初都有1000条记录,过了一段时间后,每个用户又添加了20条记录。我想获取之后添加的20条额外记录(查询:从表中选择*,其中userID =' xyz'以及时间戳> 123)
CREATE TABLE tbl (
userID text,
timestamp timestamp,
....
PRIMARY KEY (userID, timestamp)
);
除了50,000个用户的原始数据之外,我已经向tbl添加了额外的200GB数据。
堆内存使用量在2-4 GB范围内,但几乎所有剩余的堆内存(56 GB)都被cassandra吃掉了。
从这一点开始,如果向表中添加更多数据,由于内存不足,会导致读取吞吐量急剧下降。
虽然它符合读取吞吐量SLA,但似乎不是可扩展的解决方案 - (3 x 64 GB)RAM用于200 GB数据。
注意:
堆内存使用率高的可能原因是什么?
答案 0 :(得分:0)
如果您的分区非常大,那么阅读时间会更长。由于您的数据由userid分区,因此与每个用户ID关联的所有数据都存储在磁盘上的单个分区中(在分区内,您的数据按时间戳排序 - 您的群集密钥)。在阅读时,cassandra必须遍历整个分区才能找到您在读取时请求的数据。如果每个用户标识都有大量与之关联的数据,则磁盘上可能会有相当大的分区,这需要更长的时间来读取。