Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Connection Compression with X Plugin

22.5.5 X 插件连接压缩

X 插件支持将通过 X 协议连接发送的消息进行压缩。连接可以被压缩,如果服务器和客户端都支持相同的压缩算法。启用压缩可以减少网络传输的字节数,但是对服务器和客户端增加了额外的 CPU 成本用于压缩和解压缩操作。压缩的好处主要出现在网络带宽低、网络传输时间占据压缩和解压缩操作的成本,并且结果集很大时。

Note

不同的 MySQL 客户端实现了连接压缩的支持;请查看客户端文档以获取详细信息。例如,对于 classic MySQL 协议连接,请见第6.2.8节,“连接压缩控制”

配置 X 插件连接压缩

默认情况下,X 插件支持 zstd、LZ4 和 Deflate 压缩算法。使用 Deflate 算法进行压缩使用 zlib 软件库,因此 X 协议连接的 deflate_stream 压缩算法设置等同于 classic MySQL 协议连接的 zlib 设置。

在服务器端,可以通过设置mysqlx_compression_algorithms系统变量来禁止某些压缩算法。算法名称 zstd_streamlz4_messagedeflate_stream 可以任意组合,顺序和大小写无关。如果系统变量值为空字符串,则不允许压缩连接。

以下表格比较了不同压缩算法的特性,并显示了它们的优先级。默认情况下,服务器选择了服务器和客户端都支持的最高优先级算法;客户端可以根据以下方式更改优先级。短名称别名可以在客户端中使用时指定算法。

表 22.1 X 协议压缩算法特性

Algorithm Alias Compression Ratio Throughput CPU Cost Default Priority
zsth_stream zstd 首选
lz4_message lz4 最低 第二
deflate_stream deflate 最高 第三

X 协议的允许压缩算法集(无论是用户指定的还是默认的)独立于 MySQL 服务器为经典 MySQL 协议连接所允许的压缩算法集,该集由protocol_compression_algorithms 服务器系统变量指定。如果您不指定mysqlx_compression_algorithms 系统变量,X 插件将不会 fallback 到使用经典 MySQL 协议连接的压缩设置,而是默认允许所有在表 22.1,“X Protocol Compression Algorithm Characteristics”中显示的算法。这与 TLS 上下文的情况不同,在该情况下,MySQL 服务器设置将被使用,如果 X 插件系统变量没有被设置,详见第22.5.3节,“使用 X 插件加密连接”。关于经典 MySQL 协议连接的压缩信息,请见第6.2.8节,“连接压缩控制”

在客户端,X 协议连接请求可以指定多个参数来控制压缩:

  • 压缩模式。

  • 压缩级别。

  • 压缩算法列表按优先顺序排列。

Note

一些客户端或Connector可能不支持某个压缩控制特性。例如,指定 X 协议连接的压缩级别仅由 MySQL Shell 支持,而不是其他 MySQL 客户端或Connector。请查看特定产品的文档,以了解支持的特性和如何使用它们。

连接模式具有以下允许值:

  • disabled: 连接未压缩。

  • preferred: 服务器和客户端协商以找到双方都允许的压缩算法。如果没有共同算法可用,连接将未压缩。这是默认模式,如果不指定明确。

  • required: 压缩算法协商与preferred模式相同,但如果没有共同算法可用,连接请求将以错误终止。

除了在每个连接上同意压缩算法外,服务器和客户端还可以同意压缩级别从该算法的数字范围中选择。随着压缩级别的增加,数据压缩比率增加,网络带宽和传输时间减少。但是,压缩努力的增加不一定与压缩比率的增加成线性关系。

客户端可以在与服务器的能力协商中请求特定的压缩级别以用于 X 协议连接。

X Plugin 在 MySQL 8.4 中使用的默认压缩级别通过性能测试选择,以取得压缩时间和网络传输时间的良好平衡。这些默认值不一定是每个算法库的默认值。如果客户端没有请求算法的压缩级别,这些默认值将被应用。默认压缩级别初始设置为 3 对于 zstd,2 对于 LZ4,3 对于 Deflate。您可以使用 mysqlx_zstd_default_compression_levelmysqlx_lz4_default_compression_levelmysqlx_deflate_default_compression_level 系统变量进行调整。

为了防止服务器资源过度消耗,X Plugin 设置了每个算法的最大压缩级别。如果客户端请求的压缩级别超过了这个设置,服务器将使用其最大允许的压缩级别(客户端请求的压缩级别仅由 MySQL Shell 支持)。最大压缩级别初始设置为 11 对于 zstd,8 对于 LZ4,5 对于 Deflate。您可以使用 mysqlx_zstd_max_client_compression_levelmysqlx_lz4_max_client_compression_levelmysqlx_deflate_max_client_compression_level 系统变量进行调整。

