NDB 8.0 引入了一种新机制,用于在连接到 NDB Cluster 的 SQL 节点之间共享和同步用户、角色和权限。这可以通过授予
NDB_STORED_USER
特权来启用。有关使用信息,请参阅权限说明。
NDB_STORED_USER
与任何其他特权一样打印在输出中
SHOW GRANTS
,如下所示:
mysql> SHOW GRANTS for 'jon'@'localhost';
+---------------------------------------------------+
| Grants for jon@localhost |
+---------------------------------------------------+
| GRANT USAGE ON *.* TO `jon`@`localhost` |
| GRANT NDB_STORED_USER ON *.* TO `jon`@`localhost` |
+---------------------------------------------------+
您还可以使用 NDB Cluster 提供的ndb_select_all实用程序 验证此帐户是否共享特权,如下所示(一些输出包装以保留格式):
$> ndb_select_all -d mysql ndb_sql_metadata | grep '`jon`@`localhost`'
12 "'jon'@'localhost'" 0 [NULL] "GRANT USAGE ON *.* TO `jon`@`localhost`"
11 "'jon'@'localhost'" 0 2 "CREATE USER `jon`@`localhost`
IDENTIFIED WITH 'caching_sha2_password' AS
0x2441243030352466014340225A107D590E6E653B5D587922306102716D752E6656772F3038512F
6C5072776D30376D37347A384B557A4C564F70495158656A31382E45324E33
REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT
PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT"
12 "'jon'@'localhost'" 1 [NULL] "GRANT NDB_STORED_USER ON *.* TO `jon`@`localhost`"
ndb_sql_metadata
是使用mysql或其他 MySQL 客户端
NDB
不可见
的特殊
表。
授予
NDB_STORED_USER
权限的语句(例如
GRANT NDB_STORED_USER ON *.* TO
'cluster_app_user'@'localhost'
)通过指示
NDB
使用查询
SHOW CREATE USER cluster_app_user@localhost
和
创建快照SHOW GRANTS FOR cluster_app_user@localhost
,然后将结果存储在中来工作ndb_sql_metadata
。然后请求任何其他 SQL 节点读取和应用快照。每当 MySQL 服务器启动并作为 SQL 节点加入集群时,它都会执行这些存储
CREATE USER
的
GRANT
语句,作为集群模式同步过程的一部分。
每当 SQL 语句在其起源节点以外的 SQL 节点上执行时,该语句都会在NDBCLUSTER
存储引擎的实用程序线程中运行;这是在与 MySQL 复制副本应用程序线程等效的安全环境中完成的。
从 NDB 8.0.27 开始,执行更改用户权限的 SQL 节点在执行此操作之前需要全局锁,这可以防止在不同 SQL 节点上并发 ACL 操作造成死锁。在 NDB 8.0.27 之前,对 users 的更改以
NDB_STORED_USER
完全异步的方式更新,没有采取任何锁定。
您应该记住,因为共享模式更改操作是同步执行的,所以在对任何一个或多个共享用户进行更改后的下一个共享模式更改将用作同步点。在架构更改分发开始之前,任何待处理的用户更改都会运行完成;在此之后,架构更改本身会同步运行。例如,如果
DROP DATABASE
语句跟在
DROP USER
分布式用户的 a 之后,则只有在所有 SQL 节点上完成用户删除后,才能删除数据库。
如果来自多个 SQL 节点的多个GRANT
、
REVOKE
或其他用户管理语句导致给定用户的权限在不同的 SQL 节点上发生分歧,您可以通过GRANT NDB_STORED_USER
在权限已知的 SQL 节点上为该用户发出命令来解决此问题正确的; 这会导致获取权限的新快照并将其同步到其他 SQL 节点。
NDB Cluster 8.0 不支持通过更改 MySQL 权限表在 NDB Cluster 中跨 SQL 节点分配 MySQL 用户和权限,以便它们使用
NDB
NDB 7.6 和早期版本中的存储引擎(请参阅
使用共享授权表的分布式权限)。有关此更改对从先前版本升级到 NDB 8.0 的影响的信息,请参阅
第 23.3.7 节,“升级和降级 NDB Cluster”。