权限同步是 NDB 集群用于在 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 集群提供的 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
是一个特殊的 NDB
表,使用 mysql 或其他 MySQL 客户端无法看到。
授予 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 节点以外的 SQL 节点上执行 SQL 语句时,该语句将在 NDBCLUSTER
存储引擎的实用程序线程中运行;这在等效于 MySQL 复制副本应用线程的安全环境中完成。
执行用户权限更改的 SQL 节点在执行此操作之前会获取全局锁,这可以防止不同 SQL 节点上的并发 ACL 操作导致死锁。
您应该记住,由于共享架构更改操作是同步执行的,因此在对任何共享用户或用户进行更改之后的下一次共享架构更改将充当同步点。任何挂起的用户更改都会在架构更改分发开始之前运行完成;在此之后,架构更改本身将同步运行。例如,如果在 DROP USER
分布式用户之后执行 DROP DATABASE
语句,则在所有 SQL 节点上完成删除用户之前,无法删除数据库。
如果来自多个 SQL 节点的多个 GRANT
、REVOKE
或其他用户管理语句导致给定用户的权限在不同 SQL 节点上出现差异,则可以通过在已知权限正确的 SQL 节点上为此用户发出 GRANT NDB_STORED_USER
来解决此问题;这将导致获取新的权限快照并将其同步到其他 SQL 节点。
NDB 集群 8.4 不支持通过更改 MySQL 权限表(使其使用 NDB
存储引擎)来跨 NDB 集群中的 SQL 节点分发 MySQL 用户和权限,就像在旧版本中所做的那样(NDB 7.6 及更早版本 - 请参阅 使用共享授权表进行分布式权限管理)。