cassandra-通道无法打开以进行写入-无法将文件扩展到所需大小

时间:2018-07-10 15:43:54

标签: cassandra datastax-enterprise

我正在运行时,一个节点上的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修复吗?

1 个答案:

答案 0 :(得分:2)

是的,您可以关闭主机,删除文件并进行修复。在某些情况下,它可以工作,具体取决于数据模型和用例,但默认情况下我不建议这样做。

  • 如果该sstable中有一个越过gc_grace的墓碑,则所有其他主机可能会清除它,并且如果该sstable的墓碑遮盖了真实数据,它可能会在读取时复活并在读取修复时重新分配。
  • 如果使用cl.quorum插入数据,则只能在2台主机上并且删除了该sstable,只能在1台主机上,因此在仲裁上读取会破坏一致性(损坏的节点+其他节点丢失的数据在该节点收到数据之前作出响应)。
  • 如果使用cl.one插入,则该主机可能只有一个磁盘上的数据。在给出提示,读取修复和提交日志的情况下,这是极不可能的,但是它的可能可能会因发生更多其他问题而完全丢失数据。

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

如果您可以确定数据不一致,并且可能会丢失数据,那么这种方法就可以了。