乐趣区

关于cassandra:故障分析-Cassandra-用户信息-list-Error

作者:杨文

DBA,负责客户我的项目的需要与保护,会点数据库,不限于 MySQL、Redis、Cassandra、GreenPlum、ClickHouse、Elastic、TDSQL 等等。

本文起源:原创投稿

* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。


一、背景:

客户在集群中查看用户信息 list users 时,报错 Error from server:xxx。其实是个简略的查看语句,但魔法失灵了?上面咱们将集群中用户角色等信息的查看形式做一个对立的剖析阐明。

二、cassandra 简略介绍:

2.1、Cassandra 集群组成:节点 (Node)、机架 (Rack)、数据中心 (Data Center);

  • 节点 (Node):运行 Cassandra 实例的服务器;
  • 机架 (Rack):一组互相凑近的 Cassandra 节点;
  • 数据中心 (Data Center):指逻辑机架的汇合。

2.2、Cassandra 通常跨多个数据中心存储数据正本,以确保高可用性,同时会将查问路由到同一数据中心的其余节点以实现最优性能,为了实现这一点,Cassandra 应用两个外部协定来治理基于集群拓扑的数据路由:gossip 和 snitches。

  • Cassandra 应用 Gossip 协定实现了无核心架构。
  • Cassandra 应用 Snitch 机制实现了节点感知以进步性能。
  • Cassandra 应用环构造和令牌机制实现了集群的动静扩容和数据分区。

2.3、环构造和令牌:

  • Cassandra 将一个集群治理的数据表示为环,会为环中的每个节点调配一个或多个数据区间或范畴,由一个令牌形容,确定数据在环中的地位。
  • 通过应用散列函数为分区键计算令牌,将数据调配给节点。将该分区密钥令牌与各个节点的令牌值进行比拟,以辨认领有该数据的范畴,从而辨认该节点。
  • Cassandra 将群集治理的数据表示为环。环中的每个节点被调配由令牌形容的一个或多个数据范畴,该令牌确定其在环中的地位,令牌是用于标识每个分区的 64 位整数 ID。

2.4、复制策略:

  • 节点用作不同数据范畴的正本。
  • 如果一个节点产生故障,其余正本能够响应对该数据范畴的查问。
  • Cassandra 以对用户通明的形式跨节点复制数据,复制因子是集群中接管雷同数据的正本的节点数。
  • 第一个正本将始终是申明令牌落入范畴的节点,但正本的其余部分依据复制策略搁置。

三、本地环境测试:

咱们将通过试验测试进行 cassandra 用户角色查看时的各种状况阐明。

试验环境:集群模式下跨数据中心。

数据中心 节点 IP 种子节点
DC1 10.186.60.61、10.186.60.7、10.186.60.118、10.186.60.67 10.186.60.61、10.186.60.7
DC2 10.186.60.53、10.186.60.65、10.186.60.94、10.186.60.68 10.186.60.53、10.186.60.65

3.1、用户:

应用默认用户名 cassandra 和默认明码 cassandra 登录:

cqlsh 10.186.60.61 -u cassandra -p cassandra

创立用户:

cassandra@cqlsh> CREATE USER root WITH PASSWORD 'rootroot' SUPERUSER;
cassandra@cqlsh> list users;
name      | super | datacenters
----------+-------+-------------
cassandra |  True |         ALL
     root |  True |         ALL
(2 rows)

阐明:

  • 只有 SUPERUSER 能够创立用户,创立的用户默认为 NOSUPERUSER;
  • 只有 SUPERUSER 能够删除用户,任何用户不能删除本人。
  • 如果要删除默认帐号,须要用新创建的账号从新登录,才能够删除默认账号;删除后,将不能再应用 cassandra 用户登录数据库了。

示例:

cqlsh 10.186.60.61 -u root -p rootroot
...
root@cqlsh> drop user cassandra;

和其它分布式数据库一样,此时能查看所有用户的几种形式:

cqlsh 10.186.60.61 -u cassandra -p cassandra
cqlsh 10.186.60.61 -u root -p rootroot

cqlsh 10.186.60.7 -u cassandra -p cassandra
cqlsh 10.186.60.7 -u root -p rootroot

cqlsh 10.186.60.118 -u cassandra -p cassandra
cqlsh 10.186.60.118 -u root -p rootroot

