连接压缩控制
与服务器的连接可以在客户端和服务器之间的流量上使用压缩以减少连接发送的字节数。默认情况下,连接是未压缩的,但如果服务器和客户端就一种互相允许的压缩算法达成一致,就可以进行压缩。
压缩连接始于客户端,但会影响客户端和服务器两侧的 CPU 负载,因为双方都要执行压缩和解压缩操作。由于启用压缩会降低性能,其主要优势主要体现在网络带宽较低、网络传输时间占据压缩和解压缩操作成本的主要因素,并且结果集较大的情况下。
本节介绍了可用的压缩控制配置参数以及监视压缩使用的信息来源。它适用于经典的 MySQL 协议连接。
压缩控制适用于客户端程序连接到服务器以及参与源/复制复制或组复制的服务器之间的连接。压缩控制不适用于 FEDERATED 表的连接。在以下讨论中,“客户端连接”是指从任何支持压缩的来源发起的连接,除非上下文指示了特定的连接类型。
注意 从 MySQL 8.0.19 开始,MySQL 服务器实例的 X 协议连接支持压缩,但 X 协议连接的压缩操作与此处描述的经典 MySQL 协议连接的压缩操作是独立的,并且受到单独的控制。
配置连接压缩
从 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_OPT_COMPRESSION_ALGORITHMS 和 MYSQL_OPT_ZSTD_COMPRESSION_LEVEL 选项用于 mysql_options() 函数,配置使用 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 系统变量配置 Group Replication 恢复连接时新成员加入组并连接到捐赠者时允许的压缩算法和 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。
- 要仅允许使用 zstd 压缩的传入连接,可以在启动时如下配置服务器:
[mysqld] protocol_compression_algorithms=zstd
或者,在运行时进行更改:
SET PERSIST protocol_compression_algorithms='zstd';
- 要允许 mysql 客户端发起 zlib 或未压缩的连接,请按以下方式调用它:
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,最后是未压缩。如果两侧找不到共同的算法,则连接尝试失败。
由于双方必须就压缩算法达成一致,并且未压缩是一个不一定允许的算法值,因此不一定会回退到未压缩连接。例如,如果服务器配置为允许 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时,--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或slave_compressed_protocol系统变量,则它优先于MASTER_COMPRESSION_ALGORITHMS,如果源和复制都允许该算法,则连接到源使用zlib压缩。如果禁用replica_compressed_protocol或slave_compressed_protocol,则应用MASTER_COMPRESSION_ALGORITHMS的值。
注意 传统压缩控制参数在MySQL 8.0.18中已被弃用;预计在将来的MySQL版本中将其删除。
监控连接压缩
压缩状态变量为ON或OFF,表示当前连接是否使用压缩。
mysql客户端的\status命令会显示一行,如果当前连接启用了压缩,则显示"Protocol: Compressed"。如果没有出现这行,表示连接未压缩。
从8.0.14版本开始,MySQL Shell的\status命令会显示一行"Compression: Disabled"或"Enabled",表示连接是否压缩。
从MySQL 8.0.18版本开始,可以使用以下额外的信息来监控连接压缩:
- 要监控客户端连接中使用的压缩情况,可以使用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文件,则其中也包含这些值的行。