摘要:我有一个 2 节点集群,如果其中一个节点发生故障,我将无法登录。我收到错误。
Connection error: ('Unable to connect to any servers', {'192.168.1.104:9042': AuthenticationFailed('Failed to authenticate to 192.168.1.104:9042: Error from server: code=0100 [Bad credentials] message="Unable to perform authentication: Cannot achieve consistency level LOCAL_QUORUM"')})
- 我正在使用我创建的角色(不是 SUEPRUSER,因此 SUPERUSER 始终使用 QUORUM 的问题不应适用于此。根据我的阅读,它应该使用 LOCAL_ONE 但不是!
- 我特意将system_auth键空间复制设置为 2,因为建议这样做不会出现单点故障。
这是一个屏幕截图,显示我没有使用 cassandra SUPERUSER 但收到错误:
我希望即使一个节点发生故障,登录也能继续工作。
首先,对于仲裁级别而言,2 节点集群并不是一个好的复制设置,因为 RF=2 的仲裁值始终为 (2/2)+1=2。每个副本节点放置在自己的机架中的 RF=3 始终是首选的起始设置,但我们现在将讨论放在一边。
您可以通过 CQLSH 选项强制一致性级别,如下所示,
然后利用
CONSISTENCY LOCAL_ONE;
shell 内部的功能将使您能够达到读取一致性级别。我可以看到Cassandra® 的默认 CQLSH 一致性级别位于
LOCAL_ONE
4.1.3
此处,除非您在其他地方重新配置它。当你说“从我读到的内容来看,它应该使用 LOCAL_ONE 但不是!”时,你是正确的。
我发现 Cassandra 4.0 和 4.1 的官方安全文档都已过时,因为缺少 Cassandra 4.0 中引入的身份验证一致性更改。
在 NEWS.txt 中,您可以找到有关 Cassandra 4.0“新功能”部分的以下内容:
在 cassandra.yaml 的 Apache Cassandra 文档中,您可以找到针对system_auth键空间的读取(LOCAL_QUORUM) 和写入(EACH_QUORUM)的默认一致性。
好消息是,您可以在cassandra.yaml中配置相应的一致性级别,或者至少将auth_read_consistency_level设置为LOCAL_ONE(检查上面的读取和写入链接),重新启动节点,然后您应该能够进行身份验证cqlsh。
附带说明一下,并非所有超级用户都使用 QUORUM 登录(或习惯)。至少在 Cassandra 4 之前,只有“cassandra”超级用户使用 QUORUM。所有剩余用户(超级用户或其他用户)均使用 LOCAL_ONE 进行身份验证。我还没有测试它,但从 NEWS.txt 更新中我假设 yaml 中配置的一致性也适用于从 Cassandra 4 开始的“cassandra”超级用户。