MySQL 8.0 リファレンスマニュアル


20.5.5 X プラグイン での接続圧縮

MySQL 8.0.19 から、X プラグイン は X プロトコル 接続を介して送信されるメッセージの圧縮をサポートします。 サーバーとクライアントが相互にサポートされている圧縮アルゴリズムに同意する場合、接続を圧縮できます。 圧縮を有効にすると、ネットワーク経由で送信されるバイト数が削減されますが、圧縮および解凍操作のための CPU コストがサーバーおよびクライアントに追加されます。 したがって、圧縮の利点は、主にネットワーク帯域幅が低く、ネットワーク転送時間が圧縮および解凍操作のコストを支配し、結果セットが大きい場合に発生します。

注記

MySQL クライアントによって、接続圧縮のサポートが異なる方法で実装されます。詳細は、クライアントのドキュメントを参照してください。 たとえば、クラシック MySQL プロトコル 接続の場合は、セクション4.2.8「接続圧縮制御」 を参照してください。

X プラグイン の接続圧縮の構成

デフォルトでは、X プラグイン は zstd、LZ4 および Deflate 圧縮アルゴリズムをサポートしています。 Deflate アルゴリズムを使用した圧縮は zlib ソフトウェアライブラリを使用して実行されるため、X プロトコル 接続の deflate_stream 圧縮アルゴリズム設定は クラシック MySQL プロトコル 接続の zlib 設定と同等です。

サーバー側では、mysqlx_compression_algorithms システム変数に許可された圧縮アルゴリズムのみを含めるように設定することで、圧縮アルゴリズムを禁止できます。 アルゴリズム名 zstd_streamlz4_message および deflate_stream は任意の組合せで指定でき、順序と大文字と小文字は重要ではありません。 システム変数値が空の文字列の場合、圧縮アルゴリズムは許可されず、接続は圧縮解除されます。

次のテーブルでは、様々な圧縮アルゴリズムの特性を比較し、割り当てられた優先度を示します。 デフォルトでは、サーバーとクライアントで共通に許可されているもっとも優先度の高いアルゴリズムがサーバーによって選択されます。クライアントはあとで説明するように優先順位を変更できます。 アルゴリズムの短い形式のエイリアスは、指定時にクライアントで使用できます。

表 20.1 X プロトコル 圧縮アルゴリズムの特性

アルゴリズム エイリアス 圧縮率 スループット CPU コスト デフォルト優先度
zsth_stream zstd First
lz4_message lz4 最低
deflate_stream deflate 最高 Third

許可される圧縮アルゴリズムの X プロトコル セット (ユーザー指定かデフォルトかに関係なく) は、protocol_compression_algorithms サーバーシステム変数で指定される クラシック MySQL プロトコル 接続用に MySQL Server で許可される圧縮アルゴリズムのセットとは無関係です。 mysqlx_compression_algorithms システム変数を指定しない場合、X プラグイン は クラシック MySQL プロトコル 接続の圧縮設定の使用にフォールバックしません。 かわりに、デフォルトでは、表20.1「X プロトコル 圧縮アルゴリズムの特性」 に表示されているすべてのアルゴリズムが許可されます。 これは、セクション20.5.3「X プラグイン での暗号化接続の使用」 で説明されているように、X プラグイン システム変数が設定されていない場合に MySQL Server 設定が使用される TLS コンテキストの状況とは異なります。 クラシック MySQL プロトコル 接続の圧縮の詳細は、セクション4.2.8「接続圧縮制御」 を参照してください。

クライアント側では、X プロトコル 接続リクエストで圧縮制御用に複数のパラメータを指定できます:

  • 圧縮モード。

  • 圧縮レベル (MySQL 8.0.20)。

  • 許可されている圧縮アルゴリズムの優先度順のリスト (MySQL 8.0.22)。

注記

一部のクライアントまたはコネクタでは、特定の圧縮制御機能がサポートされていない場合があります。 たとえば、X プロトコル 接続の圧縮レベルの指定は MySQL Shell でのみサポートされ、他の MySQL クライアントやコネクタではサポートされません。 サポートされる機能およびその使用方法の詳細は、特定の製品のドキュメントを参照してください。

接続モードには、次の値があります:

  • disabled: 接続が圧縮解除されます。

  • preferred: サーバーとクライアントは、両方で許可されている圧縮アルゴリズムを見つけるためにネゴシエーションを行います。 使用可能な共通アルゴリズムがない場合、接続は圧縮解除されます。 これは、明示的に指定されていない場合のデフォルトモードです。

  • required: 圧縮アルゴリズムのネゴシエーションは preferred モードと同様に行われますが、使用可能な共通アルゴリズムがない場合、接続要求はエラーで終了します。

各接続の圧縮アルゴリズムに同意するだけでなく、サーバーとクライアントは、合意されたアルゴリズムに適用される数値範囲の圧縮レベルに同意できます。 アルゴリズムの圧縮レベルが高くなるにつれて、データ圧縮率が高くなり、クライアントへのメッセージの送信に必要なネットワーク帯域幅と転送時間が短縮されます。 ただし、データ圧縮に必要な労力も増加し、サーバー上の時間と CPU およびメモリーリソースが消費されます。 圧縮作業の増加には、圧縮率の増加と線形関係はありません。

MySQL 8.0.19 では、X プラグイン は常にアルゴリズムごとにライブラリのデフォルトの圧縮レベルを使用し (zstd の場合は 3、LZ4 の場合は 0、Deflate の場合は 6)、クライアントはこれをネゴシエートできません。 MySQL 8.0.20 から、クライアントは X プロトコル 接続のためにサーバーとの機能ネゴシエーション中に特定の圧縮レベルをリクエストできます。

