Resumo: tenho um cluster de 2 nós e se um dos nós estiver inativo, não consigo fazer login. Eu recebo o erro.
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"')})
- Estou usando um ROLE que criei (não um SUEPRUSER, então o problema de SUPERUSER sempre usar QUORUM não deve se aplicar aqui. Pelo que li deveria usar LOCAL_ONE mas não é!
- Eu configurei a replicação do keyspace system_auth para 2 propositalmente, pois isso é recomendado para não ter um único ponto de falha.
Aqui está uma captura de tela para mostrar que não estou usando o cassandra SUPERUSER e ainda estou recebendo o erro:
Gostaria que o login continuasse funcionando mesmo se um nó estivesse inativo.
Primeiro, um cluster de 2 nós não é uma boa configuração de replicação para um nível de quorum, pois um valor de quorum de RF=2 seria sempre (2/2)+1=2. RF=3, em que cada nó de réplica é colocado em seu próprio rack, é sempre uma configuração inicial preferida, mas vamos deixar essa discussão de lado por enquanto.
Você poderia forçar o nível de consistência por meio das opções CQLSH como abaixo,
e, em seguida, aproveitar
CONSISTENCY LOCAL_ONE;
o shell fará com que você trabalhe com esse nível de consistência de leitura.Pude ver que o nível de consistência CQLSH padrão está
LOCAL_ONE
aqui para Cassandra®4.1.3
, a menos que você o reconfigure em outro lugar.Você está correto quando diz "Pelo que li, deveria usar LOCAL_ONE, mas não é!"
Descobri que a documentação oficial de segurança do Cassandra 4.0 e 4.1 está desatualizada por faltar uma alteração na consistência de autenticação introduzida no Cassandra 4.0.
No NEWS.txt você pode encontrar o seguinte na seção "Novos recursos" do Cassandra 4.0:
Na documentação do Apache Cassandra para cassandra.yaml você pode encontrar as consistências padrão para leituras (LOCAL_QUORUM) e gravações (EACH_QUORUM) no keyspace system_auth.
A boa notícia é que você pode configurar os respectivos níveis de consistência, ou pelo menos auth_read_consistency_level para LOCAL_ONE , em cassandra.yaml (verifique os links para leituras e gravações acima), reinicie o(s) nó(s) e então você poderá autenticar para cqlsh.
Como observação lateral, nem todos os superusuários fazem login (ou costumavam fazê-lo) no QUORUM. Pelo menos até Cassandra 4, apenas o superusuário "cassandra" usava QUORUM. Todos os demais usuários, super ou não, autenticados com LOCAL_ONE. Ainda não testei, mas a partir da atualização do NEWS.txt presumo que a consistência configurada no yaml também se aplica ao superusuário "cassandra" do Cassandra 4 em diante.