到服务器的连接可以对客户端和服务器之间的流量进行压缩,以减少通过连接发送的字节数。默认情况下,连接是未压缩的,但如果服务器和客户端都同意相互允许的压缩算法,则可以进行压缩。
压缩连接起源于客户端,但会影响客户端和服务器端的CPU负载,因为这两个端都执行压缩和解压缩操作。由于启用压缩会降低性能,因此其好处主要体现在网络带宽较低、网络传输时间低于压缩和解压缩操作成本以及结果集较大的情况下。
本节介绍了可用的压缩控制配置参数和可用于监控压缩使用的信息源。它适用于 经典 MySQL 协议 连接。
压缩控制适用于客户端程序和参与源/副本复制或组复制的服务器,与服务器的连接。压缩控制不适用于 FEDERATED 表的连接。在下面的讨论中,“客户端连接”是从支持压缩的任何源到服务器的连接的简写,除非上下文指示特定的连接类型。
注意
到 MySQL Server 实例的 X 协议 连接支持 MySQL 8.0.19 的压缩,但 X 协议 连接的压缩独立于此处描述的 经典 MySQL 协议 连接压缩,并且是单独控制的。有关 X 协议 连接压缩的信息,请参阅 第 20.5.5 节 “使用 X 插件的连接压缩” 。
配置连接压缩
从 MySQL 8.0.18 开始,这些配置参数可用于控制连接压缩:
protocol_compression_algorithms
系统变量配置服务器允许传入连接使用哪些压缩算法。--compression-algorithms
和--zstd-compression-level
命令行选项为以下客户端程序配置允许的压缩算法和 zstd 压缩级别:mysql 、mysqladmin 、mysqlbinlog 、mysqlcheck 、mysqldump 、mysqlimport 、mysqlpump 、mysqlshow 、mysqlslap 、mysqltest 和 mysql_upgrade 。MySQL Shell 在其 8.0.20 版本中也提供了这些命令行选项。mysql_options()
函数的MYSQL_OPT_COMPRESSION_ALGORITHMS
和MYSQL_OPT_ZSTD_COMPRESSION_LEVEL
选项为使用 MYSQL C API 的客户端程序配置允许的压缩算法和 zstd 压缩级别。CHANGE MASTER TO
语句的MASTER_COMPRESSION_ALGORITHMS
和MASTER_ZSTD_COMPRESSION_LEVEL
选项为参与源/副本复制的副本服务器配置允许的压缩算法和 zstd 压缩级别。在 MySQL 8.0.23 中,使用语句CHANGE REPLICATION SOURCE TO
和选项SOURCE_COMPRESSION_ALGORITHMS
和SOURCE_ZSTD_COMPRESSION_LEVEL
。group_replication_recovery_compression_algorithms
和group_replication_recovery_zstd_compression_level
系统变量在新成员加入组并连接到供体时为组复制恢复连接配置允许的压缩算法和 zstd 压缩级别。
启用指定压缩算法的配置参数为字符串值,并按任意顺序从以下项目中选择一个或多个逗号分隔的压缩算法名称列表(不区分大小写):
- zlib :允许使用 zlib 压缩算法的连接。
- zstd :允许使用 zstd 压缩算法(zstd 1.3)的连接。
- 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
。参见 第 13.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
语句(自 MySQL 8.0.23 起)或CHANGE MASTER TO
语句(在 MySQL 8.0.23 之前):CHANGE REPLICATION SOURCE TO SOURCE_COMPRESSION_ALGORITHMS = 'zlib,zstd', SOURCE_ZSTD_COMPRESSION_LEVEL = 7;
这假设
replica_compressed_protocol
或slave_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
(自 MySQL 8.0.26 起)或slave_compressed_protocol
( MySQL 8.0.26 之前)指定为到源的副本连接使用压缩。
在每种情况下,当指定使用压缩时, 连接使用 zlib 压缩 算法(如果双方都允许),否则回退到未压缩的连接。
从 MySQL 8.0.18 开始,刚才描述的压缩参数,由于引入额外的压缩参数以更好地控制连接(如上文 配置连接压缩 所述),成为旧参数 。MySQL Shell 是一个例外,其中--compress
命令行选项保持当前状态,可以用于请求压缩而无需选择压缩算法。有关 MySQL Shell 的连接压缩控制的信息,请参阅 使用压缩连接。
旧版压缩参数与较新的参数及其语义更改如下:
-
旧版
--compress
选项的含义取决于是否指定--compression-algorithms
:- 当未指定
--compression-algorithms
时,–压缩是等效的 以指定客户端算法集 。zlib,uncompressed - 指定 --压缩算法时,
--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
或slave_compressed_protocol
系统变量,则它优先于MASTER_COMPRESSION_ALGORITHMS
,并且如果源和副本都允许 zlib 算法,则到源的连接将使用 zlib 压缩。如果replica_compressed_protocol
或slave_compressed_protocol
被禁用,则应用MASTER_COMPRESSION_ALGORITHMS
的值。
注意
MySQL 8.0.18 之后,旧版压缩控制参数已弃用;预计它会从 MySQL 的未来版本中移除。
监视连接压缩
Compression
状态变量是ON
或OFF
表示当前连接是否使用压缩。
如果为当前连接启用了压缩,mysql 客户端\status
命令显示一行Protocol: Compressed
。如果不显示该行,则连接为未压缩。
从 8.0.14 开始,MySQL Shell \status
命令显示一行Compression:
,显示Disabled
或Enabled
,表示连接是否被压缩。
从 MySQL 8.0.18 开始,以下附加信息源可用于监控连接压缩:
- 要监视客户端连接使用的压缩,请使用
Compression_algorithm
和Compression_algorithm
状态变量。对于当前连接,它们的值分别表示压缩算法和压缩级别。 - 要确定服务器配置为允许传入连接配置的是哪个压缩算法,请检查
protocol_compression_algorithms
系统变量。 - 对于源/副本复制连接,配置的压缩算法和压缩级别可从多个源获得:
- 性能模式的
protocol_compression_algorithms
表具有COMPRESSION_ALGORITHMS
和ZSTD_COMPRESSION_LEVEL
列。 mysql.slave_master_info
系统表包含Master_compression_algorithms
和Master_zstd_compression_level
列。如果master.info
文件存在,它也包含这些值的行。
- 性能模式的