Documentation Home

18.7.4 消息压缩

对于在线组成员之间发送的消息,Group Replication 默认启用消息压缩。是否压缩特定消息取决于您使用 group_replication_compression_threshold 系统变量配置的阈值。有效负载大于指定字节数的消息将被压缩。

默认压缩阈值为 1000000 字节。您可以使用以下语句将压缩阈值增加到 2MB,例如:

STOP GROUP_REPLICATION;
SET GLOBAL group_replication_compression_threshold = 2097152;
START GROUP_REPLICATION;

如果设置 group_replication_compression_threshold 为零,则禁用消息压缩。

Group Replication 使用 LZ4 压缩算法来压缩组中发送的消息。请注意,LZ4 压缩算法支持的最大输入大小为 2113929216 字节。此限制低于 group_replication_compression_threshold 系统变量的最大可能值,该值与 XCom 接受的最大消息大小相匹配。因此,LZ4 最大输入大小是消息压缩的实际限制,启用消息压缩时无法提交超过此大小的事务。使用 LZ4 压缩算法时,不要为 . 设置大于 2113929216 字节的值 group_replication_compression_threshold

group_replication_compression_threshold Group Replication 不要求 的值 在所有组成员上都相同。但是,建议为所有组成员设置相同的值,以避免不必要的事务回滚、消息传递失败或消息恢复失败。

从 MySQL 8.0.18 开始,您还可以通过来自捐赠者二进制日志的状态传输方法为分布式恢复发送的消息配置压缩。group_replication_recovery_compression_algorithms 这些消息的压缩是从已经在组中的捐赠者发送到加入成员的,使用和 group_replication_recovery_zstd_compression_level 系统变量单独控制 。有关更多信息,请参阅 第 4.2.8 节,“连接压缩控制”

由系统变量激活的二进制日志事务压缩(自 MySQL 8.0.20 起可用) binlog_transaction_compression 也可用于节省带宽。当交易有效负载在组成员之间传输时,它们会保持压缩状态。如果您将二进制日志事务压缩与 Group Replication 的消息压缩结合使用,则消息压缩对数据起作用的机会较少,但仍可以压缩标头以及那些未压缩的事件和事务有效负载。有关二进制日志事务压缩的更多信息,请参阅 第 5.4.4.5 节,“二进制日志事务压缩”

在组中发送的消息的压缩发生在组通信引擎级别,在数据移交给组通信线程之前,因此它发生在mysql用户会话线程的上下文中。如果消息负载大小超过 设置的阈值 group_replication_compression_threshold,事务负载在发送到组之前被压缩,并在接收时解压缩。收到消息后,成员检查消息信封以验证它是否被压缩。如果需要,则成员解压缩事务,然后再将其传递给上层。这个过程如下图所示。

图 18.13 压缩支持

MySQL Group Replication 插件体系结构如先前主题中所述所示,插件的五层位于 MySQL 服务器和复制组之间。 压缩和解压缩由 Group Communication System API 处理,它是 Group Replication 插件的第四层。 群组通信引擎(插件的第五层)和群组成员使用数据量较小的压缩交易。 MySQL Server 核心和 Group Replication 插件的三个更高层(API、捕获、应用程序和恢复组件以及复制协议模块)使用数据量较大的原始事务。

当网络带宽成为瓶颈时,消息压缩可以在组通信级别提供高达 30-40% 的吞吐量提升。这在负载大量服务器的情况下尤为重要。组中N个参与者之间互连的 TCP 点对点性质 使得发送方发送相同数量的数据N次。此外,二进制日志很可能表现出高压缩率。这使得压缩成为包含大型事务的组复制工作负载的一项引人注目的功能。