MySQL 外壳 8.0  / 第 7 章 MySQL InnoDB 集群  /  7.3 InnoDB Cluster 的用户帐户

7.3 InnoDB Cluster 的用户帐户

InnoDB Cluster 中的成员服务器使用三种类型的用户帐户。一个 InnoDB Cluster 服务器配置帐户用于配置集群的服务器实例。可以创建一个或多个 InnoDB Cluster 管理员帐户,供管理员在集群设置后管理服务器实例。可以为MySQL Router实例创建一个或多个MySQL Router账号来连接集群。每个用户帐户必须存在于 InnoDB Cluster 中的所有成员服务器上,具有相同的用户名和相同的密码。

InnoDB Cluster 服务器配置账号

此帐户用于创建和配置 InnoDB Cluster 的成员服务器。每个成员服务器只有一个服务器配置帐户。必须在集群中的每个成员服务器上使用相同的用户帐户名和密码。root为此, 您可以使用服务器上的帐户,但如果这样做,root集群中每个成员服务器上的帐户都必须具有相同的密码。出于安全原因,不建议这样做。

首选方法是使用 带有选项的dba.configureInstance()命令 创建 InnoDB Cluster 服务器配置帐户。clusterAdmin为了更好的安全性,请在交互式提示中指定密码,否则使用clusterAdminPassword 选项指定。在将成为 InnoDB 集群一部分的每个服务器实例上以相同的方式创建具有相同用户名和密码的相同帐户 - 包括您连接到以创建集群的实例,以及将加入集群的实例在那之后。

dba.configureInstance()命令会自动授予帐户所需的权限。如果愿意,您可以手动设置帐户,授予它 手动配置 InnoDB 集群管理员帐户中列出的权限。除了完全的 MySQL 管理员权限之外,该帐户还需要对 InnoDB Cluster 元数据表具有完全的读写权限。

您使用该dba.configureInstance() 操作创建的 InnoDB Cluster 服务器配置帐户不会复制到 InnoDB Cluster 中的其他服务器。MySQL Shell 禁用 dba.configureInstance()操作的二进制日志记录。这意味着您必须在每个服务器实例上单独创建帐户。

InnoDB Cluster 管理员帐户

完成配置过程后,这些帐户可用于管理 InnoDB Cluster。您可以设置多个。每个帐户必须存在于 InnoDB Cluster 中的每个成员服务器上,并具有相同的用户名和密码。

cluster.setupAdminAccount() 要为 InnoDB ClusterSet 部署创建 InnoDB Cluster 管理员帐户,请在将所有实例添加到该集群后 发出 命令。该命令使用您指定的用户名和密码创建一个帐户,并具有所有必需的权限。创建帐户的事务 cluster.setupAdminAccount() 被写入二进制日志并发送到集群中的所有其他服务器实例以在它们上创建帐户。

笔记

如果主 InnoDB Cluster 是在 MySQL Shell 8.0.20 之前的版本中设置的,则该 cluster.setupAdminAccount() 命令可能已与 update选项一起使用,以更新 InnoDB Cluster 服务器配置帐户的权限。这是不写入二进制日志的命令的特殊用途。

MySQL 路由器帐户

MySQL Router 使用这些帐户连接到 InnoDB Cluster 中的服务器实例。您可以设置多个。每个帐户必须存在于 InnoDB Cluster 中的每个成员服务器上,并具有相同的用户名和密码。创建 MySQL Router 帐户的过程与创建 InnoDB Cluster 管理员帐户的过程相同,但使用 cluster.setupRouterAccount() 命令。有关创建或升级 MySQL 路由器帐户的说明,请参阅 第 6.10.2 节,“配置 MySQL 路由器用户”

手动配置 InnoDB 集群管理员帐户

如果您想手动配置 InnoDB Cluster 管理用户,该用户需要此处列出的权限,所有权限都带有GRANT OPTION.

笔记

此权限列表基于 MySQL Shell 的当前版本。这些特权可能会在不同版本之间发生变化。因此,推荐的设置管理帐户的方法是使用 dba.configureInstance()or cluster.setupAdminAccount() 操作。

