与服务器的连接可以使用客户端和服务器之间的通信流量的压缩来减少通过连接发送的字节数。默认情况下,连接是不压缩的,但如果服务器和客户端在相互允许的压缩算法上达成一致,则可以压缩。
压缩连接源自客户端,但会影响客户端和服务器两端的 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_options()
函数为使用 MySQL C API 的客户端程序配置允许的压缩算法和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
文件中使用以下行[mysqld] protocol_compression_algorithms=zlib,zstd,uncompressed
要在运行时设置并将
protocol_compression_algorithms
系统变量的值持久化到该值,请使用以下语句SET PERSIST protocol_compression_algorithms='zlib,zstd,uncompressed';
SET PERSIST
为正在运行的 MySQL 实例设置一个值。它还会保存该值,使其在随后的服务器重启时保留。要更改正在运行的 MySQL 实例的值,但不希望它在随后的服务器重启时保留,请使用GLOBAL
关键字而不是PERSIST
。请参见第 15.7.6.1 节“SET 语法用于变量赋值”。要仅允许使用
zstd
压缩的传入连接,请在启动时这样配置服务器[mysqld] protocol_compression_algorithms=zstd
或者,要在运行时进行更改
SET PERSIST protocol_compression_algorithms='zstd';
要允许 mysql 客户端发起
zlib
或uncompressed
连接,请像这样调用它mysql --compression-algorithms=zlib,uncompressed
要配置副本使用
zlib
或zstd
连接连接到源,对于zstd
连接,压缩级别为 7,请使用CHANGE REPLICATION SOURCE TO
语句CHANGE REPLICATION SOURCE TO SOURCE_COMPRESSION_ALGORITHMS = 'zlib,zstd', SOURCE_ZSTD_COMPRESSION_LEVEL = 7;
这假设
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_options()
函数启用MYSQL_OPT_COMPRESS
选项,用于指定对服务器连接使用压缩。对于源/副本复制,启用系统变量
replica_compressed_protocol
用于指定副本连接到源使用压缩。
在每种情况下,当指定使用压缩时,如果双方都允许,连接将使用 zlib
压缩算法,否则将回退到未压缩连接。
从 MySQL 8.0.18 开始,上面描述的压缩参数成为旧版参数,这是由于引入了额外的压缩参数来更有效地控制连接压缩,这些参数在 配置连接压缩 中描述。MySQL Shell 除外,其中 --compress
命令行选项仍然是当前的,可以用来请求压缩,而无需选择压缩算法。有关 MySQL Shell 连接压缩控制的信息,请参阅 使用压缩连接。
旧版压缩参数与较新的参数交互,它们的语义会发生以下变化
旧版
--compress
选项的含义取决于是否指定了--compression-algorithms
当没有指定
--compression-algorithms
时,--compress
等效于指定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_options()
C API 函数,旧版MYSQL_OPT_COMPRESS
选项与MYSQL_OPT_COMPRESSION_ALGORITHMS
选项之间会发生相同类型的交互。如果
replica_compressed_protocol
系统变量已启用,它将优先于SOURCE_COMPRESSION_ALGORITHMS
,并且连接到源将使用zlib
压缩(如果源和副本都允许该算法)。如果replica_compressed_protocol
已禁用,则SOURCE_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
文件存在,它也包含这些值的线。