你能解释一下我做错了什么吗? 我在 Cassandra 4.0.5 的一个 DC 中运行 7 个节点,因为我试图维护这些节点,所以我每天在每个节点上运行:
nodetool repair --full -pr <keyspace>
据我了解,“未修复的字节数”值应该减少,而不是增加,但这对我不起作用。我没有减少,而是得到了这个:
nodetool tablestats <keyspace> | grep -E "Table:|Bytes unrepaired:"
Table: <table1>
Percent repaired: 0.0
Bytes repaired: 0.000KiB
Bytes unrepaired: 31.304GiB
Table: <table2>
Percent repaired: 0.0
Bytes repaired: 0.000KiB
Bytes unrepaired: 1009.825GiB
Table: <table3>
Percent repaired: 100.0
Bytes repaired: 0.000KiB
Bytes unrepaired: 0.000KiB
Table: <table4>
Percent repaired: 0.0
Bytes repaired: 0.000KiB
Bytes unrepaired: 2.227GiB
Table: <table5>
Percent repaired: 0.0
Bytes repaired: 0.000KiB
Bytes unrepaired: 250.537GiB
Percent repaired: 0.0
Bytes repaired: 0.000KiB
Bytes unrepaired: 4.364MiB
Table: <table6>
Percent repaired: 0.0
Bytes repaired: 0.000KiB
Bytes unrepaired: 1.227MiB
Table: <table7>
Percent repaired: 0.0
Bytes repaired: 0.000KiB
Bytes unrepaired: 2.031MiB
考虑到“修复”的含义,“未修复”一词可能看起来含糊不清,但您所看到的结果是预期的。 已修复字节和未修复字节之间的区别在于增量修复所依赖的元数据。
全面修复当您使用
--full
运行您发出的修复命令(在 4.0 及更高版本中)时,Cassandra 会在 sstable 元数据级别将修复范围涵盖的所有数据标记为“未修复” - 这使得
full
之间存在区别和 incremental
维修。增量修复当您运行增量修复时,Cassandra 会将所有已修复的数据标记为“已修复”,也是在 sstable 级别 - 此功能的目标是在未来的修复会话中跳过“已修复”的 sstable,从而最大限度地减少修复开销。
这有效地在幕后创建了 2 个 sstable 池,其中已修复的 sstable 只能与其他已修复的 sstable 进行压缩,而相同的逻辑适用于未修复的对应项,以保持修复状态元数据的一致性。
或增量修复,Cassandra 始终相应地保留已修复的元数据,具体取决于您选择的修复策略。 据报道,以前的增量修复错误已在 Cassandra 4.0 中得到解决,在大多数情况下,值得在 Cassandra 4 及更高版本中运行增量修复,并在其间进行一些定期的完整修复。如果修复运行影响您的服务/应用程序,则尤其如此 - 增量修复可以为您节省大量修复时间。