【问题标题】:Cassandra fails to initialize with error "Cannot add table 'role_members' to non existing keyspace 'system_auth'"Cassandra 无法初始化并出现错误“无法将表 'role_members' 添加到不存在的密钥空间 'system_auth'”
【发布时间】:2015-09-10 21:05:56
【问题描述】:

我在 Docker 容器中运行 Cassandra 集群,使用队列进行管理。我能够让集群启动并运行,但如果我用舰队关闭单元然后再次备份,容器就会失败。 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 表需要专门配置,如果您不使用默认的AllowAllAuthenticator,但我正在使用这个。我在 cassandra.yaml 文件中没有更改。

有人知道为什么会这样吗?

【问题讨论】:

    标签: docker cassandra fleet database nosql


    【解决方案1】:

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

    system_auth不适用于AllowAllAuthenticator,需要使用PasswordAuthenticator代替。如果你按照以下方式配置 cassandra.yaml:

    authenticator: PasswordAuthenticator
    authorizer: CassandraAuthorizer
    

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

    【讨论】:

    • 我的 cassandra.yaml 文件有 authenticator: AllowAllAuthenticator authorizer: AllowAllAuthorizer。我认为这些是默认值。在设置过程中我没有更改它们。我确实认为这很奇怪,因为其他人已经提到 system_auth 甚至不应该使用这些设置创建。会不会是它们自动设置在其他地方?
    • 有趣,我同意,除非您明确设置它们,否则我不希望出现 system_auth 表。什么版本的 cassandra?
    • 版本为 2.2.0。我想我可以尝试更新到 2.2.1。
    • 使用 AllowAllAuthorizer 和 AllowAllAuthenticator 时不会创建 system_auth 密钥空间。问题是为什么 Cassandra 尝试根据您的配置创建 role_members 表。您是否更改了这些文件中的任何内容,还是直接开箱即用?
    • 我没有直接修改cassandra.yaml文件。我在我的 dockerfile 中设置了一些 cassandra 环境变量,然后 Cassandra 使用它们来更新该文件。我设置的变量是ENV CASSANDRA_SEEDSENV CASSANDRA_CLUSTER_NAMEENV CASSANDRA_DCENV CASSANDRA_RACKENV CASSANDRA_ENDPOINT_SNITCH
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我在 Datastax “初始化多节点集群(单个数据中心)”教程之后遇到了问题。

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

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

      【讨论】:

        猜你喜欢
        • 2014-04-08
        • 2021-06-28
        • 2011-07-23
        • 1970-01-01
        • 1970-01-01
        • 2017-06-15
        • 1970-01-01
        • 1970-01-01
        • 2019-03-31
        相关资源
        最近更新 更多