MySQL 8.0.20 の X プラグイン で使用されるデフォルトの圧縮レベルは、圧縮時間とネットワーク転送時間の間のトレードオフとしてパフォーマンステストで選択されています。 これらのデフォルトは、各アルゴリズムのライブラリのデフォルトと必ずしも同じではありません。 これらは、クライアントがアルゴリズムの圧縮レベルをリクエストしない場合に適用されます。 デフォルトの圧縮レベルは、zstd の場合は 3、LZ4 の場合は 2、Deflate の場合は 3 に初期設定されます。 これらの設定は、mysqlx_zstd_default_compression_levelmysqlx_lz4_default_compression_level および mysqlx_deflate_default_compression_level システム変数を使用して調整できます。

サーバーでの過剰なリソース消費を防ぐために、X プラグイン では、サーバーがアルゴリズムごとに許可する最大圧縮レベルを設定します。 クライアントがこの設定を超える圧縮レベルをリクエストした場合、サーバーは最大許容圧縮レベルを使用します (クライアントによる圧縮レベルのリクエストは MySQL Shell でのみサポートされます)。 最大圧縮レベルは、zstd の場合は 11、LZ4 の場合は 8、Deflate の場合は 5 に初期設定されます。 これらの設定は、mysqlx_zstd_max_client_compression_levelmysqlx_lz4_max_client_compression_level および mysqlx_deflate_max_client_compression_level システム変数を使用して調整できます。

サーバーとクライアントで共通のアルゴリズムが複数許可されている場合、ネゴシエーション中にアルゴリズムを選択するためのデフォルトの優先順位が 表20.1「X プロトコル 圧縮アルゴリズムの特性」 に表示されます。 MySQL 8.0.22 から、圧縮アルゴリズムの指定をサポートするクライアントの場合、接続リクエストには、アルゴリズム名またはそのエイリアスを使用して指定された、クライアントで許可されるアルゴリズムのリストを含めることができます。 リスト内のこれらのアルゴリズムの順序は、サーバーによる優先順位とみなされます。 この場合に使用されるアルゴリズムは、サーバー側でも許可されているクライアントリストの最初のアルゴリズムです。 ただし、圧縮アルゴリズムのオプションには圧縮モードが適用されます:

  • 圧縮モードが disabled の場合、圧縮アルゴリズムオプションは無視されます。

  • 圧縮モードが preferred であるが、クライアント側で許可されているアルゴリズムがサーバー側で許可されていない場合、接続は圧縮解除されます。

  • 圧縮モードが required であるが、クライアント側で許可されているアルゴリズムがサーバー側で許可されていない場合は、エラーが発生します。

メッセージ圧縮の影響を監視するには、X プラグイン の接続圧縮の監視 で説明されている X プラグイン ステータス変数を使用します。 これらのステータス変数を使用して、現在の設定でのメッセージ圧縮の利点を計算し、その情報を使用して設定をチューニングできます。

X プラグイン の圧縮接続特性

X プロトコル 接続圧縮は、次の動作および境界で動作します:

  • アルゴリズム名の_stream および_message 接尾辞は、2 つの異なる操作モードを参照: ストリームモードでは、単一の接続内のすべての X プロトコル メッセージが連続ストリームに圧縮され、圧縮された順序をスキップせずに圧縮解除する必要があります。 メッセージモードでは、各メッセージは個別に圧縮され、圧縮された順序で解凍する必要はありません。 また、メッセージモードでは、圧縮されたすべてのメッセージを解凍する必要はありません。

  • 圧縮は、認証が成功する前に送信されるメッセージには適用されません。

  • 圧縮は、Mysqlx.OkMysqlx.ErrorMysqlx.Sql.StmtExecuteOk メッセージなどの制御フローメッセージには適用されません。

  • 他のすべての X プロトコル メッセージは、サーバーとクライアントが機能ネゴシエーション中に相互に許可された圧縮アルゴリズムに同意した場合に圧縮できます。 その段階でクライアントが圧縮を要求しない場合、クライアントもサーバーもメッセージに圧縮を適用しません。

  • X プロトコル 接続を介して送信されるメッセージが圧縮されても、mysqlx_max_allowed_packet システム変数で指定された制限が適用されます。 メッセージペイロードが解凍された後、ネットワークパケットはこの制限より小さくする必要があります。 制限を超えると、X プラグイン は解凍エラーを返し、接続を閉じます。

  • 次の点は、MySQL Shell でのみサポートされているクライアントによる圧縮レベルのリクエストに関連しています:

    • 圧縮レベルは、クライアントで整数として指定する必要があります。 他のタイプの値が指定された場合、接続はエラーでクローズします。

    • クライアントがアルゴリズムを指定し、圧縮レベルを指定しない場合、サーバーはアルゴリズムにデフォルトの圧縮レベルを使用します。

    • クライアントがサーバーの最大許容レベルを超えるアルゴリズム圧縮レベルをリクエストした場合、サーバーは最大許容レベルを使用します。

    • クライアントが、サーバーの最小許容レベルより低いアルゴリズム圧縮レベルをリクエストした場合、サーバーは最小許容レベルを使用します。

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 ステータス変数には、圧縮解除前に測定された圧縮メッセージペイロード、圧縮メッセージ内の圧縮されていないアイテム、および圧縮されていないメッセージが含まれます。


関連キーワード:  圧縮, アルゴリズム, 接続, メッセージ, サーバー, レベル, 変数, プロトコル, 許可, ステータス