如果服务器和客户端允许多个算法共享,选择算法的优先顺序在 Table 22.1,“X Protocol Compression Algorithm Characteristics” 中显示。对于支持指定压缩算法的客户端,连接请求可以包括客户端允许的算法列表,使用算法名称或别名指定。服务器将根据客户端列表中的算法顺序来确定优先顺序。使用的算法是客户端列表中第一个也是服务器允许的算法。但是,压缩算法选项受压缩模式的限制:

  • 如果压缩模式是 disabled,压缩算法选项将被忽略。

  • 如果压缩模式是 preferred 但客户端允许的算法中没有服务器允许的算法,连接将被解压。

  • 如果压缩模式是 required 但客户端允许的算法中没有服务器允许的算法,错误将发生。

为了监控消息压缩的效果,请使用 X 插件状态变量,描述在X 插件连接压缩监控中。您可以使用这些状态变量来计算当前设置下消息压缩的益处,并使用该信息来调整设置。

X 插件压缩连接特征

X 协议连接压缩操作如下:

  • 在算法名称中,_stream_message 后缀表示两个不同的操作模式:在流模式下,连接中的所有 X 协议消息将被压缩到一个连续的流中,并且必须以相同的顺序解压缩—遵循压缩顺序而不跳过任何消息。在消息模式下,每个消息将独立压缩,并且不需要按压缩顺序解压缩。同时,消息模式不需要所有压缩消息解压缩。

  • 压缩不应用于在身份验证成功前发送的任何消息。

  • 压缩不应用于控制流消息,如 Mysqlx.OkMysqlx.ErrorMysqlx.Sql.StmtExecuteOk 消息。

  • 所有其他 X 协议消息都可以压缩,如果服务器和客户端在能力negotiation阶段同意使用同一个压缩算法。如果客户端在该阶段不请求压缩,服务器和客户端都不应用压缩。

  • 当通过 X 协议连接发送的消息被压缩时,仍然需要遵守mysqlx_max_allowed_packet 系统变量指定的限制。网络包必须在解压缩后小于这个限制。如果超出限制,X 插件将返回解压缩错误并关闭连接。

  • 以下点适用于客户端请求压缩级别的支持,只支持 MySQL Shell:

    • 压缩级别必须由客户端指定为整数。如果提供的值不是整数,连接将以错误关闭。

    • 如果客户端指定了算法但不指定压缩级别,服务器将使用算法的默认压缩级别。

    • 如果客户端请求的算法压缩级别超过服务器的最大允许级别,服务器将使用最大允许级别。

    • 如果客户端请求的算法压缩级别小于服务器的最小允许级别,服务器将使用最小允许级别。

X 插件连接压缩监控

您可以使用 X 插件状态变量监控消息压缩的效果。当消息压缩在使用时,会话Mysqlx_compression_algorithm 状态变量显示当前 X 协议连接使用的压缩算法,并Mysqlx_compression_level 显示选择的压缩级别。

X插件状态变量可以用来计算压缩算法的效率(数据压缩比)和消息压缩的总体效果。使用会话值来计算特定会话中消息压缩的益处,使用全局值来检查服务器上所有会话中消息压缩的总体益处,包括所有使用X协议连接的会话和未使用消息压缩的会话。然后,您可以通过调整允许的压缩算法、最大压缩级别和默认压缩级别来调整消息压缩,详见X插件连接压缩配置

当消息压缩在使用时,Mysqlx_bytes_sent状态变量显示了从服务器发送的总字节数,包括压缩后的消息负载、未压缩的项目(如X协议头)和未压缩的消息。Mysqlx_bytes_sent_compressed_payload状态变量显示了压缩后的消息负载的总字节数,Mysqlx_bytes_sent_uncompressed_frame状态变量显示了同样消息负载的总字节数,但是在压缩前测量的。因此,可以使用以下表达式计算压缩算法的效率:

mysqlx_bytes_sent_uncompressed_frame / mysqlx_bytes_sent_compressed_payload

X协议消息由服务器发送的压缩效率可以使用以下表达式计算:

(mysqlx_bytes_sent - mysqlx_bytes_sent_compressed_payload + mysqlx_bytes_sent_uncompressed_frame) / mysqlx_bytes_sent

从客户端接收的消息,可以使用Mysqlx_bytes_received_compressed_payload状态变量显示压缩后的消息负载的总字节数,Mysqlx_bytes_received_uncompressed_frame状态变量显示同样消息负载的总字节数,但是在解压缩前测量的。Mysqlx_bytes_received状态变量包括压缩后的消息负载在解压缩前测量的、未压缩的项目在压缩消息中的和未压缩的消息。