分区数量对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)
并使用子范围修复。
分区数量如何影响 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)
并使用子范围修复。