MySQL Shell 9.0  /  MySQL InnoDB ClusterSet  /  InnoDB ClusterSet 要求

8.1 InnoDB ClusterSet 要求

InnoDB ClusterSet 部署的基础是一个现有的 MySQL 8.0.27 或更高版本的 InnoDB 集群,以及一些可以组成副本集群的独立 MySQL 服务器实例,为这个主集群提供灾难容错。如果您想试用 InnoDB ClusterSet,可以使用 MySQL Shell 在本地机器上设置沙盒部署。您需要安装 MySQL Server 8.0.27 或更高版本以及 MySQL Router 8.0.27 或更高版本。使用 MySQL Shell 中的 AdminAPI 命令,您可以创建沙盒 MySQL 服务器实例,使用其中一些实例设置 InnoDB 集群,然后按照本节中的说明,使用其他实例作为副本集群来设置 InnoDB ClusterSet 部署。有关部署和管理沙盒实例的说明,请参见 第 6.8 节 “AdminAPI MySQL 沙盒”

重要

建议您始终使用可用的最新版本的 MySQL Shell、MySQL Router 和 MySQL Server。最新版本的 MySQL Shell 可以与任何 GA 版本的 MySQL 8.0 或更高版本一起使用。

要设置 InnoDB ClusterSet 的生产部署,请确保您已准备就绪以下组件

软件组件

设置 InnoDB ClusterSet 部署需要 MySQL Server 8.0.27 或更高版本、MySQL Shell 8.0.27 或更高版本以及 MySQL Router 8.0.27 或更高版本。这些是 AdminAPI 所需的软件组件。请参见 第 6.2 节 “安装 AdminAPI 软件组件”

始终使用可用的最新版本的 MySQL Shell 和 MySQL Router,并确保它们的版本与 MySQL Server 版本相同或更高。这两个产品都可以管理较旧版本的 MySQL Server,但较旧版本无法管理较新版本的 MySQL Server 中的功能。

InnoDB 集群

一个将作为主集群的现有 InnoDB 集群。InnoDB ClusterSet 部署将为该集群提供灾难容错。组复制组可以作为 InnoDB 集群采用。有关设置 InnoDB 集群或采用组复制组的说明,请参见 第 7.4 节 “部署生产 InnoDB 集群”

将作为主集群的 InnoDB 集群必须满足以下要求

  • 该集群不得已经是 InnoDB ClusterSet 部署的一部分。一个 InnoDB 集群只能参与一个 InnoDB ClusterSet 部署。

  • 集群中的所有成员服务器实例必须为 MySQL 8.0.27 或更高版本。

  • InnoDB 集群元数据版本必须为 2.1.0 或更高版本。当您对集群执行任何操作时(例如,dba.getCluster() 命令),如果集群的元数据需要更新,AdminAPI 会发出警告。您可以通过在 MySQL Shell 8.0.27 或更高版本中发出 dba.upgradeMetadata() 命令,将元数据更新到适合 InnoDB ClusterSet 操作的版本。请注意,在您升级了集群的元数据后,将无法再使用旧版本的 MySQL Shell 管理它。有关更多信息,请参见 第 6.11 节 “升级元数据架构”

  • 集群必须处于单主模式。InnoDB 集群可以处于单主模式或多主模式,但 InnoDB ClusterSet 不支持多主模式。您可以使用 MySQL Shell 中的 cluster.switchToSinglePrimaryMode() 命令将多主模式的集群转换为单主模式,并选择一个实例作为主服务器。

  • 对于 MySQL Server 8.0.27 到 8.2.0 版本,对于属于 InnoDB ClusterSet 的 InnoDB 集群,必须在集群中的所有成员服务器上使用相同的值设置 group_replication_view_change_uuid 系统变量,以便为视图更改事件提供备用 UUID。从 MySQL 8.0.27 开始,使用 dba.createCluster() 命令创建的 InnoDB 集群会在所有成员服务器上生成并设置该系统变量的值。在 MySQL 8.0.27 之前创建的 InnoDB 集群可能没有设置该系统变量,但 InnoDB ClusterSet 创建过程会检查这一点,如果不存在该变量,则会发出警告并失败。

    注意

    运行 MySQL Server 8.3.0 或更高版本的 InnoDB 集群不需要这样做。

    Cluster.rescan() 命令可用于在 InnoDB 集群中的所有成员服务器上生成并设置 group_replication_view_change_uuid 的值。该命令会返回一条警告消息,提醒您必须为该系统变量设置一个值,或者您可以启用 updateViewChangeUuid 选项,以便在扫描期间自动生成并设置一个值。重新启动集群后,您可以重试 InnoDB ClusterSet 创建过程。

  • 组外服务器到任何成员服务器上都不能有任何入站复制通道。组复制自动创建的通道(group_replication_appliergroup_replication_recovery)是允许的。

  • 您需要知道集群的 InnoDB Cluster 服务器配置帐户用户名和密码(请参见 第 8.3 节 “InnoDB ClusterSet 的用户帐户”)。这是在 InnoDB 集群中的成员服务器上使用 dba.configureInstance 设置的帐户。您需要在将组成副本集群的 MySQL 服务器实例上创建此帐户,并使用它来设置它们。

    注意

    您不能使用 InnoDB 集群管理员帐户(使用 cluster.setupAdminAccount() 设置)来设置副本集群的独立 MySQL 服务器实例。cluster.setupAdminAccount() 在独立实例上不可用,如果您使用 dba.configureInstance 或手动在独立实例上创建这些帐户之一,则该帐户随后将从主集群复制,导致复制因错误而停止。

  • 在创建 InnoDB ClusterSet 部署时,InnoDB 集群必须处于联机和健康状态,并且其主成员服务器必须可以使用 MySQL Shell 访问。

