在非 RDBMS 中,增加分区数量可以通过并行性加速写入和读取速度,那么分区过多的缺点是什么?
假设在 Cassandra 中,每一行的分区键都是唯一的。这有什么缺点? 另一方面,如果您决定在固定数量的分区上使用很少的数量,该怎么办?
例如,在Temporal(使用Cassandra)中,您需要在设置Temporal集群时指定固定数量的分区。如果分区太少,则在较高负载下读/写性能会很低。但如果将分区数量增加到非常高的数量,资源消耗就会增加。为什么分区数量越多,资源消耗就越多? (一般意义上,不限于Temporal)
编辑:与内存表刷新的关系。 更多的分区是否会导致memtable频繁刷新到SSTable中,从而触发更多的压缩并增加资源使用?如果是,为什么分区数量与内存表刷新频率相关?
现在让我们先说一下分区有许多不同的定义,并且有些地方很容易混淆。特别是当 Temporal 使用分区对 Cassandra 分区进行分区时。但让我们假设我们指的是 Cassandra 分区中的分区。一切都按主键分区,其他列在每个分区下形成行。
Cassandra 的设计可以很好地随分区数量进行扩展,但不能很好地随行大小进行扩展。也就是说,如果您的分区数量较少并在每个分区上添加行,您最终会遇到问题。
这里最常见的问题是 Cassandra 在读取时会将整个分区读入内存,因此分区越大,GC 压力就越大,读取延迟也就越长。
刷新仅与写入次数有直接关系。在这种情况下,无论你有更少还是更多的分区并不重要。
但是,当涉及删除/逻辑删除时,所有这一切都会变得更加复杂,但这完全是另一种蠕虫病毒。
我不太熟悉 Temporal 对 Cassandra 的使用,但我的猜测是它使用“存储桶”,将一个“工作流或队列”存储在多个 Cassandra 分区上,作为保持行合理大小的一种方式。
如果您的分区太大,则读取性能将受到影响,因为需要大量读取才能在分区内查找。另一方面,如果您将“工作流或队列”拆分为太多分区,则您将需要读取所有不同的分区来获取队列,从而影响服务器的资源。