#### 18.2.1.2 为组复制配置实例

[](<>)

本节介绍您要用于组复制的 MySQL 服务器实例所需的配置设置。有关背景信息，请参阅[第 18.3 节，“要求和限制”](group-replication-requirements-and-limitations.html).

-   [存储引擎](group-replication-configuring-instances.html#group-replication-storage-engines)

-   [复制框架](group-replication-configuring-instances.html#group-replication-configure-replication-framework)

-   [组复制设置](group-replication-configuring-instances.html#group-replication-configure-plugin)

##### 存储引擎

对于 Group Replication，数据必须存储在 InnoDB 事务存储引擎中（有关原因的详细信息，请参阅[第 18.3.1 节，“组复制要求”](group-replication-requirements.html)）。使用其他存储引擎，包括临时[`记忆`](memory-storage-engine.html)存储引擎，可能会导致组复制错误。设置[`disabled_storage_engines`](server-system-variables.html#sysvar_disabled_storage_engines)系统变量如下，以防止其使用：

```
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
```

请注意，与[`MyISAM`](myisam-storage-engine.html)存储引擎已禁用，当您将 MySQL 实例升级到其中的版本时[**mysql\_升级**](mysql-upgrade.html)仍在使用（在 MySQL 8.0.16 之前），[**mysql\_升级**](mysql-upgrade.html)可能会因错误而失败。要处理此问题，您可以在运行时重新启用该存储引擎[**mysql\_升级**](mysql-upgrade.html)，然后在重新启动服务器时再次禁用它。有关详细信息，请参阅[第 4.4.5 节，“mysql_upgrade — 检查和升级 MySQL 表”](mysql-upgrade.html).

##### 复制框架

以下设置根据 MySQL 组复制要求配置复制。

```
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
```

这些设置将服务器配置为使用唯一标识符号 1，以启用[第 17.1.3 节，“使用全局事务标识符进行复制”](replication-gtids.html)，并且只允许执行可以使用 GTID 安全记录的语句。

直到并包括 MySQL 8.0.20，还需要以下设置：

```
binlog_checksum=NONE
```

此设置禁用写入二进制日志的事件的校验和，默认为启用。从 MySQL 8.0.21 开始，Group Replication 支持二进制日志中存在校验和，并且可以使用它们来验证某些通道上事件的完整性，因此您可以使用默认设置。有关更多详细信息，请参阅[第 18.3.2 节，“组复制限制”](group-replication-limitations.html).

如果您使用早于 8.0.3 的 MySQL 版本，其中改进了复制的默认值，您还需要将这些行添加到成员的选项文件中。如果您在更高版本的选项文件中有任何这些系统变量，请确保按所示设置它们。有关更多详细信息，请参阅[第 18.3.1 节，“组复制要求”](group-replication-requirements.html).

```
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64
```

##### 组复制设置

此时，选项文件确保服务器已配置并被指示在给定配置下实例化复制基础结构。以下部分配置服务器的组复制设置。

```
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "s1:33061"
group_replication_group_seeds= "s1:33061,s2:33061,s3:33061"
group_replication_bootstrap_group=off
```

-   `插件加载添加`将 Group Replication 插件添加到服务器在启动时加载的插件列表中。这在生产部署中比手动安装插件更可取。

-   配置[`group_replication_group_name`](group-replication-options.html#sysvar_group_replication_group_name)告诉插件它正在加入或创建的组被命名为“aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa”。

    的价值[`group_replication_group_name`](group-replication-options.html#sysvar_group_replication_group_name)必须是有效的 UUID。您可以使用`选择 UUID()`生成一个。此 UUID 构成 GTID 的一部分，当组成员从客户端接收到的事务以及组成员内部生成的视图更改事件被写入二进制日志时，这些 GTID 会被使用。

-   配置[`group_replication_start_on_boot`](group-replication-options.html#sysvar_group_replication_start_on_boot)可变为`离开`指示插件在服务器启动时不自动启动操作。这在设置组复制时很重要，因为它确保您可以在手动启动插件之前配置服务器。配置成员后，您可以设置[`group_replication_start_on_boot`](group-replication-options.html#sysvar_group_replication_start_on_boot)到`在`以便组复制在服务器启动时自动启动。

-   配置[`group_replication_local_address`](group-replication-options.html#sysvar_group_replication_local_address)设置成员用于与组中其他成员进行内部通信的网络地址和端口。组复制将此地址用于涉及组通信引擎（XCom，Paxos 变体）的远程实例的内部成员到成员连接。

    重要的

    组复制本地地址必须不同于用于 SQL 客户端连接的主机名和端口，由 MySQL 服务器定义[`主机名`](server-system-variables.html#sysvar_hostname)和[`港口`](server-system-variables.html#sysvar_port)系统变量。它不得用于客户端应用程序。它只能用于运行组复制时组成员之间的内部通信。

    配置的网络地址[`group_replication_local_address`](group-replication-options.html#sysvar_group_replication_local_address)必须可由所有组成员解析。例如，如果每个服务器实例位于具有固定网络地址的不同机器上，则可以使用机器的 IP 地址，例如 10.0.0.1。如果使用主机名，则必须使用完全限定名称，并确保可通过 DNS 解析，正确配置`/etc/hosts`文件或其他名称解析过程。从 MySQL 8.0.14 开始，可以使用 IPv6 地址（或解析为它们的主机名）以及 IPv4 地址。一个组可以包含使用 IPv6 的成员和使用 IPv4 的成员的混合。有关 IPv6 网络的组复制支持以及混合 IPv4 和 IPv6 组的更多信息，请参阅[第 18.5.5 节，“对 IPv6 以及混合 IPv6 和 IPv4 组的支持”](group-replication-ipv6.html).

    推荐的端口[`group_replication_local_address`](group-replication-options.html#sysvar_group_replication_local_address)是 33061。[`group_replication_local_address`](group-replication-options.html#sysvar_group_replication_local_address)组复制将其用作复制组内组成员的唯一标识符。您可以为复制组的所有成员使用相同的端口，只要主机名或 IP 地址都不同，如本教程中所示。或者，您可以为所有成员使用相同的主机名或 IP 地址，只要端口都不同，例如如下所示[第 18.2.2 节，“在本地部署组复制”](group-replication-deploying-locally.html).

    现有成员为 Group Replication 的分布式恢复过程提供给加入成员的连接不是由配置的网络地址[`group_replication_local_address`](group-replication-options.html#sysvar_group_replication_local_address).直到 MySQL 8.0.20，组成员提供标准 SQL 客户端连接到加入成员以进行分布式恢复，如 MySQL 服务器的指定[`主机名`](server-system-variables.html#sysvar_hostname)和[`港口`](server-system-variables.html#sysvar_port)系统变量。从 MySQL 8.0.21 开始，组成员可以通告分布式恢复端点的替代列表作为加入成员的专用客户端连接。有关更多详细信息，请参阅[第 18.5.4.1 节，“分布式恢复的连接”](group-replication-distributed-recovery-connections.html).

    重要的

    如果加入的成员无法使用 MySQL 服务器定义的主机名正确识别其他成员，分布式恢复可能会失败[`主机名`](server-system-variables.html#sysvar_hostname)系统变量。建议运行 MySQL 的操作系统使用 DNS 或本地设置正确配置唯一的主机名。服务器用于 SQL 客户端连接的主机名可以在`会员主机`性能架构表的列[`复制组成员`](performance-schema-replication-group-members-table.html).如果多个组成员将操作系统设置的默认主机名外部化，则加入的成员有可能无法将其解析为正确的成员地址，并且无法连接以进行分布式恢复。在这种情况下，您可以使用 MySQL Server 的[`报告主机`](replication-options-replica.html#sysvar_report_host)系统变量来配置一个唯一的主机名，以供每个服务器外部化。

-   配置[`group_replication_group_seeds`](group-replication-options.html#sysvar_group_replication_group_seeds)设置组成员的主机名和端口，新成员用于建立与组的连接。这些成员称为种子成员。建立连接后，组成员身份信息将列在 Performance Schema 表中[`复制组成员`](performance-schema-replication-group-members-table.html).通常情况下[`group_replication_group_seeds`](group-replication-options.html#sysvar_group_replication_group_seeds)列表包含`主机名：端口`每个小组成员的[`group_replication_local_address`](group-replication-options.html#sysvar_group_replication_local_address)，但这不是强制性的，可以选择组成员的子集作为种子。

    重要的

    这`主机名：端口`列于[`group_replication_group_seeds`](group-replication-options.html#sysvar_group_replication_group_seeds)是种子成员的内网地址，由[`group_replication_local_address`](group-replication-options.html#sysvar_group_replication_local_address)而不是`主机名：端口`用于 SQL 客户端连接，例如在 Performance Schema 表中显示[`复制组成员`](performance-schema-replication-group-members-table.html).

    启动组的服务器不使用此选项，因为它是初始服务器，因此它负责引导组。换句话说，服务器上引导组的任何现有数据都将用作下一个加入成员的数据。第二台服务器加入要求组中唯一的成员加入，第二台服务器上的任何缺失数据都从引导成员上的供体数据复制，然后组扩展。第三个服务器加入可以要求这两个中的任何一个加入，数据同步到新成员，然后组再次扩展。后续服务器在加入时重复此过程。

    警告

    同时加入多个服务器时，请确保它们指向已在组中的种子成员。不要将也加入群组的成员用作种子，因为他们在联系时可能尚未加入群组。

    最好先启动引导成员，然后让它创建组。然后让它成为其他加入的成员的种子成员。这样可以确保在加入其余成员时形成一个组。

    不支持创建群组并同时加入多个成员。它可能会起作用，但很有可能操作竞赛以及加入该组的行为最终会出现错误或超时。

    加入成员必须使用种子成员在[`group_replication_group_seeds`](group-replication-options.html#sysvar_group_replication_group_seeds)选项。出于组复制的 IP 地址权限的目的，种子成员上的允许列表必须包含种子成员提供的协议的加入成员的 IP 地址，或解析为该协议地址的主机名。除了加入成员的地址之外，还必须设置并允许此地址或主机名[`group_replication_local_address`](group-replication-options.html#sysvar_group_replication_local_address)如果该地址的协议与种子成员的广告协议不匹配。如果加入成员没有适当协议的允许地址，则拒绝其连接尝试。有关详细信息，请参阅[第 18.6.4 节，“组复制 IP 地址权限”](group-replication-ip-address-permissions.html).

-   配置[`group_replication_bootstrap_group`](group-replication-options.html#sysvar_group_replication_bootstrap_group)指示插件是否引导组。在这种情况下，即使 s1 是组的第一个成员，我们也会在选项文件中将此变量设置为 off。相反，我们配置[`group_replication_bootstrap_group`](group-replication-options.html#sysvar_group_replication_bootstrap_group)当实例运行时，确保只有一个成员实际引导组。

    重要的

    这[`group_replication_bootstrap_group`](group-replication-options.html#sysvar_group_replication_bootstrap_group)变量只能在任何时候在属于一个组的一个服务器实例上启用，通常是在您第一次引导组时（或者在整个组被关闭并再次备份的情况下）。如果您多次引导组，例如当多个服务器实例设置了此选项时，那么它们可以创建一个人工裂脑场景，其中存在两个具有相同名称的不同组。始终设置[`group_replication_bootstrap_group=off`](group-replication-options.html#sysvar_group_replication_bootstrap_group)在第一个服务器实例上线后。

    本教程中描述的系统变量是启动新成员所需的配置设置，但其他系统变量也可用于配置组成员。这些都列在[第 18.9 节，“组复制系统变量”](group-replication-options.html).

重要的

许多系统变量，一些特定于 Group Replication，而另一些不是，是组范围的配置设置，必须在所有组成员上具有相同的值。如果组成员为这些系统变量之一设置了值，而加入成员为其设置了不同的值，则加入成员无法加入组并返回错误消息。如果组成员为此系统变量设置了值，而加入成员不支持该系统变量，则无法加入组。这些系统变量都在[第 18.9 节，“组复制系统变量”](group-replication-options.html).
