• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 使用X插件进行连接压缩

    从MySQL 8.0.19开始,通过X协议连接发送的消息支持压缩。默认情况下,连接是未压缩的,但是如果服务器和客户端同意使用压缩算法,则可以压缩连接。启用压缩会减少通过网络发送的字节数,但由于执行压缩和解压缩操作,因此会给服务器和客户端增加CPU成本。因此,压缩的好处主要出现在网络带宽低,网络传输时间主导压缩和解压缩操作的成本以及结果集很大时。

    默认情况下,X协议宣布支持Deflate,LZ4和zstd压缩算法。Deflate算法的压缩是使用zlib软件库进行的,因此X协议的deflate_stream压缩算法设置等同zlib于MySQL Server 的设置。您可以通过将mysqlx_compression_algorithms系统变量设置为仅包含您允许的压缩算法来禁止任何压缩算法。可以任意组合指定算法名称deflate_streamlz4_messagezstd_stream,并且顺序和大小写并不重要。如果将系统变量设置为空字符串,则不允许使用任何压缩算法,并且仅使用未压缩的连接。

    可以为X协议允许或不允许的压缩算法比较如下:

    X协议压缩算法的比较

    算法压缩率通量CPU成本
    deflate_stream最高
    lz4_message最低
    zstd_stream介质

    请注意,X协议的允许压缩算法列表(无论是用户指定的还是默认的)均独立于MySQL Server宣布的压缩算法列表运行,该列表由protocol_compression_algorithms服务器系统变量指定。如果不指定mysqlx_compression_algorithms系统变量,则X协议不会退一步使用MySQL Server的压缩设置,而是使用其自己的默认值,即允许所有受支持的算法。这与SSL系统变量的情况不同,如“使用带有X插件的安全连接”中所述,如果未设置X插件系统变量,则使用MySQL Server的设置。。有关MySQL的连接压缩如何工作的信息,

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

    在MySQL 8.0.19中,X协议始终对每种算法使用库默认压缩级别(对于Deflate为6,对于LZ4为0,对于zstd为3),并且客户端无法协商。从MySQL 8.0.20开始,客户端可以在与服务器进行功能协商以进行X协议连接时请求特定的压缩级别。

    为了防止服务器上过多的资源消耗,X协议设置服务器允许的每种算法的最大压缩级别。如果客户端请求的压缩级别超过此设置,则服务器将使用其最大允许的压缩级别。最初将最大压缩级别设置为Deflate 5,LZ4 8和zstd 11。您可以调整使用这些设置mysqlx_deflate_max_client_compression_levelmysqlx_lz4_max_client_compression_levelmysqlx_zstd_max_client_compression_level系统变量。

    通过性能测试已选择MySQL 8.0.20中X协议使用的默认压缩级别,因为它是压缩时间与网络传输时间之间的良好折衷。这些默认值不必与每种算法的库默认值相同。如果客户端不请求算法的压缩级别,则应用它们。默认压缩级别最初设置为Deflate 3,LZ4 2和zstd 3。您可以调整使用这些设置mysqlx_deflate_default_compression_levelmysqlx_lz4_default_compression_levelmysqlx_zstd_default_compression_level系统变量。

    您可以使用“使用X插件监视连接压缩”中所述的X插件状态变量来监视消息压缩的效果。您可以使用这些状态变量来计算当前设置对消息压缩的好处,并使用该信息来调整设置。

    X协议的连接压缩具有以下行为和边界:

    • X协议消息标头不压缩,仅消息有效负载。
    • 压缩不适用于身份验证成功之前发送的任何消息。
    • 压缩没有被施加到控制流消息,例如Mysqlx.OkMysqlx.Error,和Mysqlx.Sql.StmtExecuteOk消息。
    • 如果服务器和客户端同意在能力协商期间使用相互支持的算法进行压缩,则所有其他X协议消息都可以压缩其有效负载。如果客户端在那个阶段不请求压缩,则客户端和服务器都不会对消息应用压缩。
    • 当压缩通过X协议连接发送的消息时,mysqlx_max_allowed_packet系统变量指定的限制仍然适用。消息有效负载解压缩后,网络数据包必须小于此限制。如果超出限制,则X协议将返回解压缩错误并关闭连接。
    • 如果客户端请求压缩,但是服务器和客户端之间没有共同的压缩算法,则连接将关闭并显示错误。
    • 客户端必须将压缩级别指定为整数。如果提供任何其他类型的值,则连接将关闭并显示错误。
    • 如果客户端指定算法而不是压缩级别,则服务器将其默认压缩级别用于该算法。
    • 如果客户端请求的压缩级别超出了该算法的最大允许压缩级别的服务器设置,则服务器将使用其最大允许压缩级别用于该算法。
    • 如果客户端请求的压缩级别小于该算法提供的最小压缩级别,则服务器将最小压缩级别用于该算法。
    • 如果客户端请求的压缩级别根本不受协议算法支持,则服务器将使用该算法支持并允许的最近值。

    使用X插件监视连接压缩

    您可以使用X插件状态变量来监视消息压缩的效果。使用消息压缩时,会话状态变量Mysqlx_compression_algorithm显示当前X协议连接使用的压缩算法,并Mysqlx_compression_level显示所选的压缩级别。这些会话状态变量可从MySQL 8.0.20获得。

    从MySQL 8.0.19开始,X插件状态变量可用于计算所选压缩算法的效率(数据压缩率)以及使用消息压缩的总体效果。在以下计算中使用状态变量的会话值,可以参见消息压缩对于使用已知压缩算法的特定会话有何好处。或使用状态变量的全局值来检查使用X协议连接的所有会话中服务器的消息压缩的总体优势,包括已用于这些会话的所有压缩算法以及未使用消息压缩的所有会话。“使用X插件进行连接压缩”。

    使用消息压缩时,状态变量Mysqlx_bytes_sent显示从服务器发送的字节总数,包括压缩后测得的压缩消息有效负载,压缩消息中未压缩的所有项目(例如X协议标头)以及任何未压缩的消息。状态变量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
    

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