Cassandra 初始化失败并出现错误 "Cannot add table 'role_members' to non existing keyspace 'system_auth'"

Cassandra fails to initialize with error "Cannot add table 'role_members' to non existing keyspace 'system_auth'"

我是 运行 Docker 容器中的一个 Cassandra 集群,使用 fleet 进行管理。我能够启动集群并 运行,但是如果我用 fleet 关闭这些单元然后再次备份,容器就会失败。 Cassandra 日志在第二次启动时有此条目。

Cannot add table 'role_members' to non existing keyspace 'system_auth'.
Fatal configuration error; unable to start server.  See log for stacktrace.
INFO  20:59:34 InetAddress /172.17.8.102 is now DOWN
ERROR 20:59:34 Fatal configuration error
org.apache.cassandra.exceptions.ConfigurationException: Cannot add table 'role_members' to non existing keyspace 'system_auth'.
        at org.apache.cassandra.service.MigrationManager.announceNewColumnFamily(MigrationManager.java:284) ~[apache-cassandra-2.2.0.jar:2.2.0]
        at org.apache.cassandra.service.MigrationManager.announceNewColumnFamily(MigrationManager.java:275) ~[apache-cassandra-2.2.0.jar:2.2.0]
        at org.apache.cassandra.service.StorageService.maybeAddTable(StorageService.java:1046) ~[apache-cassandra-2.2.0.jar:2.2.0]
        at org.apache.cassandra.service.StorageService.doAuthSetup(StorageService.java:1034) ~[apache-cassandra-2.2.0.jar:2.2.0]
        at org.apache.cassandra.service.StorageService.joinTokenRing(StorageService.java:967) ~[apache-cassandra-2.2.0.jar:2.2.0]
        at org.apache.cassandra.service.StorageService.initServer(StorageService.java:698) ~[apache-cassandra-2.2.0.jar:2.2.0]
        at org.apache.cassandra.service.StorageService.initServer(StorageService.java:581) ~[apache-cassandra-2.2.0.jar:2.2.0]
        at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:291) [apache-cassandra-2.2.0.jar:2.2.0]
        at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:481) [apache-cassandra-2.2.0.jar:2.2.0]
        at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:588) [apache-cassandra-2.2.0.jar:2.2.0]

我找不到关于这个特定错误的任何信息,而且我真的不知道为什么会这样。我能找到的最接近的信息是 system_auth table 如果你不使用默认的 AllowAllAuthenticator 需要特别配置,但我正在使用这个。我没有在 cassandra.yaml 文件中更改它。

有谁知道为什么会这样?

有没有可能你在使用 CassandraAuthorizer 而没有使用 PasswordAuthenticator?我认为这可能不起作用并导致此特定错误。

system_auth不适用于AllowAllAuthenticator,您需要改用PasswordAuthenticator。如果您按以下方式配置cassandra.yaml:

authenticator: PasswordAuthenticator
authorizer: CassandraAuthorizer

然后重新启动 cassandra,它应该会为您创建 system_auth 键空间。如果您不想设置授权,您可以随时使用 AllowAllAuthorizer 代替。可以找到更多信息 here.

事实证明这是我遇到的一个相当独特的配置问题。我正在将主机上的 /var/lib/cassandra 映射到我的 docker 容器内的 /var/lib/cassandra。但我也无意中将 /var/lib/cassandra/data 映射到主机上自动生成的 Docker 目录。因此,当我停止并重新启动容器时,数据目录会消失,Cassandra 会失败,因为它试图从 commitlog 目录重新创建数据。

我刚按照 Datastax "Initializing a multiple node cluster (single data center)" 教程遇到了问题。

我解决了同样的问题,删除了 /var/lib/cassandra 的全部内容,而不仅仅是 /var/lib/cassandra/system/

的内容

为什么? 我认为 Kris 找到了真正的问题根源:重新启动时,C* 服务发现 commitLog 已满,并通过尝试重建在那里找到的提交来恢复,但由于不同的配置和不同的 table 结构而失败...