“nodetool repair”操作有多贵?

Posted

技术标签:

【中文标题】“nodetool repair”操作有多贵?【英文标题】:How expensive is a "nodetool repair" operation? 【发布时间】:2013-07-12 14:31:23 【问题描述】:

在我的 Cassandra 节点上定期运行 nodetool repair 会削弱它们吗?

Planet Cassandra FAQ 说明(强调)

反熵节点修复 - 对于不经常读取的数据,或更新已停机较长时间的节点上的数据,节点修复过程(也称为反熵修复)确保所有副本上的数据保持一致。节点修复(使用 nodetool 实用程序)应作为常规集群维护操作的一部分定期运行。

这是我见过的唯一一个定期运行nodetool repair 的参考。如果它便宜,定期运行它不会有问题,但它到底有多贵?它是否相当于对节点上的每条记录进行一致性检查读取?还是比这更聪明?文档中提到了 Merkle 树的使用,但这并没有让我知道该操作有多昂贵。

如果您在一个节点上有 500 GB 的数据,并且该节点实际上与其他节点一致(修复是无操作),那么修复从磁盘读取多少数据(读取所有 500 GB 将需要几个小时)?以及通过 LAN 发送的数据量(通过 LAN 发送全部 500 GB 可能需要另一个小时左右)。

【问题讨论】:

【参考方案1】:

有些用例比其他用例更依赖定期维修。如果您在低于 ConsistencyLevel.ALL 的情况下执行删除,那么您应该运行修复以确保已删除的列不会恢复活力。如果您不执行删除操作,则在许多情况下,您可以依靠提示切换和读取修复来保持一致性。如果您以低一致性级别进行读写,或者经常出现服务器停机或过载,您可能需要运行修复。

修复的作用是通过 all 读取运行它的节点上的数据(可选,使用 -pr(主要范围)选项,仅读取节点拥有主要范围的范围) 并建立一个 Merkle 树。它还会向存储任何这些范围的副本的所有节点发送一条消息以执行相同的操作 - 它们只会读取在初始修复节点上复制的数据。

要在 500 GB 的节点上构建 Merkle 树,将读取全部 500 GB(使用 -pr 时,它大致会降低复制因子的一个因子)。但是,Merkle 树的大小是恒定的(几 MB),因此如果节点同步,则通过网络发送的内容很少。

运行计划修复的最佳方法是在每个节点上依次使用 -pr 运行。这避免了多次修复相同的数据。此外,一次只能在一个节点上运行,以避免给集群带来额外的负载。

【讨论】:

您能否详细说明“已删除的列恢复生机”部分?您是在谈论删除后的列会继续出现一小段时间,还是说如果您不使用 ConsistencyLevel.ALL,Cassandra 的“最终一致性”实际上将不起作用?我的理解是删除最终应该传播到整个集群,即使使用ConsistencyLevel.ANY,因为更改最终会传播。这不正确吗? @aroth 你得到上述查询的答案了吗? @Naresh - 不,但是我在生产中使用较低的一致性级别已经有一段时间了,并且在实践中没有观察到任何此类问题。当然,这是轶事,样本量为 1,并不意味着坏事不会/不会发生。因此,请谨慎对待。 只要您对 gc_grace 中的每个范围都进行了成功修复,最终一致性就可以很好地用于删除。如果您不经常进行修复或不检查修复失败,如果任何副本没有收到删除,您将恢复数据。

以上是关于“nodetool repair”操作有多贵?的主要内容,如果未能解决你的问题,请参考以下文章

[]byte(string) 有多贵?

Java 中的 File.exists 有多贵

锁语句有多贵?

java方法调用有多贵

IOS - reloadData 有多贵?

NULL 指针参数有多贵?