到服务器的连接可以在客户端和服务器之间的流量上使用压缩,以减少通过连接发送的字节数。默认情况下,连接是未压缩的,但如果服务器和客户端同意使用共同允许的压缩算法,则可以压缩。
压缩连接来自客户端,但影响客户端和服务器两侧的 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文件存在,也包含这些值的行。
-