与服务器的连接可以对客户端和服务器之间的流量使用压缩,以减少通过连接发送的字节数。默认情况下,连接未压缩,但如果服务器和客户端同意相互允许的压缩算法,则可以压缩。
压缩连接源自客户端,但会影响客户端和服务器端的 CPU 负载,因为两端都会执行压缩和解压缩操作。由于启用压缩会降低性能,因此其优势主要体现在网络带宽较低、网络传输时间占压缩和解压缩操作成本的主导地位且结果集较大的情况下。
本节介绍可用的压缩控制配置参数和可用于监控压缩使用情况的信息源。它适用于经典 MySQL 协议连接。
压缩控制适用于客户端程序与服务器的连接以及参与源/副本复制或组复制的服务器。压缩控制不适用于FEDERATED
表的连接。在以下讨论中,“客户端连接”是指来自任何支持压缩的源的与服务器的连接的简写,除非上下文指示特定的连接类型。
与 MySQL 服务器实例的 X 协议连接支持压缩,但 X 协议连接的压缩与此处描述的经典 MySQL 协议连接的压缩独立运行,并且单独控制。有关 X 协议连接压缩的信息,请参见 第 22.5.5 节“使用 X 插件进行连接压缩”。
这些配置参数可用于控制连接压缩:
-
系统 protocol_compression_algorithms 变量配置服务器允许传入连接使用哪些压缩算法。
-
--compression-algorithms 和--zstd-compression-level 命令行选项为这些客户端程序配置允许的压缩算法和 压缩
zstd
级别:mysql、 mysqladmin、 mysqlbinlog、 mysqlcheck、mysqldump、 mysqlimport、 mysqlshow、mysqlslap和mysqltest。MySQL Shell 也提供这些命令行选项。 -
该函数的
MYSQL_OPT_COMPRESSION_ALGORITHMS
和MYSQL_OPT_ZSTD_COMPRESSION_LEVEL
选项为使用 MySQL C API 的客户端程序 mysql_options() 配置允许的压缩算法和 压缩级别。zstd
-
该语句的
SOURCE_COMPRESSION_ALGORITHMS
和SOURCE_ZSTD_COMPRESSION_LEVEL
选项为参与源/副本复制的副本服务器 CHANGE REPLICATION SOURCE TO配置允许的压缩算法和压缩级别。zstd
-
当新成员加入组并连接到供体时, group_replication_recovery_compression_algorithms 和 系统 group_replication_recovery_zstd_compression_level 变量配置组复制恢复连接允许的压缩算法和压缩级别。
zstd
允许指定压缩算法的配置参数是字符串值,并采用以下项中选择的一个或多个以逗号分隔的压缩算法名称的列表(任意顺序)(不区分大小写):
-
zlib
:允许使用压缩算法的连接zlib
。 -
zstd
:允许使用压缩算法的连接zstd
。 -
uncompressed
:允许未压缩的连接。
因为uncompressed
是一个可能配置或可能不配置的算法名称,所以可以将 MySQL 配置为不允许未压缩的连接。
例子:
-
要配置服务器允许传入连接使用的压缩算法,请设置 protocol_compression_algorithms 系统变量。默认情况下,服务器允许所有可用算法。要在启动时明确配置该设置,请在服务器
my.cnf
文件中使用以下行:<span style="background-color:#ffffff"><span style="color:#555555"><span style="background-color:#f8f8f8"><span style="color:#000000"><code class="language-ini"><span style="color:#669900">[mysqld]</span> <span style="color:#990055">protocol_compression_algorithms</span><span style="color:#0077aa"><span style="color:#999999">=</span>zlib,zstd,uncompressed</span></code></span></span></span></span>
要在运行时设置并保留 protocol_compression_algorithms 系统变量为该值,请使用以下语句:
<span style="background-color:#ffffff"><span style="color:#555555"><span style="background-color:#f8f8f8"><span style="color:#000000"><code class="language-sql"><span style="color:#0077aa">SET</span> <span style="color:#0077aa">PERSIST</span> protocol_compression_algorithms<span style="color:#a67f59">=</span><span style="color:#669900">'zlib,zstd,uncompressed'</span><span style="color:#999999">;</span></code></span></span></span></span>
SET PERSIST为正在运行的 MySQL 实例设置一个值。它还会保存该值,使其在后续服务器重启时继续生效。要更改正在运行的 MySQL 实例的值而不使其在后续重启时继续生效,请使用关键字
GLOBAL
而不是PERSIST
。请参见 第 15.7.6.1 节“变量赋值的 SET 语法”。 -
为了仅允许使用
zstd
压缩的传入连接,请在启动时像这样配置服务器:<span style="background-color:#ffffff"><span style="color:#555555"><span style="background-color:#f8f8f8"><span style="color:#000000"><code class="language-ini"><span style="color:#669900">[mysqld]</span> <span style="color:#990055">protocol_compression_algorithms</span><span style="color:#0077aa"><span style="color:#999999">=</span>zstd</span></code></span></span></span></span>
或者,在运行时进行更改:
<span style="background-color:#ffffff"><span style="color:#555555"><span style="background-color:#f8f8f8"><span style="color:#000000"><code class="language-sql"><span style="color:#0077aa">SET</span> <span style="color:#0077aa">PERSIST</span> protocol_compression_algorithms<span style="color:#a67f59">=</span><span style="color:#669900">'zstd'</span><span style="color:#999999">;</span></code></span></span></span></span>
-
要允许mysql客户端启动
zlib
或uncompressed
连接,请像这样调用它:<span style="background-color:#ffffff"><span style="color:#555555"><span style="background-color:#f8f8f8"><span style="color:#000000"><code class="language-terminal">mysql <span style="color:#990055">--compression-algorithms</span><span style="color:#0077aa"><span style="color:#999999">=</span>zlib,uncompressed</span></code></span></span></span></span>
-
zlib
要配置副本使用或连接 连接到源zstd
,且连接的压缩级别为 7zstd
,请使用以下 CHANGE REPLICATION SOURCE TO 语句:<span style="background-color:#ffffff"><span style="color:#555555"><span style="background-color:#f8f8f8"><span style="color:#000000"><code class="language-sql"><span style="color:#0077aa">CHANGE</span> <span style="color:#0077aa">REPLICATION</span> <span style="color:#0077aa">SOURCE</span> <span style="color:#0077aa">TO</span> <span style="color:#0077aa">SOURCE_COMPRESSION_ALGORITHMS</span> <span style="color:#a67f59">=</span> <span style="color:#669900">'zlib,zstd'</span><span style="color:#999999">,</span> <span style="color:#0077aa">SOURCE_ZSTD_COMPRESSION_LEVEL</span> <span style="color:#a67f59">=</span> <span style="color:#990055">7</span><span style="color:#999999">;</span></code></span></span></span></span>
假设 replica_compressed_protocol 系统变量已被禁用,原因在 配置旧式连接压缩中进行了描述。
为了成功建立连接,连接双方必须就相互允许的压缩算法达成一致。算法协商过程尝试使用 zlib
,然后zstd
,然后 uncompressed
。如果双方找不到共同的算法,则连接尝试失败。
由于双方必须就压缩算法达成一致,并且由于uncompressed
是一个不一定允许的算法值,因此不一定会出现回退到未压缩连接的情况。例如,如果服务器配置为 允许 ,zstd
而客户端配置为 允许 zlib,uncompressed
,则客户端根本无法连接。在这种情况下,双方没有共同的算法,因此连接尝试会失败。
允许指定 zstd
压缩级别的配置参数采用 1 到 22 之间的整数值,值越大表示压缩级别越高。默认zstd
压缩级别为 3。压缩级别设置对不使用zstd
压缩的连接没有影响。
可配置的zstd
压缩级别允许在较少网络流量和较高 CPU 负载与较多网络流量和较低 CPU 负载之间进行选择。较高的压缩级别可减少网络拥塞,但额外的 CPU 负载可能会降低服务器性能。
在 MySQL 8.0.18 之前,这些配置参数可用于控制连接压缩:
-
客户端程序支持 --compress命令行选项来指定与服务器的连接是否使用压缩。
-
对于使用 MySQL C API 的程序,启用
MYSQL_OPT_COMPRESS
该 mysql_options()函数的选项指定使用压缩来连接服务器。 -
对于源/副本复制,启用系统变量 replica_compressed_protocol 指定对与源的副本连接使用压缩。
在每种情况下,当指定使用压缩时,如果双方都允许,则连接使用zlib
压缩算法,否则回退到未压缩的连接。
从 MySQL 8.0.18 开始,刚刚描述的压缩参数成为遗留参数,因为引入了额外的压缩参数来更好地控制连接压缩,如 配置连接压缩中所述。 MySQL Shell 是一个例外,其中 --compress命令行选项保持最新,可用于请求压缩而无需选择压缩算法。 有关 MySQL Shell 连接压缩控制的信息,请参阅 使用压缩连接。
旧压缩参数与新参数交互,其语义发生如下变化:
-
The meaning of the legacy --compress option depends on whether --compression-algorithms is specified:
-
When --compression-algorithms is not specified, --compress is equivalent to specifying a client-side algorithm set of
zlib,uncompressed
. -
当 --compression-algorithms 指定 时,--compress 相当于指定 的算法集
zlib
,完整客户端算法集是 的并集加上zlib
指定的算法 --compression-algorithms。例如,当 和 都为 时 --compress, --compression-algorithms=zlib,zstd允许算法集为zlib
加上zlib,zstd
;即zlib,zstd
。当 和 都为 时 --compress, --compression-algorithms=zstd,uncompressed允许算法集为zlib
加上zstd,uncompressed
;即zlib,zstd,uncompressed
。
-
-
相同类型的交互发生在传统
MYSQL_OPT_COMPRESS
选项和 C API 函数MYSQL_OPT_COMPRESSION_ALGORITHMS
选项之间mysql_options()。 -
如果 replica_compressed_protocol 启用了系统变量,则它优先于源 ,并且 如果源和副本都允许该算法,则
SOURCE_COMPRESSION_ALGORITHMS
与源的连接将使用压缩。如果禁用,则应用 的值 。zlib
replica_compressed_protocolSOURCE_COMPRESSION_ALGORITHMS
状态Compression变量是ON
或,OFF
指示当前连接是否使用压缩。
mysql客户端 命令\status
会显示一行信息,说明Protocol: Compressed
当前连接是否启用了压缩。如果未显示该行,则表示该连接未压缩。
MySQL Shell\status
命令显示 Compression:
一行 Disabled
或Enabled
以指示连接是否被压缩。
这些额外的信息源可用于监控连接压缩:
-
要监视客户端连接使用的压缩,请使用Compression_algorithm 和Compression_level 状态变量。对于当前连接,它们的值分别表示压缩算法和压缩级别。
-
要确定服务器配置为允许传入连接使用哪些压缩算法,请检查 protocol_compression_algorithms 系统变量。
-
对于主/从属复制连接,可从多个源获得配置的压缩算法和压缩级别:
-
性能模式 replication_connection_configuration 表有
COMPRESSION_ALGORITHMS
和ZSTD_COMPRESSION_LEVEL
列。 -
系统
mysql.slave_master_info
表有Master_compression_algorithms
和Master_zstd_compression_level
列。如果master.info
文件存在,它也会包含这些值的行。
-