Cassandra—同一节点上的表扫描的读取延迟有很大变化

Cassandra—同一节点上的表扫描的读取延迟有很大变化,cassandra,Cassandra,我在Cassandra2.x集群中看到了非常奇怪的行为 如果我执行以下查询(使用CL ONE或LOCAL_ONE) 在同一个节点上,查询可以随机花费20ms或800ms(该表大约有600行) 在第一种情况下,大约执行100次顺序扫描,在第二种情况下,大约执行2000次顺序扫描。我不知道为什么系统会表现出这种不确定性行为 这个问题只发生在DC2(5个节点的RF=5)中,而在DC1(3个节点的RF=3)中,相同的查询总是在15毫秒左右返回。另外值得一提的是,DC2是通过从DC1流式传输创建的,密钥空

我在Cassandra2.x集群中看到了非常奇怪的行为

如果我执行以下查询(使用CL ONE或LOCAL_ONE)

在同一个节点上,查询可以随机花费20ms或800ms(该表大约有600行)

在第一种情况下,大约执行100次顺序扫描,在第二种情况下,大约执行2000次顺序扫描。我不知道为什么系统会表现出这种不确定性行为

这个问题只发生在DC2(5个节点的RF=5)中,而在DC1(3个节点的RF=3)中,相同的查询总是在15毫秒左右返回。另外值得一提的是,DC2是通过从DC1流式传输创建的,密钥空间使用sizeTiered压缩。所有节点都有16GB的RAM,专用于/var/lib/cassandra的SSD,负载非常轻

我试过压实、修理、擦洗等,但都没有效果

任何帮助都将不胜感激

谢谢

以下是两种情况下的CQL(编辑:分别来自DC1)

更新:

这很好。如果我使用CL=ALL从DC1运行查询,那么每次大约30毫秒后返回。换句话说,从DC1查询DC2比从DC2查询DC2快一个数量级

记住DCs相距100英里,至少我们可以在任何节点上对网络和磁盘问题进行折扣

关键的区别在于DC1只扫描一个范围,例如
[最小值(-9223372036854775808),最小值(-9223372036854775808)]
,而DC2扫描多个范围,例如
(最大值(4772134901608081021),最大值(478731570936204510)]

还有一个事实,一个使用最小值,另一个使用多个最大值

这显然是问题的核心——但我不知道如何解决它!!

count(*)性能取决于您有多少个SSTABLE。我查看了跟踪输出,很明显DC1的SSTABLE很少,而DC2的SSTABLE很多。必须检查每一个SSTABLE的行数以获得总数。启用VNODE将通过跨更多分区拆分数据来放大问题

保持准确的计数需要对每个突变进行读-修改-写和额外锁定,因此Cassandra不会这样做。计数(*)实际上是基于每个sstable/memtable的行计数的估计,这也是一个估计

有关更多信息,请阅读以下内容:

count(*)性能取决于您有多少个sstables。我查看了跟踪输出,很明显DC1的sstables很少,而DC2有很多。必须检查每一个sstables以获得总数。启用vnodes将通过在多个分区上拆分数据来放大问题

保持准确的计数需要对每个突变进行读-修改-写和额外锁定,因此Cassandra不会这样做。计数(*)实际上是基于每个sstable/memtable的行计数的估计,这也是一个估计

有关更多信息,请阅读以下内容:

count(*)性能取决于您有多少个sstables。我查看了跟踪输出,很明显DC1的sstables很少,而DC2有很多。必须检查每一个sstables以获得总数。启用vnodes将通过在多个分区上拆分数据来放大问题

保持准确的计数需要对每个突变进行读-修改-写和额外锁定,因此Cassandra不会这样做。计数(*)实际上是基于每个sstable/memtable的行计数的估计,这也是一个估计

有关更多信息,请阅读以下内容:

count(*)性能取决于您有多少个sstables。我查看了跟踪输出,很明显DC1的sstables很少,而DC2有很多。必须检查每一个sstables以获得总数。启用vnodes将通过在多个分区上拆分数据来放大问题

保持准确的计数需要对每个突变进行读-修改-写和额外锁定,因此Cassandra不会这样做。计数(*)实际上是基于每个sstable/memtable的行计数的估计,这也是一个估计

有关更多信息,请阅读以下内容:

这是在2.0.4和2.0.9之间引入的回归

查询计划器不再能够计算给定节点的连续范围,因此它不是对每个连续范围进行一次扫描,而是经常单独扫描每个范围


有关更多详细信息,请参阅。

这是在2.0.4和2.0.9之间引入的回归

查询计划器不再能够计算给定节点的连续范围,因此它不是对每个连续范围进行一次扫描,而是经常单独扫描每个范围


有关更多详细信息,请参阅。

这是在2.0.4和2.0.9之间引入的回归

查询计划器不再能够计算给定节点的连续范围,因此它不是对每个连续范围进行一次扫描,而是经常单独扫描每个范围


有关更多详细信息,请参阅。

这是在2.0.4和2.0.9之间引入的回归

查询计划器不再能够计算给定节点的连续范围,因此它不是对每个连续范围进行一次扫描,而是经常单独扫描每个范围


有关更多详细信息,请参阅。

谢谢Al。我刚刚在表上运行了cfstats,DC1有4个SSTables,DC2有3个。我知道count(*)效率很低,但我相信它指出了一个更深层次的问题,即令牌在每个DC中如何分布。关键问题是DC1只进行一次seq扫描,而DC2进行多次扫描。你知道为什么吗?cfstats提供本地统计信息,因此你需要将所有节点的值相加以获得计数。你在eac上的vnode设置是什么h集群?每个节点有多少令牌?它们是否相同?DC2有许多范围,而DC1有许多范围
select count(*) from api_cache;