MySQL Shell 9.0  /  ...  /  创建 InnoDB 集群

7.4.3 创建 InnoDB 集群

准备好实例后,使用 dba.createCluster() 函数创建集群,使用 MySQL Shell 连接到的实例作为集群的种子实例。种子实例会复制到您添加到集群的其他实例,使其成为种子实例的副本。在本过程中,ic-1 实例用作种子实例。当您发出 dba.createCluster(名称) 时,MySQL Shell 会创建一个到连接到 MySQL Shell 当前全局会话的服务器实例的经典 MySQL 协议会话。例如,要创建一个名为 testCluster 的集群并将返回的集群分配给名为 cluster 的变量,请执行以下操作

mysql-js> var cluster = dba.createCluster('testCluster')
Validating instance at icadmin@ic-1:3306...
This instance reports its own address as ic-1
Instance configuration is suitable.
Creating InnoDB cluster 'testCluster' on 'icadmin@ic-1:3306'...
Adding Seed Instance...
Cluster successfully created. Use Cluster.addInstance() to add MySQL instances.
At least 3 instances are needed for the cluster to be able to withstand up to
one server failure.
注意

集群名称不能为空,并且长度不能超过 63 个字符。它只能以字母数字字符或 _(下划线)开头,并且只能包含字母数字、_(下划线)、.(句点)或 -(连字符)字符。

这种将返回的集群分配给变量的模式使您能够使用集群对象的 方法对集群执行进一步的操作。返回的 Cluster 对象使用一个新的会话,该会话独立于 MySQL Shell 的全局会话。这可确保如果您更改 MySQL Shell 全局会话,则集群对象会维护其到实例的会话。

为了能够管理集群,您必须确保您有一个具有所需权限的合适用户。建议的方法是创建一个管理用户。如果您在配置实例时没有创建管理用户,请使用 集群.setupAdminAccount() 操作。例如,要创建一个名为 icadmin 的用户,该用户可以管理分配给变量 cluster 的 InnoDB 集群,请发出

mysql-js> cluster.setupAdminAccount("icadmin")

有关 InnoDB 集群管理员帐户的更多信息,请参见 手动配置 InnoDB 集群管理员帐户

当您运行 dba.createCluster() 时,以及当您通过运行 集群.addInstance() 将另一个服务器实例添加到 InnoDB 集群时,以下错误将记录到 MySQL 服务器实例的错误日志中。这些消息是无害的,与 AdminAPI 启动组复制的方式有关

2020-02-10T10:53:43.727246Z 12 [ERROR] [MY-011685] [Repl] Plugin
group_replication reported: 'The group name option is mandatory'
2020-02-10T10:53:43.727292Z 12 [ERROR] [MY-011660] [Repl] Plugin
group_replication reported: 'Unable to start Group Replication on boot'
注意

如果遇到与元数据不可访问相关的错误,则可能是配置了环回网络接口。为了正确使用 InnoDB 集群,请禁用环回接口。

要检查集群是否已创建,请使用集群实例的 status() 函数。请参见 使用 集群.status() 检查集群的状态

提示

一旦服务器实例属于一个集群,就只能使用 MySQL Shell 和 AdminAPI 来管理它们,这一点很重要。不支持在将实例添加到集群后尝试手动更改实例上的组复制配置。类似地,在使用 AdminAPI 配置实例后修改对 InnoDB 集群至关重要的服务器变量(例如 server_uuid)也不受支持。

当您使用 MySQL Shell 创建集群时,您可以设置在将实例从集群中驱逐之前等待的时间量,例如当它们变得不可达时。将 expelTimeout 选项传递给 dba.createCluster() 操作,这将在种子实例上配置 group_replication_member_expel_timeout 变量。expelTimeout 选项可以采用 0 到 3600 范围内的整数值。所有运行 MySQL Server 8.0.13 及更高版本且已添加到配置了 expelTimeout 的集群中的实例都将自动配置为具有与种子实例上配置的相同的 expelTimeout 值。

有关可以传递给 dba.createCluster() 的其他选项的信息,请参见 第 7.9 节“修改或解散 InnoDB 集群”

可以使用 dba.createCluster() 启用或禁用 group_replication_paxos_single_leader

注意

这只能由 MySQL Shell 在 MySQL Server 8.0.31 或更高版本上设置,因为 MySQL Shell 需要 replication_group_communication_information 表中 WRITE_CONSENSUS_SINGLE_LEADER_CAPABLE 提供的信息,该信息是在 MySQL 8.0.31 中引入的。

InnoDB 集群 replicationAllowedHost

当您创建一个集群时,如果您有安全要求,即 AdminAPI 自动创建的所有帐户都具有严格的身份验证要求,则可以为 replicationAllowedHost 集群配置选项设置一个值。replicationAllowedHost 选项意味着自动创建的所有帐户只能使用严格的基于子网的过滤从允许的主机连接。以前,InnoDB 集群创建的内部用户帐户默认情况下可以从任何地方访问。

replicationAllowedHost 选项可以采用字符串值。例如,要创建一个名为 testCluster 的集群并将 replicationAllowedHost 选项设置为 192.0.2.0/24,请发出

mysql-js> dba.createCluster('testCluster', {replicationAllowedHost:'192.0.2.0/24'})

配置通信栈

InnoDB 集群支持 MySQL 8.0.27 中为组复制引入的 MySQL 通信栈。

选项 communicationStack: XCOM|MYSQL 设置组复制系统变量 group_replication_communication_stack 的值。

例如

       mysql-js> dba.createCluster("testCluster", {communicationStack: "xcom"})

MYSQL 通信栈是为 MySQL 8.0.27 或更高版本创建的所有新集群的默认值。

有关更多信息,请参见 第 7.5.9 节“配置组复制通信栈”