【发布时间】:2019-05-11 06:32:03
【问题描述】:
我们正在考虑从 DSE 5.0.9 迁移到 Apache Cassandra 3.11.3。我们已经取得了很大进展并设法解决了各种问题(包括 EverywhereStrategy 问题),但遇到了 system.local 表的问题。
到目前为止,迁移/升级仅在一台服务器上完成。当我们在这个节点上启动 Cassandra 3.11.3 时,加载 system.local 时出现错误:
INFO [main] 2018-12-07 10:56:12,963 ColumnFamilyStore.java:411 - Initializing system.local
INFO [SSTableBatchOpen:1] 2018-12-07 10:56:12,993 BufferPool.java:230 - Global buffer pool is enabled, when pool is exhausted (max is 512.000MiB) it will allocate on heap
ERROR [SSTableBatchOpen:1] 2018-12-07 10:56:13,013 DebuggableThreadPoolExecutor.java:239 - Error in ThreadPoolExecutor
java.lang.RuntimeException: Unknown column server_id during deserialization
at org.apache.cassandra.db.SerializationHeader$Component.toHeader(SerializationHeader.java:321) ~[apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.io.sstable.format.SSTableReader.open(SSTableReader.java:522) ~[apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.io.sstable.format.SSTableReader.open(SSTableReader.java:385) ~[apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.io.sstable.format.SSTableReader$3.run(SSTableReader.java:570) ~[apache-cassandra-3.11.3.jar:3.11.3]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_172]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_172]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_172]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_172]
at org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:81) [apache-cassandra-3.11.3.jar:3.11.3]
at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_172]
查看我们这里的另一个 Cassandra 3.11.3 集群,表中不存在 system_id。但是,在 DSE 5.0.9 版本的表格中确实如此。 由于无法加载 system.local,我们最终会收到以下警告:
WARN [main] 2018-12-06 10:43:57,241 SystemKeyspace.java:1087 - No host ID found, created a0bb8c11-2864-4d58-9c0c-59b97b16c48e (Note: This should happen exactly once per node).
(没有主机 ID,因为 system.local 没有加载) 然后导致以下错误:
ERROR [main] 2018-12-06 10:43:58,295 CassandraDaemon.java:708 - Exception encountered during startup
java.lang.RuntimeException: A node with address dubdc1-oatjeeramp2dmcassandra-04/10.109.158.254 already exists, cancelling join. Use cassandra.replace_address if you want to replace this node.
at org.apache.cassandra.service.StorageService.checkForEndpointCollision(StorageService.java:558) ~[apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.service.StorageService.prepareToJoin(StorageService.java:804) ~[apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.service.StorageService.initServer(StorageService.java:664) ~[apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.service.StorageService.initServer(StorageService.java:613) ~[apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:379) [apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:602) [apache-cassandra-3.11.3.jar:3.11.3]
at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:691) [apache-cassandra-3.11.3.jar:3.11.3]
此时 system.local 已被覆盖并存储了新的主机 ID 值,并且 Cassandra 已关闭。
将-Dcassandra.replace_node=<ip address> 添加到 cassandra-env.sh 会导致错误提示该节点已被引导,因此无法使用。我知道我可以通过删除所有数据来解决这个问题,但我真的不想这样做。
恢复 system.local 的备份将允许我们再次启动 DSE。目前该节点重新运行 DSE5.0.9
以前有人见过这个问题吗?您对如何解决这个问题有什么建议吗?
【问题讨论】:
-
server_id: 是 DSE 的一部分。您可以忽略该错误消息或暂时将 dse-core-5.0.13.jar 从 ../lib/ 复制到 Cassandra OSS /lib。
-
我不能忽略这个错误。此错误会阻止 system.local 加载,这会阻止实例知道其 host_id,从而阻止它加入集群。
标签: cassandra