cqlsh 10.186.60.67 -u cassandra -p cassandra
cqlsh 10.186.60.67 -u root -p rootroot

谬误的查看形式:

[cassandra@data01 ~]$ cqlsh 10.186.60.53 -u cassandra -p cassandra
Connected to cluster at 10.186.60.53:9042
[cqlsh 6.0.0 | cassandra 4.0.1 | CQL spec 3.4.5 | Native protocol v5]
Use HELP for help.
cassandra@cqlsh> LIST USERS;
Unauthorized: Error from server: code=2100 [unauthorized] message="Unable to perform authorization of login permission: cannot achieve consistency level LOCAL_ONE"

能够看到不是同一个数据中心的是不能取得到权限的。

dc1 数据中心中的节点是能够间接看该数据中心所有用户,然而 dc2 数据中心是不能直观的看 dc1 数据中心用户的。需通过 system_auth.roles 表,能力看到:

[cassandra@data05 ~]$ cqlsh 10.186.60.53 -u cassandra -p cassandra
Connected to cluster at 10.186.60.53:9042
[cqlsh 6.0.0 | cassandra 4.0.1 | CQL spec 3.4.5 | Native protocol v5]
Use HELP for help.
cassandra@cqlsh> select * from system_auth.roles;
role      | can_login | is_superuser | member _of | salted_hash
----------+-----------+--------------+------------+--------------------------------------------------------------
cassandra |      True |         True |       null | $2a$10$bks/GM5rQFyw7nRQPC2sn.hxiMloTvIcG7Q6fqjSspq5970gGax3u
     root |      True |         True |       null | $2a$10$eV88L/7bx08F9JH/4a.z1u/wvv2Yhv3xgIISRDKbd7/aeLvxkMzgs
(2 rows)

阐明:同一数据中心和跨数据中心都能够通过 system_auth.roles 表查看集群中所有的用户。

须要留神的是:尽管 dc2 数据中心有 root 用户,但却无奈用 root 用户进行登录数据库。

[cassandra@data01 ~]$ cqlsh 10.186.60.53 -u root -p rootroot
Connection error: ('unable to connect to any servers', {'10.186.60.53:9042': AuthenticationFailed('Failed to authenticate to 10.186.60.53:9042: Error from server: code=0100 [Bad credentials] message="unable to perform authentication: Cannot achieve consistency level LOCAL__ONE"',)})

3.2、角色:

创立角色:

create role appgroup1;
create role appgroup2 with password='appgroup2' and login=true;

查看角色:

cassandra@cqlsh> list roles;
role      | super | login | options | datacenters
----------+-------+-------+---------+-------------
appgroup1 | False | False |      {} |         ALL
appgroup2 | False |  True |      {} |         ALL
cassandra |  True |  True |      {} |         ALL
     root |  True |  True |      {} |         ALL
(4 rows)

同样的,跨数据中心 dc2 无奈间接查看角色:

cassandra@cqlsh> list roles of appgroup2;
NoHostAvailable: ('unable to complete the operation against any hosts', {<Host: 10.186.60.53:9042 dc2>: unavailable('Error from server: code=1000 [unavilable exception] message="cannot achieve consistency level LOCAL_ONE"info={\'consistency\': \'LOCAL_ONE\', \'required_replicas\': 1, \'alive_replicas\': 0}',)})
cassandra@cqlsh>
cassandra@cqlsh> list roles;
Unauthorized: Error from server: code=2100 [unauthorized] message="unable to perform authorization of super-user permission: cannot achieve consistency level LOCAL_ONE"

需用 system_auth.roles 表,能力看到:

cassandra@cqlsh> select * from system_auth.roles;
role      | can_login | is_superuser | member_of | salted_hash
----------+-----------+--------------+-----------+--------------------------------------------------------------
cassandra |      True |         True |      null | $2a$10$bks/GM5rQFyw7nRQPC2sn.hxiMloTvIcG7Q6fqjSspq5970gGax3u
     root |      True |         True |      null | $2a$10$eV88L/7bx08F9JH/4a.z1u/wvv2Yhv3xgIISRDKbd7/aeLvxkMzgs
appgroup1 |     False |        False |      null |                                                         null
appgroup2 |      True |        False |      null | $2a$10$8uOnMjPKA678nmeCF73eceme7Mezr.z775NQEIztpsPPUEQoxsd6G
(4 rows)

