2016-02-19 24 views
1

分区数量如何影响Cassandra集群中的修复时间?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) 
); 

如果count(ID2,ID1)>计数(ID1)?

回答

1

当触发修复,卡桑德拉

  • 阅读所有SSTables本地磁盘到内存
  • 计算了Merkle树
  • 交换了Merkle树的不同副本之间
  • 如果有不匹配,分区块将发送到 网络

由于Merkle树的分辨率只允许32768叶节点。如果单个副本上的分区数超过32768个,则会有多个分区散列到同一叶节点中。所以如果一个分区不匹配,我们需要发送所有的分区块。这就是我所说的过维修

这个问题或多或少地受到小范围修补那里,而不是修复整个标记范围表,卡桑德拉只是尝试修复的一个部分解决令牌范围。直接的结果是Merkle树的分辨率会更高,因为有更少的分区需要修复。

所以,是的,似乎有较少的分区将减少在维修

但是....

在您的例子,以下分区==更宽分区是不理想任一。

为什么?因为如果在一个宽分区中存在单个单元格不匹配,则需要修复整个分区,这是浪费资源。

此外,由于数据可能跨越许多SSTables宽分区将读取路径慢。

总结,我个人比较喜欢PRIMARY KEY ((id2, id1), name)并用分段修复

+0

感谢你的细节和快速的答案。 让我问你别的。当你建议使用**子范围修理**时,你的意思是什么? 'nodetool repair -pr' 'nodetool repar -st .. -et ..' 'nodetool -inc' ? – Dimaf

+0

完全是这个命令(-st,-et)。您可以手动创建一个脚本来监视修复过程并安排新的修复范围,也可以使用自动为您提供的OpsCenter Entreprise版本。 – doanduyhai