当加入成员在分布式恢复期间连接到在线现有成员以进行状态传输时,加入成员充当客户端,而现有成员充当服务器。当使用异步复制通道 group_replication_recovery
从捐赠人的二进制日志传输状态时,加入成员充当副本,而现有成员充当源。当远程克隆操作在此连接上进行时,加入成员充当接收者,而现有成员充当捐赠者。除非被Group Replication特定的配置设置或行为覆盖,否则适用于这些角色的配置设置也适用于Group Replication。
现有成员为分布式恢复提供的连接与Group Replication用于在线成员之间通信的连接不同。
-
Group Replication的组通信引擎(XCom,Paxos变体)用于TCP通信之间的远程XCom实例的连接由
group_replication_local_address
系统变量指定。该连接用于在线成员之间的TCP/IP消息。与本地实例的通信使用共享内存的输入通道。 -
对于分布式恢复,直到MySQL 8.0.20,组成员将其标准SQL客户端连接提供给加入成员,如MySQL Server的
hostname
和port
系统变量所指定。如果指定了替代端口号由report_port
系统变量,那么将使用该端口号。 -
从MySQL 8.0.21开始,组成员可以宣传分布式恢复端点的替代列表作为加入成员的专用客户端连接,允许您单独控制分布式恢复流量,而不是由常规客户端用户的连接。您可以使用
group_replication_advertise_recovery_endpoints
系统变量指定该列表,成员将其分布式恢复端点列表传输到组中加入时。默认情况下,成员继续提供标准SQL客户端连接,如早期版本一样。
如果加入成员无法正确标识其他成员使用MySQL Server的 hostname
系统变量定义的主机名,分布式恢复可能会失败。建议操作系统运行MySQL Server时具有正确配置的唯一主机名,使用DNS或本地设置。可以在性能架构表 replication_group_members
的 Member_host
列中验证服务器使用的主机名。如果多个组成员外部化操作系统设置的默认主机名,则加入成员可能无法解析到正确的成员地址并无法连接以进行分布式恢复。在这种情况下,可以使用MySQL Server的 report_host
系统变量配置唯一的主机名以供外部化。
加入成员建立分布式恢复连接的步骤如下:
-
当成员加入组时,它连接到其
group_replication_group_seeds
系统变量中列出的种子成员之一,最初使用group_replication_local_address
连接,如该列表所指定。种子成员可能是组的子集。 -
通过该连接,种子成员使用Group Replication的成员服务提供加入成员在线组中的所有成员的列表,以视图形式。成员信息包括每个成员为分布式恢复提供的分布式恢复端点或标准SQL客户端连接的详细信息。
-
加入成员从该列表中选择合适的组成员作为其分布式恢复的捐赠者,按照第 20.5.4.4 节,“故障容错”中描述的行为。
-
然后,加入成员尝试使用捐赠者的分布式恢复端点连接到捐赠者,按照列表中指定的顺序尝试每个端点。如果捐赠者没有提供端点,加入成员将尝试使用捐赠者的标准 SQL 客户端连接。连接的 SSL 要求由
group_replication_recovery_ssl_*
选项指定,如第 20.5.4.1.4 节,“SSL 和身份验证”中所述。 -
如果加入成员无法连接到所选捐赠者,将尝试连接到其他合适的捐赠者,按照第 20.5.4.4 节,“故障容错”中描述的行为。注意,如果加入成员耗尽了端点列表而没有建立连接,不会回退到捐赠者的标准 SQL 客户端连接,而是切换到另一个捐赠者。
-
当加入成员与捐赠者建立分布式恢复连接时,它将使用该连接进行状态传输,如第 20.5.4 节,“分布式恢复”中所述。连接使用的主机和端口将显示在加入成员的日志中。注意,如果使用远程克隆操作,当加入成员在操作结束时重新启动时,它将与新的捐赠者建立连接以进行状态传输。这可能是与原始捐赠者不同的成员,或者是与原始捐赠者不同的连接。在任何情况下,分布式恢复过程将继续按照原始捐赠者相同的方式进行。
由 group_replication_advertise_recovery_endpoints
系统变量指定的分布式恢复端点的 IP 地址不需要配置为 MySQL 服务器(即,不需要由 admin_address
系统变量或 bind_address
系统变量指定)。它们必须分配给服务器。任何使用的主机名必须解析到本地 IP 地址。IPv4 和 IPv6 地址都可以使用。
分布式恢复端点的端口必须配置为 MySQL 服务器,因此必须由 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 客户端连接,如果未提供端点)不需要添加到组复制 allowlist 中,该allowlist 由 group_replication_ip_allowlist
系统变量指定。allowlist 仅适用于每个成员的 group_replication_local_address
指定的地址。加入成员必须在组中具有初始连接,以便从 allowlist 中检索分布式恢复的地址或地址。
分布式恢复端点列表在设置系统变量时和 START GROUP_REPLICATION
语句执行时进行验证。如果列表无法正确解析,或者任何端点在主机上不可访问,因为服务器未在其上监听,组复制将记录错误并且不启动。
从 MySQL 8.0.18 开始,您可以选择配置分布式恢复的压缩,以便从捐赠者的二进制日志中传输状态。压缩可以在网络带宽有限且捐赠者需要传输许多事务给加入成员时提供帮助。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
系统变量确定的。对于分布式恢复连接,专门的Group Replication分布式恢复SSL系统变量可用于配置证书和密码的使用,专门用于分布式恢复。
默认情况下,不使用SSL进行分布式恢复连接。要激活它,请设置group_replication_recovery_use_ssl=ON
,并按照第20.6.3节“保护分布式恢复连接”中所述配置Group Replication分布式恢复SSL系统变量。你需要一个设置为使用SSL的复制用户。
当分布式恢复配置为使用SSL时,Group Replication将应用于远程克隆操作和从donor的二进制日志中的状态传输。Group Replication自动配置克隆SSL选项(clone_ssl_ca
、clone_ssl_cert
和clone_ssl_key
)以匹配你的Group Replication分布式恢复选项(group_replication_recovery_ssl_ca
、group_replication_recovery_ssl_cert
和group_replication_recovery_ssl_key
)。
如果你不使用SSL进行分布式恢复(因此group_replication_recovery_use_ssl
设置为OFF
),并且复制用户账户使用sha256_password
插件,RSA密钥对将用于密码交换。在这种情况下,可以使用
group_replication_recovery_public_key_path
系统变量指定RSA公钥文件,或者使用
group_replication_recovery_get_public_key
系统变量从源请求公钥,如
第20.6.3.1.1节“使用Caching SHA-2身份验证插件的复制用户”中所述。