3.3、汇总:

当两个数据中心都创立了用户时,两个数据中心中的节点都将不能应用 list 查看信息:

[cassandra@data01 ~]$ cqlsh 10.186.60.61 -u cassandra -p cassandra
Connected to cluster at 10.186.60.61:9042
[cqlsh 6.0.0 | cassandra 4.0.1 | CQL spec 3.4.5 | Native protocol v5]
Use HELP for help.
cassandra@cqlsh> LIST USERS;
Unauthorized: Error from server: code=2100 [unauthorized] message="Unable to perform authorization of login permission: cannot achieve consistency level LOCAL_ONE"
cassandra@cqlsh> quit

[cassandra@data01 ~]$ cqlsh 10.186.60.61 -u root -p rootroot
Connected to cluster at 10.186.60.61:9042
[cqlsh 6.0.0 | cassandra 4.0.1 | CQL spec 3.4.5 | Native protocol v5]
Use HELP for help.
cassandra@cqlsh> LIST USERS;
Unauthorized: Error from server: code=2100 [unauthorized] message="Unable to perform authorization of login permission: cannot achieve consistency level LOCAL_ONE"
cassandra@cqlsh> 
cassandra@cqlsh> list roles;
Unauthorized: Error from server: code=2100 [unauthorized] message="unable to perform authorization of super-user permission: cannot achieve consistency level LOCAL_ONE"
cassandra@cqlsh> quit

[cassandra@data01 ~]$ cqlsh 10.186.60.65 -u cassandra -p cassandra
Connected to cluster at 10.186.60.65:9042
[cqlsh 6.0.0 | cassandra 4.0.1 | CQL spec 3.4.5 | Native protocol v5]
Use HELP for help.
cassandra@cqlsh> LIST USERS;
Unauthorized: Error from server: code=2100 [unauthorized] message="Unable to perform authorization of login permission: cannot achieve consistency level LOCAL_ONE"
cassandra@cqlsh> 
cassandra@cqlsh> list roles;
Unauthorized: Error from server: code=2100 [unauthorized] message="unable to perform authorization of super-user permission: cannot achieve consistency level LOCAL_ONE"
cassandra@cqlsh> quit

当其中一个数据中心删除了本人创立的所有的用户时,另一个能力应用 list 查看。

dc2 数据中心删除本人创立的用户:

cassandra@cqlsh> drop user yangw1;
cassandra@cqlsh> LIST USERS;
Unauthorized: Error from server: code=2100 [unauthorized] message="Unable to perform authorization of login permission: cannot achieve consistency level LOCAL_ONE"
cassandra@cqlsh> list roles;
Unauthorized: Error from server: code=2100 [unauthorized] message="unable to perform authorization of super-user permission: cannot achieve consistency level LOCAL_ONE"

此时,dc1 数据中心中的节点,又能够通过 list 间接查看信息了:

[cassandra@data01 ~]$ cqlsh 10.186.60.61 -u cassandra -p cassandra
Connected to cluster at 10.186.60.61:9042
[cqlsh 6.0.0 | cassandra 4.0.1 | CQL spec 3.4.5 | Native protocol v5]
Use HELP for help.
cassandra@cqlsh> list users;
name      | super | datacenters
----------+-------+-------------
appgroup2 |  True |         ALL
cassandra |  True |         ALL
     root |  True |         ALL
(3 rows)
cassandra@cqlsh> list roles;
role      | super | login | options | datacenters
----------+-------+-------+---------+-------------
appgroup1 | False | False |      {} |         ALL
appgroup2 | False |  True |      {} |         ALL
cassandra |  True |  True |      {} |         ALL
     root |  True |  True |      {} |         ALL
(4 rows)

3.4、总结:

1)哪个数据中心创立的用户和角色,哪个数据中心能力 list 查看,list 只能查看本人数据中心创立的用户 / 角色,看其余数据中心的用户 / 角色就只能通过间接的形式看到;

2)因为两个数据中心都创立了用户 / 角色,所以零碎分不清哪个用户 / 角色是哪个数据中心创立的,所以就都不让看;

3)删除角色 / 用户时,只能由创立它的数据中心进行删除;即:dc1 数据中心创立的角色 / 用户,只能由 dc1 数据中心中的节点删除;用 dc2 数据中心中的节点删除时,就会报错。

退出移动版