10bet官方网站文档家里
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册摘录

20.5.5使用X Plugin进行连接压缩

从MySQL 8.0.19开始,X Plugin支持通过X协议连接发送的消息压缩。如果服务器和客户端同意一个相互支持的压缩算法,就可以压缩连接。启用压缩可以减少通过网络发送的字节数,但是为压缩和解压缩操作增加了服务器和客户端额外的CPU成本。因此,压缩的好处主要出现在网络带宽较低、网络传输时间占压缩和解压缩操作成本的主要地位以及结果集较大的情况下。

请注意

不同的MySQL客户端对连接压缩的支持是不同的;详细信息请参考您的客户文档。10bet官方网站例如,对于经典的MySQL协议连接,请参见第4.2.8节,“连接压缩控制”

配置X插件的连接压缩

默认情况下,X Plugin支持zstd、LZ4和Deflate压缩算法。使用Deflate算法进行压缩是使用zlib软件库进行的,因此deflate_stream设置X协议连接的压缩算法等价于zlib设置为经典的MySQL协议连接。

在服务器端,可以通过设置mysqlx_compression_algorithms系统变量只包括那些允许的。这个算法的名字zstd_stream,lz4_message,deflate_stream可以以任意组合指定,且顺序和字母大小写不重要。如果系统变量值为空字符串,则不允许使用压缩算法,并且不压缩连接。

下表比较了不同压缩算法的特点,并给出了它们所分配的优先级。默认情况下,服务器选择服务器和客户端共同允许的最高优先级算法;客户端可以更改后面描述的优先级。客户机在指定算法时可以使用算法的缩写形式别名。

表20.1 X协议压缩算法特征

算法 别名 压缩比 吞吐量 CPU成本 默认优先级
zsth_stream zstd 媒介 第一个
lz4_message lz4 最低 第二个
deflate_stream 缩小 最高 第三

X协议允许的压缩算法集(无论是用户指定的还是默认的)独立于MySQL Server允许的经典MySQL协议连接的压缩算法集,它是由protocol_compression_algorithms服务器系统变量。如果不指定mysqlx_compression_algorithms对于经典的MySQL协议连接,X Plugin不会退回到使用压缩设置。相反,它的默认值是允许中显示的所有算法表20.1,“X协议压缩算法特征”。这与TLS上下文的情况不同,在TLS上下文中,如果没有设置X Plugin系统变量,则使用MySQL Server设置,如中所述第20.5.3节,“使用X Plugin加密连接”。有关经典MySQL协议连接的压缩信息,请参见第4.2.8节,“连接压缩控制”

在客户端,X Protocol连接请求可以为压缩控制指定几个参数:

  • 压缩模式。

  • 压缩级别(来自MySQL 8.0.20)。

  • 允许的压缩算法的列表(从MySQL 8.0.22)。

请注意

一些客户机或连接器可能不支持给定的压缩控制特性。例如,只有MySQL Shell支持为X协议连接指定压缩级别,而其他MySQL客户端或连接器不支持。有关支持的特性和10bet官方网站如何使用它们的详细信息,请参见特定产品的文档。

连接模式有以下允许的值:

  • 禁用:连接未压缩。

  • 首选:服务器和客户端协商找到一个他们都允许的压缩算法。如果没有可用的通用算法,则不压缩连接。如果没有明确指定,这是默认模式。

  • 要求:压缩算法协商发生首选模式,但如果没有通用算法可用,则连接请求终止并出现错误。

除了就每个连接的压缩算法达成一致外,服务器和客户端还可以就适用于所达成一致算法的数字范围内的压缩级别达成一致。随着算法压缩级别的提高,数据压缩比也随之提高,从而减少了向客户端发送消息所需的网络带宽和传输时间。但是,数据压缩所需的工作也会增加,占用服务器上的时间、CPU和内存资源。压缩努力的增加与压缩比的增加没有线性关系。

在MySQL 8.0.19中,X Plugin总是为每个算法使用库默认的压缩级别(3为zstd, 0为LZ4, 6为Deflate),客户端不能协商这个。在MySQL 8.0.20中,客户端可以在与服务器进行能力协商时请求特定的压缩级别,以获得X协议连接。

MySQL 8.0.20中X Plugin使用的默认压缩级别是通过性能测试在压缩时间和网络传输时间之间选择的。对于每个算法,这些默认值不一定与库默认值相同。如果客户端没有为算法请求压缩级别,它们将应用。默认压缩级别最初设置为3(用于zstd)、2(用于LZ4)和3(用于Deflate)。控件可以调整这些设置mysqlx_zstd_default_compression_level,mysqlx_lz4_default_compression_level,mysqlx_deflate_default_compression_level系统变量。

为了防止服务器上过多的资源消耗,X Plugin设置了服务器允许的每个算法的最大压缩级别。如果客户端请求的压缩级别超过这个设置,服务器将使用其允许的最大压缩级别(客户端请求的压缩级别仅由MySQL Shell支持)。zstd的最大压缩级别最初设置为11,LZ4为8,Deflate为5。控件可以调整这些设置mysqlx_zstd_max_client_compression_level,mysqlx_lz4_max_client_compression_level,mysqlx_deflate_max_client_compression_level系统变量。

