分区数量对Cassandra集群修复时间的影响

Influnce of partition quantity on repair time in Cassandra cluster

分区数量如何影响 Cassandra 集群的修复时间?

分区数量越少,Merkle树算法和修复过程速度越快,是否正确?

修复速度更快 -

CREATE TABLE ks.t1 (
     id2 bigint,
     id1 bigint,
     name text,
     PRIMARY KEY (id2, id1, name)
);

CREATE TABLE ks.t1 (
    id2 bigint,
    id1 bigint,
    name text,
    PRIMARY KEY ((id2, id1), name)
);  

如果计数(id2, id1) > 计数(id1) ?

触发修复时,Cassandra

  • 将磁盘上本地的所有 SSTable 读入内存
  • 计算默克尔树
  • 在不同副本之间交换默克尔树
  • 如果不匹配,分区块将发送到 网络

因为默克尔树解析只允许32768个叶节点。如果单个副本上有超过 32768 个分区,则会有许多分区散列到同一个叶节点中。因此,如果单个分区不匹配,我们将需要发送所有分区块。这就是我所说的过修

此问题或多或少通过 子范围修复 解决了,而不是修复 table、Cassandra 的整个标记范围 只是尝试修复令牌范围的一部分。直接的结果是默克尔树的分辨率会更高,因为要修复的分区更少。

所以是的,分区较少似乎会减少过度修复

但是....

在您的示例中,更少的分区 == 更宽的分区也不理想

为什么?因为如果宽分区出现单个cell不匹配Cassandra需要修复整个分区,浪费资源

此外,宽分区会使读取路径变慢,因为数据很可能跨越许多 SSTable。

结论,我个人更喜欢PRIMARY KEY ((id2, id1), name)并使用子范围修复