MySQL 服务器实例

一些可以组成一个或多个副本集群的独立 MySQL 服务器实例。为了实现容错,建议每个副本集群至少包含三个成员服务器,但 InnoDB ClusterSet 部署可以包含由单个服务器实例组成的副本集群。在用于灾难容错的生产部署中,每个副本集群将位于备用位置,例如不同的数据中心。

您在副本集群中使用的每个 MySQL 服务器实例都必须满足以下要求

  • 该服务器不是 InnoDB ClusterSet 部署、InnoDB ClusterSet 或 InnoDB ReplicaSet 的一部分。

  • 您不需要服务器上的数据。如果该服务器以前用于处理事务,则在将其设置为副本集群的成员时,数据将被覆盖(除非这些事务恰好是主集群上的事务的子集)。

  • 该服务器不是当前正在运行的组复制组的一部分(即使单个服务器已离开该组)。您不能将现有的组复制组或其当前或以前的成员作为副本集群采用。如果您想使用当前位于复制组中的服务器实例,请在该组的所有成员上发出 STOP GROUP_REPLICATION,以便该组完全脱机。然后,可以使用 AdminAPI 将这些独立的服务器实例组成一个副本集群。

    重要

    对于将以前的组复制组成员用作 InnoDB ClusterSet 副本集群的成员,请谨慎行事,尤其是在您对组复制配置选项进行了大量更改,或者该组是在早期版本中创建的,并且您根据该版本的情况进行了配置更改时。

    InnoDB ClusterSet 副本集群创建过程会覆盖您在命令中为其指定了新设置的任何现有的持久化组复制配置选项。它还会始终覆盖以下系统变量,即使您没有在命令中指定它们:group_replication_group_namegroup_replication_group_seedsgroup_replication_local_addressgroup_replication_view_change_uuid(仅限 8.0.27 到 8.2.0 版本)和 group_replication_enforce_update_everywhere_checks。但是,您更改的其他组复制配置选项将保留原样。这些自定义设置可能会干扰 InnoDB ClusterSet 的运行或性能,因为 InnoDB ClusterSet 预计将对在 InnoDB ClusterSet 副本集群创建过程中未更改的组复制配置选项使用 MySQL 8.0.27 默认值。

    如果您确实需要使用已配置的组复制服务器,请尽可能检查并移除任何自定义设置,尤其要检查 group_replication_single_primary_mode 系统变量是否设置为默认值 ON。在这种情况下,对于以前的组复制组成员来说,最安全的选择是重新安装 MySQL 服务器,而不是将安装升级到 MySQL 8.0.27。

  • 服务器版本为 MySQL 8.0.27 或更高版本。如果您想通过克隆为副本集群配置更多成员服务器,则所有服务器必须处于相同的版本和相同的操作系统上。

  • 服务器具有在整个 InnoDB ClusterSet(包括任何离线或不可达的成员服务器)中唯一的服务器 ID(server_id 系统变量)和服务器 UUID(server_uuid 系统变量)。

  • 服务器上未配置入站复制通道。只允许使用组复制通道(group_replication_appliergroup_replication_recovery)。

  • 服务器可以连接到 InnoDB ClusterSet 中的主集群,并且主集群可以连接到该服务器。

  • 在创建 InnoDB ClusterSet 部署时,服务器必须处于联机和运行状况良好的状态,并且可以使用 MySQL Shell 访问。

所需的的用户帐户凭据、InnoDB ClusterSet 元数据和组复制配置将在 InnoDB ClusterSet 副本集群创建过程中进行设置。

MySQL Router 实例

一个或多个 MySQL Router 实例,用于将客户端应用程序流量路由到 InnoDB ClusterSet 部署中的相应集群。MySQL Router 的建议部署是在与客户端应用程序相同的主机上。

重要

如果您正在使用现有的 InnoDB Cluster 作为 InnoDB ClusterSet 部署中的主集群,并且您已经针对该集群引导了 MySQL Router,请使用针对 InnoDB ClusterSet 的 --force 选项再次引导它,然后停止并重新启动 MySQL Router。MySQL Router 实例的静态配置文件中的设置需要针对 InnoDB ClusterSet 进行更新。请按照 第 8.5 节 “将 MySQL Router 与 InnoDB ClusterSet 集成” 中描述的过程进行操作。