与服务器的连接可以使用客户端和服务器之间的通信流量的压缩来减少通过连接发送的字节数。默认情况下,连接是不压缩的,但如果服务器和客户端在相互允许的压缩算法上达成一致,则可以压缩。
压缩连接源自客户端,但会影响客户端和服务器两端的 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文件存在,它也包含这些值的线。