MySQL Shell 8.4  /  MySQL InnoDB ClusterSet  /  InnoDB ClusterSet 用户帐户

8.3 InnoDB ClusterSet 用户帐户

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

在 InnoDB ClusterSet 部署中,每个成员服务器都是 InnoDB 集群的一部分,因此它们需要相同类型的用户帐户。主集群的用户帐户用于部署中的所有集群。每个用户帐户都必须存在于部署中每个集群(包括主集群和副本集群)的每个成员服务器上。

InnoDB 集群服务器配置帐户

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

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

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

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

在 InnoDB ClusterSet 部署中,必须在部署中使用的每个服务器实例上存在相同的 InnoDB 集群服务器配置帐户。因此,当您设置副本集群时,您需要使用 clusterAdmin 选项发出 dba.configureInstance() 命令,以在将要成为副本集群一部分的每个服务器实例上创建帐户。该命令必须命名主集群中的 InnoDB 集群服务器配置帐户,并且您必须为它指定相同的密码。您需要在将实例加入副本集群之前执行此步骤,以便该帐户可用于配置副本 InnoDB 集群以及 InnoDB ClusterSet 部署元数据和复制。

InnoDB 集群管理员帐户

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

要为 InnoDB ClusterSet 部署创建 InnoDB 集群管理员帐户,请在将所有实例添加到主集群后,在主集群中的一个成员服务器上发出 cluster.setupAdminAccount() 命令。此命令将使用您指定的用户名和密码创建一个帐户,并具有所有必需的权限。创建具有 cluster.setupAdminAccount() 的帐户的事务将发送到集群中的所有其他服务器实例,以在这些实例上创建帐户。

如果您开始设置 InnoDB ClusterSet 部署时,主 InnoDB 集群已经存在,那么很可能已经存在 InnoDB 集群管理员帐户。在这种情况下,您无需再次发出 cluster.setupAdminAccount() 命令,除非您想要创建其他 InnoDB 集群管理员帐户。

InnoDB ClusterSet 部署中的副本集群必须与主集群具有相同的 InnoDB 集群管理员帐户集。但是,当您创建副本集群时,请不要尝试自己设置 InnoDB 集群管理员帐户。使用 cluster.setupAdminAccount() 创建帐户的事务将写入主集群的二进制日志,并在供应过程中自动从主集群复制到副本集群。当副本集群应用这些事务时,它会在副本集群中的成员服务器上创建相同的帐户。如果帐户已存在于副本集群中的服务器上,则会导致复制错误,并且服务器无法加入集群。因此,您需要等待它们被复制。

如果在主集群上创建 InnoDB 集群管理员帐户的事务发生在一段时间之前,则事务可能需要一些时间才能被复制,并且帐户可能需要一些时间才能显示在副本集群上。选择克隆作为副本集群的供应方法可以加快此过程。

注意

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

当 InnoDB ClusterSet 部署完成时,您可以使用 cluster.setupAdminAccount() 为 ClusterSet 创建其他 InnoDB 集群管理员帐户。您可以在连接到 InnoDB ClusterSet 部署中的任何成员服务器(主集群或副本集群中的任何成员服务器)时执行此操作。创建帐户的事务将路由到主集群以执行,然后复制到副本集群中的所有服务器,在所有服务器上创建帐户。

MySQL Router 帐户

这些帐户由 MySQL Router 用于连接到 InnoDB 集群和 InnoDB ClusterSet 部署中的服务器实例。您可以设置多个这样的帐户。每个帐户都必须存在于 InnoDB 集群中的每个成员服务器上,并具有相同的用户名和密码或 SSL 证书,以及 InnoDB ClusterSet 部署中每个集群的每个成员服务器上。

创建 MySQL Router 帐户的过程与创建 InnoDB 集群管理员帐户相同,但使用 cluster.setupRouterAccount() 命令。您可以在主集群中的一个成员服务器上创建帐户,或者使用已经存在的帐户(如果在您开始设置 InnoDB ClusterSet 部署时,主 InnoDB 集群已经存在)。然后,让副本集群应用事务以在其成员服务器上创建帐户。有关创建或升级 MySQL Router 帐户的说明,请参阅 第 6.10.2 节,“配置 MySQL Router 用户”.