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

cassandra-通道未打开进行写入-无法将文件扩展到所需大小,cassandra,datastax-enterprise,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-1ac451f0265

在运行时,我在一个节点上损坏了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--完全修复吗?

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

  • 如果该sstable中有一个超过gc_grace的墓碑,则所有其他主机可能会清除它,如果该sstable的墓碑不遮挡真实数据,它可能会在读取时复活,并在读取修复时重新分发
  • 如果使用cl.quorum插入数据,则数据可能仅在2台主机上,并且在删除该sstable的情况下,仅在1台主机上,因此在quorum读取时,您违反了一致性(损坏的节点+其他缺少数据的节点在节点使用数据之前作出响应)
  • 若使用cl.one插入,则该主机可能是唯一一个磁盘上有数据的主机。如果给出提示、读取修复和提交日志,这是不太可能的,但数据可能会完全丢失,并且还会出现一些问题
在发生损坏的情况下,我强烈建议关闭节点并完全替换它。即使用相同的硬件替换,重新引导也比引入可能(不太可能但)丢失数据的windows更安全

如果您同意数据中的不一致性,并且数据丢失的可能性很小,那么这种方法也可以