3

我在两台不同的机器上工作,它们都有不同的硬盘存储和不同的 cassandra 版本。

机器1个 SSD硬盘,Cassandra 2.1.13

机器2 HDD硬盘,Cassandra 2.1.3

现在我使用SSTableLoader实用程序将一个 CF 的数据从机器 2传输到机器 1 。直到这一步它工作正常,数据也成功传输。

但是我错误地截断了机器 2上相同 CF的数据。为了恢复数据,我使用了相同的概念。我试图将数据从machine 1传输到machine 2

同时我发现了一些奇怪的日志

  1. 16:22:53.956 [main] 调试 oacio.sstable.SSTableReader - 无法反序列化 SSTable 摘要文件 ./data/data/sstableloadertest/typestest-8e68e811f56511e59d60297061e28552/sstableloadertest-typestest-ka-57-Summary.db:无法反序列化 SSTable 摘要组件,因为DiskAccessMode 已更改!

它还删除了 sstable 的 *summary.db 组件。

首先我认为这是由于不同的 cassandra 版本而发生的,但我错了。

谁能告诉我为什么会这样?

4

1 回答 1

1

删除的摘要文件应该没问题。可能值得自己删除它并重新启动服务器。摘要文件只存储分区的索引,并且可以在启动时重建。

默认的磁盘访问模式是自动的,它是根据它是 32 位还是 64 位架构1 [2] 来设置的。很可能您的第一个或第二个系统使用的是 32 位版本的 jdk,而其他系统则不是。检查日志,应该有一行

INFO  [main] 2016-03-16 16:45:11,464 CassandraDaemon.java:424 - JVM vendor/version: Java HotSpot(TM) 64-Bit Server VM/1.8.0_45

如果 machine2 运行 64 位并且 machine1 是 32 位 jvm,那么只需将disk_access_modecassandra.yaml 中的属性设置为standard. 如果 machine2 运行 32 位 jvm 而 machine1 是 64 位,则升级 machine2 上的 jvm。

不过,这可能会导致为其他模式设置的所有其他摘要文件出现问题。所以最终它应该只是让它重建。

1 https://github.com/apache/cassandra/blob/8097d390a285c20aa47954750a80d176a826e47b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java#L313

[2] https://github.com/apache/cassandra/blob/8097d390a285c20aa47954750a80d176a826e47b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java#L1931

于 2016-03-29T12:53:01.647 回答