6.2.8 连接压缩控制
客户端和服务器之间的流量可以使用压缩来减少传输的字节数量。默认情况下,连接是未压缩的,但如果服务器和客户端都允许某种压缩算法,可以压缩连接。
压缩连接始于客户端,但是对客户端和服务器都产生CPU负载,因为双方都执行压缩和解压操作。启用压缩降低性能,主要在网络带宽很小、网络传输时间占据压缩和解压操作成本的比例很高且结果集很大的情况下才有利。
本节描述了可用的压缩控制配置参数和监控压缩使用的信息来源。它适用于经典 MySQL 协议连接。
压缩控制对客户端程序和参与源/副本复制或 Group Replication 的服务器进行连接。压缩控制不适用于 FEDERATED
表的连接。在以下讨论中,“客户端连接” 是指支持压缩的任何来源连接,除非上下文表明特定连接类型。
MySQL 服务器实例支持 X 协议连接的压缩,但是 X 协议连接的压缩独立于 classic MySQL 协议连接的压缩,且由单独控制。有关 X 协议连接压缩的信息,请参阅第22.5.5节,“X 插件连接压缩”。
可以用以下配置参数来控制连接压缩:
-
protocol_compression_algorithms
系统变量配置服务器允许的 incoming 连接算法。 -
这些命令行选项:
--compression-algorithms
和--zstd-compression-level
配置了这些客户端程序的允许压缩算法和zstd
压缩级别:mysql、mysqladmin、mysqlbinlog、mysqlcheck、mysqldump、mysqlimport、mysqlshow、mysqlslap 和 mysqltest。MySQL Shell 也提供了这些命令行选项。 -
MySQL C API 函数
mysql_options()
的MYSQL_OPT_COMPRESSION_ALGORITHMS
和MYSQL_OPT_ZSTD_COMPRESSION_LEVEL
选项配置客户端程序使用的压缩算法和zstd压缩级别。 -
CHANGE REPLICATION SOURCE TO
语句的SOURCE_COMPRESSION_ALGORITHMS
和SOURCE_ZSTD_COMPRESSION_LEVEL
选项配置参与源/副本复制的副本服务器允许使用的压缩算法和zstd压缩级别。 -
group_replication_recovery_compression_algorithms
和group_replication_recovery_zstd_compression_level
系统变量配置Group Replication恢复连接时的允许压缩算法和zstd压缩级别,新成员加入组并连接到捐赠服务器时。
可以指定压缩算法的配置参数是字符串值,接受一个或多个逗号分隔的压缩算法名称列表,顺序不限,来自以下项目(不区分大小写):
-
zlib
: 允许使用zlib
压缩算法。 -
zstd
: 允许使用zstd
压缩算法的连接。 -
uncompressed
: 允许未压缩的连接。
因为uncompressed
是可能配置的算法名称,因此可能不允许未压缩的连接。
示例:
-
要配置服务器允许哪些压缩算法的 incoming 连接,设置
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节,“变量赋值语法”。 -
要允许只使用
zstd
压缩的 incoming 连接,配置服务器启动时这样:[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
并不是一定被允许的算法值,因此不一定会 fallback 到未压缩连接。例如,如果服务器配置了zstd
,客户端配置了zlib,uncompressed
,那么客户端就不能连接。在这种情况下,没有共同的算法,所以连接尝试失败。
可以指定zstd
压缩级别的配置参数需要整数值,从1到22,较大的值表示更高的压缩级别。默认的zstd
压缩级别是3。压缩级别设置对不使用zstd
压缩的连接无效。
可配置的zstd
压缩级别使得可以选择更少网络流量和更高CPU负载 versus 更多网络流量和更低CPU负载。较高的压缩级别减少网络拥堵,但额外的CPU负载可能会降低服务器性能。
在MySQL 8.0.18之前,这些配置参数用于控制连接压缩:
-
客户端程序支持
--compress
命令行选项,指定与服务器的连接使用压缩。 -
对于使用 MySQL C API 的程序,启用
MYSQL_OPT_COMPRESS
选项在mysql_options()
函数中指定连接到服务器时使用压缩。 -
对于源/副本复制,启用系统变量
replica_compressed_protocol
指定副本连接到源时使用压缩。
在每种情况下,指定使用压缩时,连接将使用 zlib
压缩算法,如果双方都允许它,否则 fallback 到未压缩的连接。
从 MySQL 8.0.18 起,这些描述的压缩参数变为遗留参数,因为引入了更多控制连接压缩的参数,详见配置连接压缩。一个例外是 MySQL Shell,where the --compress
命令行选项仍然有效,可以用于请求压缩而不选择压缩算法。关于 MySQL Shell 的连接压缩控制,见使用压缩连接。
遗留压缩参数与新参数相互作用,语义如下:
-
legacy 选项
--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_OPT_COMPRESS 选项和MYSQL_OPT_COMPRESSION_ALGORITHMS 选项之间,用于
mysql_options()
C API 函数。 -
如果启用了
replica_compressed_protocol
系统变量,它将优先于SOURCE_COMPRESSION_ALGORITHMS
,如果源服务器和副本都允许该算法,那么连接到源服务器的客户端使用zlib
压缩。如果replica_compressed_protocol
被禁用,那么SOURCE_COMPRESSION_ALGORITHMS
的值将应用。
状态变量Compression
是ON
或OFF
,以指示当前连接是否使用压缩。
MySQL 命令行客户端mysql的\status
命令显示当前连接是否启用压缩,如果没有该行,表示连接未压缩。
MySQL Shell 的\status
命令显示一个Compression:
行,表示连接是否启用压缩。
监控连接压缩的这些额外信息可用:
-
监控客户端连接中的压缩使用,可以使用
Compression_algorithm
和Compression_level
状态变量。对于当前连接,两个值分别表示压缩算法和压缩级别。 -
要确定服务器配置的 incoming 连接允许的压缩算法,可以检查
protocol_compression_algorithms
系统变量。 -
对于源/副本复制连接,配置的压缩算法和压缩级别来自多个来源:
-
性能chema中的
replication_connection_configuration
表中有COMPRESSION_ALGORITHMS
和ZSTD_COMPRESSION_LEVEL
列。 -
系统表
mysql.slave_master_info
中有Master_compression_algorithms
和Master_zstd_compression_level
列。如果文件master.info存在,它还包含这两个值的行。
-