重要的

用于管理 InnoDB Cluster、InnoDB ClusterSet 或 InnoDB ReplicaSet 部署的每个帐户必须存在于部署中的所有成员服务器实例上,具有相同的用户名和相同的密码。

如果只需要读取操作,例如为了监视目的创建用户,则可以使用具有更多受限权限的帐户。为用户 your_user提供监控 InnoDB Cluster 问题所需的权限:

GRANT SELECT ON mysql_innodb_cluster_metadata.* TO your_user@'%';
GRANT SELECT ON mysql.slave_master_info TO your_user@'%';
GRANT SELECT ON performance_schema.global_status TO your_user@'%';
GRANT SELECT ON performance_schema.global_variables TO your_user@'%';
GRANT SELECT ON performance_schema.replication_applier_configuration TO your_user@'%';
GRANT SELECT ON performance_schema.replication_applier_status TO your_user@'%';
GRANT SELECT ON performance_schema.replication_applier_status_by_coordinator TO your_user@'%';
GRANT SELECT ON performance_schema.replication_applier_status_by_worker TO your_user@'%';
GRANT SELECT ON performance_schema.replication_connection_configuration TO your_user@'%';
GRANT SELECT ON performance_schema.replication_connection_status TO your_user@'%';
GRANT SELECT ON performance_schema.replication_group_member_stats TO your_user@'%';
GRANT SELECT ON performance_schema.replication_group_members TO your_user@'%';
GRANT SELECT ON performance_schema.threads TO your_user@'%' WITH GRANT OPTION;

如需更多信息,请参阅 账户管理报表

InnoDB Cluster 创建的内部用户账户

作为使用 Group Replication 的一部分,InnoDB Cluster 创建内部恢复用户,以启用集群中服务器之间的连接。这些用户在集群内部,生成的用户的用户名遵循 的命名方案 ,其中对于实例是唯一的。在 8.0.17 之前的版本中,生成的用户的用户名遵循命名方案 。 mysql_innodb_cluster_server_id@%server_idmysql_innodb_cluster_r[10_numbers]

用于这些内部用户的主机名设置为“%”。在 v8.0.17 之前,ipAllowlist受影响的主机名行为是通过在 ipAllowlist. 有关详细信息,请参阅 创建服务器白名单

每个内部用户都有一个随机生成的密码。从 8.0.18 版本开始,AdminAPI 允许您更改为内部用户生成的密码。请参阅 重置恢复帐户密码。随机生成的用户将获得以下授权:

GRANT REPLICATION SLAVE ON *.* to internal_user;

内部用户帐户在种子实例上创建,然后复制到集群中的其他实例。内部用户是:

  • 通过发出创建新集群时生成 dba.createCluster()

  • 通过发出将新实例添加到集群时生成 Cluster.addInstance()

  • 使用主要成员使用的身份验证插件生成

在 v8.0.17 之前,ipAllowlist导致 Cluster.rejoinInstance() 删除旧的内部用户并生成新的而不是重新使用它们。

有关组复制所需的内部用户的更多信息,请参阅 分布式恢复的用户凭据

重置恢复帐户密码

从 8.0.18 版本开始,您可以使用该 Cluster.resetRecoveryAccountsPassword() 操作为 InnoDB Cluster 创建的内部恢复帐户重置密码,例如遵循自定义密码生命周期策略。使用该 Cluster.resetRecoveryAccountsPassword() 操作重置集群使用的所有内部恢复帐户的密码。该操作为每个在线实例的内部恢复帐户设置一个新的随机密码。如果无法访问实例,则操作失败。您可以使用force忽略此类实例的选项,但不建议这样做,并且在使用此操作之前将实例重新联机会更安全。该操作仅适用于InnoDB Cluster创建的密码,不能用于更新手动创建的密码。

笔记

执行此操作的用户必须具有所有必需的管理权限,特别是 CREATE USER,以确保无论是否需要密码验证策略,都可以更改恢复帐户的密码。换句话说,与 password_require_current 系统变量是否启用无关。