当一个加入的成员在分布式恢复期间连接到一个在线的现有成员进行状态转移时,加入的成员在连接上充当客户端,而现有的成员充当服务器。当从捐赠者二进制日志进行状态转移时,使用异步复制通道 group_replication_recovery
在此连接上进行,加入的成员充当副本,现有的成员充当源。当远程克隆操作在此连接上进行时,加入的成员充当接收者,现有的成员充当捐赠者。除非被组复制特定的配置设置或行为覆盖,否则在组复制上下文之外适用于这些角色的配置设置也适用于组复制。
现有成员提供给加入成员用于分布式恢复的连接与组复制用于组中在线成员之间通信的连接不同。
组通信引擎用于组复制(XCom,Paxos 变体)的连接,用于远程 XCom 实例之间的 TCP 通信由
group_replication_local_address
系统变量指定。此连接用于在线成员之间的 TCP/IP 消息。与本地实例的通信通过使用共享内存的输入通道进行。对于分布式恢复,默认情况下,组成员提供其标准 SQL 客户端连接给加入的成员,如 MySQL Server 的
hostname
和port
系统变量指定的那样。如果report_port
系统变量指定了备用端口号,则使用该端口号。组成员可以宣传备用分布式恢复端点的列表作为加入成员的专用客户端连接,允许您分别控制分布式恢复流量,而不是由成员的常规客户端用户进行连接。您使用
group_replication_advertise_recovery_endpoints
系统变量指定此列表,当成员加入组时,成员将他们的分布式恢复端点列表传输到组。默认情况下,成员继续提供标准 SQL 客户端连接,如早期版本中那样。
如果加入的成员无法使用 MySQL Server 的 hostname
系统变量中定义的主机名正确识别其他成员,则分布式恢复可能会失败。建议在运行 MySQL 的操作系统上正确配置唯一的 hostname,无论是使用 DNS 还是本地设置。服务器用于 SQL 客户端连接的主机名可以在 Performance Schema 表 replication_group_members
的 Member_host
列中验证。如果多个组成员外部化了操作系统设置的默认主机名,则加入的成员可能无法将其解析为正确成员地址,并且可能无法连接以进行分布式恢复。在这种情况下,您可以使用 MySQL Server 的 report_host
系统变量来配置每个服务器要外部化的唯一主机名。
加入的成员建立分布式恢复连接的步骤如下
当成员加入组时,它会使用其
group_replication_group_seeds
系统变量中列表中包含的种子成员之一进行连接,最初使用该列表中指定的group_replication_local_address
连接。种子成员可能是组的子集。通过此连接,种子成员使用组复制的成员资格服务以视图的形式向加入的成员提供在线组中所有成员的列表。成员资格信息包括每个成员为分布式恢复提供的分布式恢复端点或标准 SQL 客户端连接的详细信息。
加入的成员根据 第 20.5.4.4 节,“分布式恢复的容错” 中描述的行为,从此列表中选择合适的组成员作为其分布式恢复的捐赠者。
然后,加入的成员尝试使用捐赠者公布的分布式恢复端点连接到捐赠者,并尝试按列表中指定的顺序依次尝试每个端点。如果捐赠者未提供任何端点,则加入的成员尝试使用捐赠者的标准 SQL 客户端连接进行连接。连接的 SSL 要求如 第 20.5.4.1.4 节,“SSL 和分布式恢复的身份验证” 中描述的
group_replication_recovery_ssl_*
选项指定的那样。如果加入的成员无法连接到选定的捐赠者,它会根据 第 20.5.4.4 节,“分布式恢复的容错” 中描述的行为,尝试其他合适的捐赠者。请注意,如果加入的成员在未建立连接的情况下用尽了公布的端点列表,它不会回退到捐赠者的标准 SQL 客户端连接,而是切换到另一个捐赠者。
当加入成员与捐赠者建立分布式恢复连接时,它将使用该连接进行状态传输,如第 20.5.4 节,“分布式恢复”中所述。该连接所使用的主机和端口在加入成员的日志中显示。请注意,如果使用远程克隆操作,当加入成员在操作结束时重新启动时,它将与新的捐赠者建立连接以从二进制日志进行状态传输。这可能是与用于远程克隆操作的原始捐赠者不同的成员的连接,也可能是与原始捐赠者不同的连接。无论哪种情况,分布式恢复过程都将以与使用原始捐赠者时相同的方式继续。
由group_replication_advertise_recovery_endpoints
系统变量提供的作为分布式恢复端点的 IP 地址不必为 MySQL Server 配置(即,它们不必由 admin_address
系统变量或 bind_address
系统变量的列表指定)。它们必须分配给服务器。任何使用的主机名都必须解析为本地 IP 地址。可以使用 IPv4 和 IPv6 地址。
为分布式恢复端点提供的端口必须为 MySQL Server 配置,因此它们必须由 port
、report_port
或 admin_port
系统变量指定。服务器必须监听这些端口上的 TCP/IP 连接。如果您指定 admin_port
,则分布式恢复的复制用户需要 SERVICE_CONNECTION_ADMIN
权限才能连接。选择 admin_port
可以将分布式恢复连接与常规 MySQL 客户端连接分开。
加入成员会依次尝试列表中指定的每个端点。如果 group_replication_advertise_recovery_endpoints
设置为 DEFAULT
而不是端点列表,则将提供标准 SQL 客户端连接。请注意,标准 SQL 客户端连接不会自动包含在分布式恢复端点列表中,如果捐赠者的端点列表用尽而未建立连接,则不会作为备用提供。如果您希望将标准 SQL 客户端连接作为多个分布式恢复端点之一提供,则必须在 group_replication_advertise_recovery_endpoints
指定的列表中显式包含它。您可以将其放在最后,使其作为最后的手段进行连接。
群成员的分布式恢复端点(如果没有提供端点,则为标准 SQL 客户端连接)不需要添加到 group_replication_ip_allowlist
系统变量指定的组复制允许列表中。允许列表仅用于 group_replication_local_address
为每个成员指定的地址。加入成员必须通过允许列表允许其与组的初始连接,以便检索分布式恢复的地址。
当设置系统变量以及发出 START GROUP_REPLICATION
语句时,将验证您列出的分布式恢复端点。如果列表无法正确解析,或者由于服务器未在主机上监听而无法访问任何端点,则组复制会记录错误,并且不会启动。
您可以选择通过从捐赠者的二进制日志中进行状态传输的方式,为分布式恢复配置压缩。在网络带宽有限且捐赠者必须将许多事务传输到加入成员的情况下,压缩可能对分布式恢复有利。group_replication_recovery_compression_algorithms
和 group_replication_recovery_zstd_compression_level
系统变量配置允许的压缩算法,以及在从捐赠者的二进制日志进行状态传输时使用的 zstd
压缩级别。有关更多信息,请参阅 第 6.2.8 节,“连接压缩控制”。
请注意,这些压缩设置不适用于远程克隆操作。当使用远程克隆操作进行分布式恢复时,克隆插件的 clone_enable_compression
设置适用。
分布式恢复需要具有正确权限的复制用户,以便组复制可以建立直接的成员到成员的复制通道。复制用户还必须具有正确的权限才能充当捐赠者的克隆用户以执行远程克隆操作。每个群成员必须使用相同的复制用户进行分布式恢复。有关设置此复制用户的说明,请参阅 第 20.2.1.3 节,“分布式恢复的用户凭据”。有关保护复制用户凭据的说明,请参阅 第 20.6.3.1 节,“分布式恢复的安全用户凭据”。
分布式恢复的 SSL 配置与正常组通信的 SSL 分开,正常组通信由服务器的 SSL 设置和 group_replication_ssl_mode
系统变量决定。对于分布式恢复连接,专门的组复制分布式恢复 SSL 系统变量可用于配置证书和密码的特定使用,这些证书和密码专门用于分布式恢复。
默认情况下,不会为分布式恢复连接使用 SSL。若要激活它,请设置 group_replication_recovery_use_ssl=ON
,并配置组复制分布式恢复 SSL 系统变量,如 第 20.6.3 节,“保护分布式恢复连接” 中所述。您需要设置一个用于使用 SSL 的复制用户。
当分布式恢复配置为使用 SSL 时,组复制将对远程克隆操作以及从捐赠者的二进制日志进行状态传输应用此设置。组复制会自动配置克隆 SSL 选项的设置(clone_ssl_ca
、clone_ssl_cert
和 clone_ssl_key
),以匹配您为相应的组复制分布式恢复选项设置的设置(group_replication_recovery_ssl_ca
、group_replication_recovery_ssl_cert
和 group_replication_recovery_ssl_key
)。
如果您没有为分布式恢复使用 SSL(因此 group_replication_recovery_use_ssl
设置为 OFF
),并且组复制的复制用户帐户使用 caching_sha2_password
插件(默认)或 sha256_password
插件(已弃用)进行身份验证,则 RSA 密钥对用于密码交换。在这种情况下,请使用 group_replication_recovery_public_key_path
系统变量指定 RSA 公钥文件,或者使用 group_replication_recovery_get_public_key
系统变量从源请求公钥,如 第 20.6.3.1.1 节,“使用缓存 SHA-2 身份验证插件的复制用户” 中所述。