到服务器的连接可以在客户端和服务器之间的流量上使用压缩,以减少通过连接发送的字节数。默认情况下,连接是未压缩的,但如果服务器和客户端同意使用共同允许的压缩算法,则可以压缩。
压缩连接来自客户端,但影响客户端和服务器两侧的 CPU 负载,因为两侧都执行压缩和解压缩操作。由于启用压缩会降低性能,因此其益处主要发生在网络带宽较低、网络传输时间占主导地位、压缩和解压缩操作成本高、结果集很大的情况下。
本节描述了可用的压缩控制配置参数和监控压缩使用的信息来源。它适用于经典的 MySQL 协议连接。
压缩控制适用于来自客户端程序的服务器连接和参与源/副本复制或组复制的服务器连接。压缩控制不适用于 FEDERATED
表的连接。在以下讨论中,“客户端连接” 是指来自任何支持压缩的来源的服务器连接,除非上下文指明特定的连接类型。
X 协议连接到 MySQL 服务器实例支持压缩,但 X 协议连接的压缩独立于这里描述的经典 MySQL 协议连接的压缩,并单独控制。请参阅 第 22.5.5 节,“使用 X 插件的连接压缩” 以获取 X 协议连接压缩的信息。
这些配置参数可用于控制连接压缩:
-
系统变量
protocol_compression_algorithms
配置服务器允许的压缩算法 для incoming 连接。 -
命令行选项
--compression-algorithms
和--zstd-compression-level
配置客户端程序的压缩算法和zstd
压缩级别,这些客户端程序包括: mysql, mysqladmin, mysqlbinlog, mysqlcheck, mysqldump, mysqlimport, mysqlpump, mysqlshow, mysqlslap, 和 mysqltest, 以及 mysql_upgrade。MySQL Shell 也提供了这些命令行选项。 -
函数
mysql_options()
的选项MYSQL_OPT_COMPRESSION_ALGORITHMS
和MYSQL_OPT_ZSTD_COMPRESSION_LEVEL
配置客户端程序使用 MySQL C API 的压缩算法和zstd
压缩级别。 -
语句
CHANGE REPLICATION SOURCE TO
的选项SOURCE_COMPRESSION_ALGORITHMS
和SOURCE_ZSTD_COMPRESSION_LEVEL
配置参与源/副本复制的副本服务器的压缩算法和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 语法 for 变量赋值”。 -
要仅允许使用
zstd
压缩的入站连接,配置服务器启动时如下:[mysqld] protocol_compression_algorithms=zstd
或,在运行时进行更改:
SET PERSIST protocol_compression_algorithms='zstd';
-
要允许 mysql 客户端启动
zlib
或uncompressed
连接,请像这样调用它:mysql --compression-algorithms=zlib,uncompressed
-
要使用
zlib
或zstd
连接配置副本连接到源,使用压缩级别 7 的zstd
连接,使用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 负载可能会降低服务器性能。
在 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 的连接压缩控制,请参阅 使用压缩连接。
遗留压缩参数与新的参数交互,语义如下所示:
-
遗留的
--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 客户端 \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
文件存在,也包含这些值的行。
-