南大通用GBase 8a集群如何让某个调度节点不允许账号登录

GBase 8a的调度节点是平等的,保存了完全相同的信息,包括数据库账号和密码。用户可以选择任意一个调度节点来访问集群。如果因某些特殊情况,需要让某个调度节点不提供对外访问,可以考虑用本文介绍的方法。

原理

修改调度节点本地保存的账号信息,修改密码,则新建的连接将无法成功登录。已有连接不生效,但可以考虑手工kill掉。

该修改只涉及到当前节点,不会扩散到其它管理节点。

建议不要用此方案,修改数据库自带的dba用户密码,包括root和gbase账号。 用户业务也尽量不要用dba账号访问数据库。

修改方法

需要用数据库dba用户登录,而且建议只阻止非dba用户登录,否则root/gbase用户都无法登录了,就无法在线恢复,需要重启服务才行。后面详细介绍。

保存当前密码

如果忘记了,可以从其它gcluster节点查询到。

select password from gbase.user where user='testdb';

也可以直接生成所有用户(包括root,gbase等)恢复用的update语句。其中flush privileges是为了自动刷新。

select concat('update gbase.user set password=\'',password,'\' where user=\'',user,'\';') sq from gbase.user;
select 'flush privileges;

修改本地密码。

新密码可以随便写,这样就肯定无法登录,因为原始密码时sha256加密保存的,而随便写的,则铁定不对应原始密码。

update gbase.user set password='XXXX' where user='testdb';

也可以用password函数获得,比如select password('新密码')。

这个账号在这个节点,可以用新的密码登录,别的节点依然是原有密码。

update gbase.user set password='*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' where user='testdb';

也可以直接在SQL里用password函数。

update gbase.user set password=password('123') where user='testdb';

如果有多个账号要限制登录这个节点,则执行多次。

也可以将所有用户全部更改密码

update gbase.user set password=password('NEWPASSOWRD');
flush privileges;

刷新

如下命令刷新权限,无需重启服务。

flush privileges;

效果验证

修改的是201节点,已经无法登录。

[gbase@localhost ~]$ gcadmin
CLUSTER STATE:  ACTIVE
CLUSTER MODE:   NORMAL

=================================================================
|             GBASE COORDINATOR CLUSTER INFORMATION             |
=================================================================
|   NodeName   |     IpAddress     |gcware |gcluster |DataState |
-----------------------------------------------------------------
| coordinator1 |    10.0.2.201     | OPEN  |  OPEN   |    0     |
-----------------------------------------------------------------
| coordinator2 |    10.0.2.202     | OPEN  |  OPEN   |    0     |
-----------------------------------------------------------------
| coordinator3 |    10.0.2.203     | OPEN  |  OPEN   |    0     |
-----------------------------------------------------------------
=============================================================
|              GBASE DATA CLUSTER INFORMATION               |
=============================================================
|NodeName |     IpAddress     |gnode |syncserver |DataState |
-------------------------------------------------------------
|  node1  |    10.0.2.201     | OPEN |   OPEN    |    0     |
-------------------------------------------------------------
|  node2  |    10.0.2.202     | OPEN |   OPEN    |    0     |
-------------------------------------------------------------
|  node3  |    10.0.2.203     | OPEN |   OPEN    |    0     |
-------------------------------------------------------------
[gbase@localhost ~]$ gccli -utestdb -p1234 -h10.0.2.202

GBase client 8.6.2.43-R35.5_patch.817abae0. Copyright (c) 2004-2024, GBase.  All Rights Reserved.

gbase> ^CAborted
[gbase@localhost ~]$ gccli -utestdb -p1234 -h10.0.2.201
ERROR 1045 (28000): Access denied for user 'testdb'@'10.0.2.201' (using password: YES)
[gbase@localhost ~]$ gccli

在使用了连接池,配置了failover参数时,会自动连接下一个IP,比如下面配置了3个IP。原有密码为1234, 而201我们手工改成了123,所以后面执行时,201节点报错,会自动连接下一个202,并执行成功。

[gbase@localhost ~]$ gccli -h10.0.2.201,10.0.2.202,10.0.2.203 -utestdb -p1234  -e"select now()"
ERROR 1045 (28000): Access denied for user 'testdb'@'10.0.2.201' (using password: YES)
+---------------------+
| now()               |
+---------------------+
| 2024-05-15 09:13:53 |
+---------------------+
[gbase@localhost ~]$

恢复方法

与修改方法一样,将原有密码密文更新,然后刷新即可。

update gbase.user set password='XXXXXXXXX' where user='testdb';
flush privileges;

修改后无法登录处理方法

如果修改后,将所有用户都设置了,导致该节点所有数据库用户都无法登录了。可以从其它gcluster复制user表过来。

scp 10.0.2.202:/opt/gcluster/userdata/gcluster/gbase/user.* /opt/gcluster/userdata/gcluster/gbase/

然后重启这个节点gcluster服务

gcluster_services gcluster restart