1

运行时,我在一个节点上损坏了 sstable 文件

sstablescrub --skip-corrupted demo test

命令返回错误

java.io.IOException: Channel not open for writing - cannot extend file   to required size
Exception in thread "main" FSReadError in /var/lib/cassandra/data/demo/test-1ac451f0265811e6b09b4342782e6533/mb-12248-big-Data.db

我不知道为什么会发生错误。我可以删除文件,运行 cassandra 和 nodetool --full repair 吗?

4

1 回答 1

2

是的,您可以关闭主机,删除文件并进行修复。根据数据模型和用例,它可以在某些情况下工作,但默认情况下我不推荐它。

  • 如果该 sstable 中有一个超过 gc_grace 的墓碑,则所有其他主机可能会清除它,并且如果没有该 sstable 的墓碑遮蔽真实数据,它可能会在读取时复活并在读取修复时重新分发。
  • 如果使用 cl.quorum 插入数据,则数据可能仅位于 2 台主机上,并且该 sstable 已删除,因此仅在 1 台主机上读取您违反了一致性(损坏的节点 + 其他节点丢失数据在节点与数据之前响应)。
  • 如果使用 cl.one 插入,则该主机可能只是一个具有磁盘上数据的主机。考虑到提示、读取修复和提交日志,这不太可能发生,但数据可能会完全丢失并发生更多问题。

在损坏的情况下,我强烈建议关闭节点并完全更换它。即使用相同的硬件替换它,重新引导也比引入数据丢失(不太可能但)可能的窗口更安全。

如果您对数据不一致感到满意,并且数据丢失的可能性很小,那么这种方法很好。

于 2018-07-10T17:21:26.230 回答