我有一个非常有趣的问题,cassandra 是否有可能不会为任何已修复的密钥空间启动重建过程?如果我们使用此选项很少处于未修复状态:nodetool rebuild --DATACENTER -ks KEYSPACE_NAME。
我们昨天看到了一个奇怪的实验,如果我们的集群中几乎没有未修复的键空间,我们决定改变例如一些已经修复的键空间的复制策略并使用这个命令:nodetool rebuild --DATACENTER -ks KEYSPACE_NAME - 此命令失败:无法找到足够的流范围来源,但如果我们在没有 --DATECENTER 的情况下启动命令:nodetool rebuild -ks KEYSPACE_NAME - 数据将出现在所有新节点上,而不是只有一个,我们可以使用这个方法还是坏主意?
重建操作与维修没有任何关系。
nodetool rebuild
将根据之前是否流过数据(通过引导程序或重建)为节点上的令牌范围填充数据。Cassandra 将节点的令牌范围的“状态”存储在表中
system.available_ranges
。如果节点已成功引导或重建,它将存储每个键空间的可用范围,以便它知道可以为读取请求提供哪些数据。此外,此错误:
可能是因为您从复制中删除了源 DC,因此 Cassandra 无法重建新的 DC,因为您指定的源 DC 中不再有任何副本。
当您从命令中删除源 DC 时
rebuild
,它只是从新 DC 中的其他节点流式传输数据,这很糟糕,因为 DC 没有数据,根据定义它是新的。无论如何,你的“实验”是无效的。修复不是将数据传输到新节点的推荐方法。如果是,我们就不需要
rebuild
.想想你有 2 个 DC,每个 DC 有 3 个副本的情况。这意味着总共有 6 个副本(2 个 DC x 3 个副本)。修复非常昂贵,因为它会比较 6 个副本之间的数据以确定运行它的节点上丢失了哪些数据。
由于该节点是新节点,我们已经知道它没有数据,因此与集群中的其他 5 个副本进行比较是一种资源浪费。所需要的只是从另一个副本请求数据,这正是
rebuild
设计的目的。干杯!