Cassandra nodetool 修复究竟是做什么的?

pio*_*est 3 cassandra

http://docs.datastax.com/en/cassandra/2.0/cassandra/operations/ops_repair_nodes_c.html我知道

nodetool repair 命令修复给定数据范围内所有副本的不一致。

  • 但它如何解决不一致的问题?它写的是使用默克尔树 - 但这是为了比较而不是为了修复“损坏的”数据。
  • 数据如何被“破坏”?尽管硬盘驱动器出现故障,有什么常见情况吗?

抛开问题:它是压实驱逐墓碑,对吧?那么比gc_grace 秒更频繁地运行nodetool repair 的要求只是为了确保所有数据都传播到适当的副本?这不应该是通常的场景吗?

Jim*_*yer 5

无论出于何种原因,只要对副本的写入未完成,数据就会变得不一致。如果节点关闭、节点启动但网络连接关闭、队列已满且写入被删除、磁盘故障等,则可能会发生这种情况。

当通过比较默克尔树检测到不一致的数据时,数据的坏部分通过从具有较新数据的节点流式传输它们来修复。Streaming 是 Cassandra 中的一种基本机制,也用于将空节点引导到集群中。

您需要在 gc 宽限秒内运行修复的原因是,墓碑将同步到所有节点。如果一个节点缺少墓碑,那么它不会在压缩期间删除该数据。有墓碑的节点会在compaction过程中丢弃数据,然后当它们运行修复时,可以从丢失墓碑的节点复活被删除的数据。

  • Cassandra 有两种机制来帮助保持数据的一致性。提示切换将存储由于节点关闭而失败的写入,并在节点恢复时完成它们。但它只适用于有限的停机时间,因此如果节点停机时间超过提示窗口,您将开始错过写入。另一种机制是读取修复机会,它会在读取完成后缓慢修复数据。如果您有良好的硬件和良好的网络,那么不一致的数据很少见,但它仍然可能发生。 (2认同)