#### 18.5.4.1 分布式恢复的连接

当加入的成员在分布式恢复过程中连接到在线的现有成员进行状态转移时，加入的成员在连接上充当客户端，现有成员充当服务器。当通过此连接从捐赠者的二进制日志进行状态传输时（使用异步复制通道`group_replication_recovery`)，加入成员充当副本，现有成员充当源。当通过此连接进行远程克隆操作时，加入成员充当接收者，现有成员充当捐赠者。应用于组复制上下文之外的那些角色的配置设置也可以应用于组复制，除非它们被特定于组复制的配置设置或行为覆盖。

现有成员为分布式恢复提供给加入成员的连接与组复制用于组的在线成员之间通信的连接不同。

-   用于远程 XCom 实例之间 TCP 通信的组复制（XCom，Paxos 变体）的组通信引擎使用的连接由[`group_replication_local_address`](group-replication-options.html#sysvar_group_replication_local_address)系统变量。此连接用于在线成员之间的 TCP/IP 消息。与本地实例的通信是通过使用共享内存的输入通道进行的。

-   对于分布式恢复，直到 MySQL 8.0.20，组成员向加入成员提供标准 SQL 客户端连接，如 MySQL 服务器的指定[`主机名`](server-system-variables.html#sysvar_hostname)和[`港口`](server-system-variables.html#sysvar_port)系统变量。如果一个备用端口号由[`报告端口`](replication-options-replica.html#sysvar_report_port)系统变量，而是使用该变量。

-   从 MySQL 8.0.21 开始，组成员可以将分布式恢复端点的替代列表作为加入成员的专用客户端连接进行广告，从而使您可以将分布式恢复流量与成员的常规客户端用户的连接分开控制。您可以使用[`group_replication_advertise_recovery_endpoints`](group-replication-options.html#sysvar_group_replication_advertise_recovery_endpoints)系统变量，并且成员在加入组时将其分布式恢复端点列表传输到组。默认情况下，成员继续提供标准 SQL 客户端连接，如早期版本中一样。

重要的

如果加入的成员无法使用 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)系统变量来配置一个唯一的主机名，以供每个服务器外部化。

加入成员建立连接进行分布式恢复的步骤如下：

1.  当成员加入组时，它会连接到其列表中包含的种子成员之一[`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)该列表中指定的连接。种子成员可能是组的一个子集。

2.  通过此连接，种子成员使用 Group Replication 的成员资格服务以视图的形式向加入的成员提供组中所有在线成员的列表。成员信息包括分布式恢复端点的详细信息或每个成员为分布式恢复提供的标准 SQL 客户端连接。

3.  加入成员从该列表中选择一个合适的组成员作为其分布式恢复的捐助者，遵循中描述的行为[第 18.5.4.4 节，“分布式恢复的容错”](group-replication-distributed-recovery-fault.html).

4.  然后，加入的成员尝试使用捐赠者公布的分布式恢复端点连接到捐赠者，并按照列表中指定的顺序依次尝试每个节点。如果捐助者未提供端点，则加入成员将尝试使用捐助者的标准 SQL 客户端连接进行连接。连接的 SSL 要求由`group_replication_recovery_ssl_*`中描述的选项[第 18.5.4.1.4 节，“分布式恢复的 SSL 和身份验证”](group-replication-distributed-recovery-connections.html#group-replication-distributed-recovery-connections-ssl).

5.  如果加入成员无法连接到选定的捐助者，它会按照中描述的行为与其他合适的捐助者重试[第 18.5.4.4 节，“分布式恢复的容错”](group-replication-distributed-recovery-fault.html).请注意，如果加入成员在没有建立连接的情况下耗尽了通告的端点列表，它不会回退到捐助者的标准 SQL 客户端连接，而是切换到另一个捐助者。

6.  当加入成员与施主建立分布式恢复连接时，它使用该连接进行状态转移，如[第 18.5.4 节，“分布式恢复”](group-replication-distributed-recovery.html).所使用的连接的主机和端口显示在加入成员的日志中。请注意，如果使用远程克隆操作，当加入成员在操作结束时重新启动时，它会与新的捐助者建立连接，以从二进制日志中传输状态。这可能是与用于远程克隆操作的原始捐赠者的不同成员的连接，也可能是与原始捐赠者的不同连接。在任何情况下，分布式恢复过程都会以与原始捐赠者相同的方式继续进行。

##### 18.5.4.1.1 为分布式恢复端点选择地址

提供的 IP 地址[`group_replication_advertise_recovery_endpoints`](group-replication-options.html#sysvar_group_replication_advertise_recovery_endpoints)作为分布式恢复端点的系统变量不必为 MySQL 服务器配置（也就是说，它们不必由[`管理员地址`](server-system-variables.html#sysvar_admin_address)系统变量或在列表中[`绑定地址`](server-system-variables.html#sysvar_bind_address)系统变量）。它们确实必须分配给服务器。使用的任何主机名都必须解析为本地 IP 地址。可以使用 IPv4 和 IPv6 地址。

为分布式恢复端点提供的端口确实必须为 MySQL 服务器配置，因此它们必须由[`港口`](server-system-variables.html#sysvar_port),[`报告端口`](replication-options-replica.html#sysvar_report_port)， 要么[`管理员端口`](server-system-variables.html#sysvar_admin_port)系统变量。服务器必须侦听这些端口上的 TCP/IP 连接。如果您指定[`管理员端口`](server-system-variables.html#sysvar_admin_port)，分布式恢复的复制用户需要[`SERVICE_CONNECTION_ADMIN`](privileges-provided.html#priv_service-connection-admin)连接的特权。选择[`管理员端口`](server-system-variables.html#sysvar_admin_port)将分布式恢复连接与常规 MySQL 客户端连接分开。

加入的成员按照它们在列表中指定的顺序依次尝试每个端点。如果[`group_replication_advertise_recovery_endpoints`](group-replication-options.html#sysvar_group_replication_advertise_recovery_endpoints)被设定为`默认`提供标准 SQL 客户端连接，而不是端点列表。请注意，标准 SQL 客户端连接不会自动包含在分布式恢复端点列表中，并且如果捐助者的端点列表在没有连接的情况下用尽，则不会作为后备提供。如果要将标准 SQL 客户端连接作为多个分布式恢复端点之一提供，则必须将其显式包含在由[`group_replication_advertise_recovery_endpoints`](group-replication-options.html#sysvar_group_replication_advertise_recovery_endpoints).您可以将它放在最后一个位置，以便它作为连接的最后手段。

组成员的分布式恢复端点（或标准 SQL 客户端连接，如果未提供端点）不需要添加到由[`group_replication_ip_allowlist`](group-replication-options.html#sysvar_group_replication_ip_allowlist)（来自 MySQL 8.0.22）或[`group_replication_ip_whitelist`](group-replication-options.html#sysvar_group_replication_ip_whitelist)系统变量。允许列表仅适用于指定的地址[`group_replication_local_address`](group-replication-options.html#sysvar_group_replication_local_address)对于每个成员。加入成员必须具有与允许列表允许的组的初始连接，以便检索一个或多个地址以进行分布式恢复。

您列出的分布式恢复端点在设置系统变量时验证，并且[`开始 GROUP_REPLICATION`](start-group-replication.html)已发表声明。如果无法正确解析列表，或者由于服务器未侦听主机而无法访问主机上的任何端点，则组复制会记录错误并且不会启动。

##### 18.5.4.1.2 分布式恢复的压缩

从 MySQL 8.0.18 开始，您可以通过从捐赠者的二进制日志中传输状态的方法，选择为分布式恢复配置压缩。在网络带宽有限且捐助者必须将许多事务转移给加入成员的情况下，压缩可以使分布式恢复受益。这[`group_replication_recovery_compression_algorithms`](group-replication-options.html#sysvar_group_replication_recovery_compression_algorithms)和[`group_replication_recovery_zstd_compression_level`](group-replication-options.html#sysvar_group_replication_recovery_zstd_compression_level)系统变量配置允许的压缩算法，并且`zstd`压缩级别，在从捐赠者的二进制日志执行状态传输时使用。有关详细信息，请参阅[第 4.2.8 节，“连接压缩控制”](connection-compression-control.html).

请注意，这些压缩设置不适用于远程克隆操作。当远程克隆操作用于分布式恢复时，克隆插件的[`clone_enable_compression`](clone-plugin-options-variables.html#sysvar_clone_enable_compression)设置适用。

##### 18.5.4.1.3 分布式恢复的复制用户

分布式恢复需要具有正确权限的复制用户，以便 Group Replication 可以建立直接的成员到成员的复制通道。复制用户还必须具有正确的权限才能充当远程克隆操作的供体上的克隆用户。必须使用相同的复制用户对每个组成员进行分布式恢复。有关设置此复制用户的说明，请参阅[第 18.2.1.3 节，“分布式恢复的用户凭证”](group-replication-user-credentials.html).有关保护复制用户凭据的说明，请参阅[第 18.6.3.1 节，“用于分布式恢复的安全用户凭证”](group-replication-secure-user.html).

##### 18.5.4.1.4 分布式恢复的 SSL 和身份验证

用于分布式恢复的 SSL 与用于正常组通信的 SSL 分开配置，这由服务器的 SSL 设置和[`group_replication_ssl_mode`](group-replication-options.html#sysvar_group_replication_ssl_mode)系统变量。对于分布式恢复连接，专用组复制分布式恢复 SSL 系统变量可用于配置证书和密码的使用，专门用于分布式恢复。

默认情况下，SSL 不用于分布式恢复连接。要激活它，请设置[`group_replication_recovery_use_ssl=ON`](group-replication-options.html#sysvar_group_replication_recovery_use_ssl)，并配置 Group Replication 分布式恢复 SSL 系统变量，如中所述[第 18.6.3 节，“保护分布式恢复连接”](group-replication-distributed-recovery-securing.html).您需要一个设置为使用 SSL 的复制用户。

当分布式恢复配置为使用 SSL 时，组复制将此设置应用于远程克隆操作，以及来自捐赠者二进制日志的状态传输。组复制自动配置克隆 SSL 选项的设置 ([`clone_ssl_ca`](clone-plugin-options-variables.html#sysvar_clone_ssl_ca),[`clone_ssl_cert`](clone-plugin-options-variables.html#sysvar_clone_ssl_cert)， 和[`clone_ssl_key`](clone-plugin-options-variables.html#sysvar_clone_ssl_key)) 以匹配相应组复制分布式恢复选项的设置 ([`group_replication_recovery_ssl_ca`](group-replication-options.html#sysvar_group_replication_recovery_ssl_ca),[`group_replication_recovery_ssl_cert`](group-replication-options.html#sysvar_group_replication_recovery_ssl_cert)， 和[`group_replication_recovery_ssl_key`](group-replication-options.html#sysvar_group_replication_recovery_ssl_key)）。

如果您不使用 SSL 进行分布式恢复（所以[`group_replication_recovery_use_ssl`](group-replication-options.html#sysvar_group_replication_recovery_use_ssl)被设定为`离开`)，组复制的复制用户帐户通过`cache_sha2_password`插件（这是 MySQL 8.0 中的默认设置）或`sha256_password`插件，RSA 密钥对用于密码交换。在这种情况下，要么使用[`group_replication_recovery_public_key_path`](group-replication-options.html#sysvar_group_replication_recovery_public_key_path)系统变量来指定 RSA 公钥文件，或使用[`group_replication_recovery_get_public_key`](group-replication-options.html#sysvar_group_replication_recovery_get_public_key)从源请求公钥的系统变量，如中所述[第 18.6.3.1.1 节，“使用缓存 SHA-2 身份验证插件的复制用户”](group-replication-secure-user.html#group-replication-caching-sha2-user-credentials).