如果服务器和客户端共同允许多个算法,则在协商过程中选择算法的默认优先级顺序显示在表20.1,“X协议压缩算法特征”。从MySQL 8.0.22开始,对于支持指定压缩算法的客户端,连接请求可以包含客户端允许的算法列表,使用算法名或其别名指定。这些算法在列表中的顺序被服务器作为优先级顺序。本例中使用的算法是客户端列表中也允许在服务器端使用的第一个算法。但是,压缩算法的选择取决于压缩模式:

  • 压缩模式为禁用,压缩算法选项将被忽略。

  • 压缩模式为首选但是客户端允许的算法在服务器端不允许,连接是未压缩的。

  • 压缩模式为要求但是客户端允许的算法在服务器端不允许,就会发生错误。

要监视消息压缩的效果,请使用X Plugin状态变量监控连接压缩的X插件。您可以使用这些状态变量计算当前设置的消息压缩的好处,并使用该信息优化设置。

压缩连接特性的X插件

X协议连接压缩使用以下行为和边界:

  • _stream_message算法名中的后缀指的是两种不同的操作模式:在流模式下,一个连接中的所有X协议消息都被压缩成一个连续的流,并且必须以相同的方式解压——遵循它们被压缩的顺序,并且不能跳过任何消息。在消息模式中,每个消息都是单独和独立地压缩的,不需要按压缩的顺序进行解压缩。此外,消息模式不要求解压缩所有压缩消息。

  • 在身份验证成功之前发送的任何消息都不会应用压缩。

  • 压缩不应用于控制流消息,例如Mysqlx。好吧,Mysqlx。错误,Mysqlx.Sql.StmtExecuteOk消息。

  • 所有其他X协议消息都可以压缩,如果服务器和客户端在能力协商期间同意一个相互允许的压缩算法。如果客户端在此阶段不请求压缩,则客户端和服务器都不会对消息应用压缩。

  • 当通过X协议连接发送的消息被压缩时,由mysqlx_max_allowed_packet系统变量仍然适用。在消息有效负载解压后,网络包必须小于此限制。如果超过限制,X Plugin返回解压错误并关闭连接。

  • 以下几点是关于客户端的压缩级别请求,只有MySQL Shell支持:

    • 客户端必须以整数形式指定压缩级别。如果提供了任何其他类型的值,连接将关闭并报错。

    • 如果客户端指定了一种算法,但没有指定压缩级别,则服务器使用算法的默认压缩级别。

    • 如果客户端请求的算法压缩级别超过了服务器允许的最大级别,服务器将使用最大允许级别。

    • 如果客户端请求的算法压缩级别小于服务器最小允许级别,服务器将使用最小允许级别。

监控连接压缩的X插件

您可以使用X Plugin状态变量监视消息压缩的效果。当使用消息压缩时,会话Mysqlx_compression_algorithmstatus变量显示当前X协议连接使用的是哪种压缩算法,以及Mysqlx_compression_level显示所选择的压缩级别。这些会话状态变量可以从MySQL 8.0.20中获得。

从MySQL 8.0.19, X Plugin状态变量可以用来计算所选择的压缩算法的效率(数据压缩比),以及使用消息压缩的整体效果。在下面的计算中使用状态变量的会话值,看看对于使用已知压缩算法的特定会话,消息压缩有什么好处。或者使用状态变量的全局值来检查跨使用X Protocol连接的所有会话(包括已用于这些会话的所有压缩算法,以及未使用消息压缩的所有会话)的服务器的消息压缩的总体好处。然后,可以通过调整允许的压缩算法、最大压缩级别和默认压缩级别来优化消息压缩,如中所述配置X插件的连接压缩

当使用消息压缩时,则Mysqlx_bytes_sent状态变量显示从服务器发送的字节总数,包括压缩后测量的压缩消息有效负载,压缩消息中未压缩的任何项,如X Protocol头,以及任何未压缩的消息。的Mysqlx_bytes_sent_compressed_payload状态变量显示作为压缩消息有效负载发送的字节总数,在压缩后测量,以及Mysqlx_bytes_sent_uncompressed_frame状态变量显示了压缩前测量的相同消息有效负载的总字节数。因此,可以使用以下表达式计算压缩比,这表明了压缩算法的效率:

mysqlx_bytes_sent_uncompressed_frame / mysqlx_bytes_sent_compressed_payload

服务器发送的X条协议消息的压缩效率可以用如下表达式计算:

(mysqlx_bytes_sent - mysqlx_bytes_sent_compressed_payload + mysqlx_bytes_sent_uncompressed_frame) / mysqlx_bytes_sent . txt

对于服务器从客户端接收到的消息,则Mysqlx_bytes_received_compressed_payload状态变量显示作为压缩消息有效负载接收的字节总数,在解压缩前测量,以及Mysqlx_bytes_received_uncompressed_frame状态变量显示解压缩后测量的相同消息有效负载的总字节数。的Mysqlx_bytes_received状态变量包括解压前测量的压缩消息有效载荷、压缩消息中的任何未压缩项以及任何未压缩消息。