Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
随着节点上数据的增加,Cassandra读取性能会下降 使用的数据库:Datastax cassandra社区3.0.9 集群:3 x(8核15GB AWS c4.2xlarge),300GB io1,3000iops 写入一致性:仲裁,读取一致性:一次复制 系数:3_Cassandra - Fatal编程技术网

随着节点上数据的增加,Cassandra读取性能会下降 使用的数据库:Datastax cassandra社区3.0.9 集群:3 x(8核15GB AWS c4.2xlarge),300GB io1,3000iops 写入一致性:仲裁,读取一致性:一次复制 系数:3

随着节点上数据的增加,Cassandra读取性能会下降 使用的数据库:Datastax cassandra社区3.0.9 集群:3 x(8核15GB AWS c4.2xlarge),300GB io1,3000iops 写入一致性:仲裁,读取一致性:一次复制 系数:3,cassandra,Cassandra,问题: 我在服务器上加载了50000个用户,每个用户最初有1000条记录,之后,每个用户又添加了20条记录。我想获取后来添加的20条附加记录(查询:select*from table,其中userID='xyz'和timestamp>123),其中userID和timestamp是主键的一部分。当我只有50000个用户时,它工作得很好。但只要我再添加20GB的虚拟数据,同一查询的性能(即为50000个用户获取20条额外记录)就会显著下降。读取性能随着数据的增加而降低。据我所知,这不应该发生,因为

问题: 我在服务器上加载了50000个用户,每个用户最初有1000条记录,之后,每个用户又添加了20条记录。我想获取后来添加的20条附加记录(查询:
select*from table,其中userID='xyz'和timestamp>123
),其中userID和timestamp是主键的一部分。当我只有50000个用户时,它工作得很好。但只要我再添加20GB的虚拟数据,同一查询的性能(即为50000个用户获取20条额外记录)就会显著下降。读取性能随着数据的增加而降低。据我所知,这不应该发生,因为密钥被缓存,额外的数据应该无关紧要

可能的原因是什么?CPU和RAM的利用率可以忽略不计,我无法找出导致查询时间增加的原因。 我曾尝试将压缩策略更改为“
leveledcompression
”,但也没有成功

编辑1

编辑2 堆大小为8GB。20GB数据的添加方式与最初添加4GB数据(50k用户ID)的方式类似,这是为了模拟真实场景。20GB数据的“userID”和“timestamp”不同,是随机生成的。场景是,我有50k个用户标识,有1020行,其中首先添加了1000行,然后在某个时间戳之后添加了20行,我正在获取这20条消息。如果只存在50k个用户ID,它可以正常工作,但是一旦我有更多的用户ID(额外的20GB),并且我尝试获取相同的20条消息(对于最初的50k个用户ID),性能就会下降。

编辑3

读取性能随着数据的增加而降低

只有在同一分区中添加了大量记录时,才会发生这种情况

据我所知,您的桌子可能看起来像:

CREATE TABLE tbl (
    userID text,
    timestamp timestamp,
    ....
    PRIMARY KEY (userID, timestamp)
);
当单个分区中的数据量为“绑定”时(例如,单个分区中最多有10k行),此模型就足够了。原因是
协调器在处理“未绑定”查询时承受了很大的压力(这就是为什么非常大的分区是一个很大的禁忌)

这个“规则”很容易被忽略,最终的结果是整体速度减慢,这可以简单地解释为:C*需要读取越来越多的数据(并且只从一个节点读取)来满足您的查询,使协调器保持忙碌,并减慢整个集群的速度。数据增长通常意味着查询响应缓慢,并且在达到某个阈值后,会出现臭名昭著的读取超时错误

有人告诉你,看看你的磁盘使用情况是“正常”还是出了什么问题会很有趣。使用
dstat-lrvn
来监视您的服务器


最后一个提示:根据您使用
SELECT*
查询的字段数量和检索到的数据量,由SSD提供服务可能不是什么大问题,因为您不会利用SSD的IOPS。在这种情况下,选择普通HDD可以降低解决方案的成本,而且您不会受到任何惩罚。

在添加额外的20 GB虚拟数据之前,原始数据的大小是多少?@Edmon:4.2GB在添加20 GB虚拟数据之前就已经存在。请查看本文。这可能对你有帮助。我认为您的单个节点过载:@Edmon:My partition key在集群中的所有3个节点上分发数据。所以这种可能性被排除了。另外,当我使用4.2GB数据读取时,如果读取吞吐量正常,但当我添加20GB数据时,吞吐量会下降。我的问题是,20GB虚拟dta与读取性能有什么关系?我将userID和timestamp作为主键,这些键被缓存。@AtmeshMishra RF=3表示所有3个节点都获得相同的数据,您的数据被复制3次。如果要在集群中传播数据,可以使用RF=1。缓存密钥的事实意味着只保存一个IOPS(而且您有SSD,所以这根本不是问题)。您的数据未缓存,必须读取。您的表是正确的。对于每个用户标识,记录不超过1200条,即在这种情况下,每个分区的数据是有界的。我每次查询获取的字段不超过8个。我附上了有问题的dstat输出的屏幕截图。@AtmeshMishra屏幕截图显示,机器一直在以大约110MB/s的速度读取数据。您是在查询过程中拍摄了屏幕截图还是机器闲置(从您的角度来看)?机器可能没有IOPS或吞吐量了。我在loadtest中运行查询时拍摄了屏幕截图。如上所述,我有3000 iops的磁盘,aws cloudwatch显示最大读取操作数为1100-1400次/秒。顺便说一句,我也有同样的想法,所以我将iops编辑为15000(300GB磁盘的最大iops),结果仍然是一样的。这里的问题是,为什么额外的数据会影响读取性能?@AtmeshMishra您能告诉我们您用于插入此虚拟数据的查询吗?还向我们展示一些虚拟数据值。顺便说一句,在这种情况下,如果不是IOPS,那就是吞吐量IMHO。我使用了“插入到tbl(userID,text,timestamp)值(??)。我使用随机userID,text和timestamp来填充数据。另外,我刚刚意识到您计算的表是错误的,userID是PK的一部分,而不是文本。