Loading...
MySQL 9.5 Reference Manual 9.5의 22.5.5 Connection Compression with X Plugin의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
X Plugin은 X Protocol 커넥션을 통해 전송되는 메시지의 압축을 지원합니다. 서버와 클라이언트가 서로 지원하는 압축 알고리즘에 합의하면 커넥션을 압축할 수 있습니다. 압축을 사용하면 네트워크를 통해 전송되는 바이트 수를 줄일 수 있지만, 그 대신 서버와 클라이언트에는 압축 및 압축 해제 작업을 위한 추가 CPU 비용이 발생합니다. 따라서 압축의 이점은 주로 네트워크 대역폭이 낮고, 네트워크 전송 시간이 압축 및 압축 해제 작업 비용을 지배하며, 결과 집합이 큰 경우에 나타납니다.
참고
서로 다른 MySQL 클라이언트들은 커넥션 압축 지원을 다르게 구현합니다. 자세한 내용은 각 클라이언트의 문서를 참조하십시오. 예를 들어, 클래식 MySQL 프로토콜 커넥션에 대해서는 Section 6.2.8, “Connection Compression Control”을 참조하십시오.
기본적으로 X Plugin은 zstd, LZ4, Deflate 압축 알고리즘을 지원합니다. Deflate 알고리즘을 사용한 압축은 zlib 소프트웨어 라이브러리를 사용하여 수행되므로, X Protocol 커넥션에 대한 deflate_stream 압축 알고리즘 설정은 클래식 MySQL 프로토콜 커넥션에 대한 zlib 설정과 동일합니다.
서버 측에서는 mysqlx_compression_algorithms 시스템 변수를 허용된 알고리즘만 포함하도록 설정하여, 특정 압축 알고리즘을 허용하지 않도록 할 수 있습니다. 알고리즘 이름 zstd_stream, lz4_message, deflate_stream은 어떤 조합으로든 지정할 수 있으며, 순서와 대소문자는 중요하지 않습니다. 시스템 변수 값이 빈 문자열이면 허용되는 압축 알고리즘이 없으며 커넥션은 압축되지 않습니다.
다음 테이블은 서로 다른 압축 알고리즘의 특성을 비교하고, 각 알고리즘에 할당된 우선순위를 보여줍니다. 기본적으로 서버는 서버와 클라이언트가 공통으로 허용한 알고리즘 중에서 가장 높은 우선순위를 가진 알고리즘을 선택합니다. 이후 설명하는 것처럼 클라이언트는 우선순위를 변경할 수 있습니다. 알고리즘의 짧은 형식 별칭은 클라이언트가 알고리즘을 지정할 때 사용할 수 있습니다.
Table 22.1 X Protocol Compression Algorithm Characteristics
| Algorithm | Alias | Compression Ratio | Throughput | CPU Cost | Default Priority |
|---|---|---|---|---|---|
zsth_stream | zstd | High | High | Medium | First |
lz4_message | lz4 | Low | High | Lowest | Second |
deflate_stream | deflate | High | Low | Highest | Third |
X Protocol에서 허용되는 압축 알고리즘의 집합(사용자가 지정했든 기본값이든)은 클래식 MySQL 프로토콜 커넥션에 대해 MySQL 서버가 허용하는 압축 알고리즘 집합과는 독립적입니다. 후자는 protocol_compression_algorithms 서버 시스템 변수로 지정됩니다. mysqlx_compression_algorithms 시스템 변수를 지정하지 않더라도, X Plugin은 클래식 MySQL 프로토콜 커넥션에 대한 압축 설정으로 돌아가지 않습니다. 대신, 기본값으로 Table 22.1, “X Protocol Compression Algorithm Characteristics”에 나와 있는 모든 알고리즘을 허용합니다. 이는 TLS 컨텍스트의 경우와는 다릅니다. TLS 컨텍스트에서는 Section 22.5.3, “Using Encrypted Connections with X Plugin”에 설명된 것처럼, X Plugin 시스템 변수가 설정되지 않았을 때 MySQL 서버 설정이 사용됩니다. 클래식 MySQL 프로토콜 커넥션의 압축에 대한 정보는 Section 6.2.8, “Connection Compression Control”을 참조하십시오.
클라이언트 측에서는 X Protocol 커넥션 요청 시 압축 제어를 위해 여러 매개변수를 지정할 수 있습니다:
Compression mode
Compression level
우선순위 순서로 정해진 허용 압축 알고리즘 목록
참고
일부 클라이언트 또는 커넥터는 특정 압축 제어 기능을 지원하지 않을 수 있습니다. 예를 들어, X Protocol 커넥션에 대한 압축 레벨 지정은 MySQL Shell에서만 지원되며, 다른 MySQL 클라이언트나 커넥터에서는 지원되지 않습니다. 지원되는 기능과 사용 방법에 대한 자세한 내용은 각 제품의 문서를 참조하십시오.
커넥션 모드에는 다음의 허용 값이 있습니다:
disabled: 커넥션은 압축되지 않습니다.
preferred: 서버와 클라이언트는 서로 허용하는 압축 알고리즘을 찾기 위해 협상을 수행합니다. 공통 알고리즘을 찾지 못하면 커넥션은 압축되지 않습니다. 명시적으로 지정하지 않으면 이 모드가 기본값입니다.
required: 압축 알고리즘 협상은 preferred 모드와 동일하게 수행되지만, 공통 알고리즘을 찾지 못하면 커넥션 요청은 오류와 함께 종료됩니다.
각 커넥션에 대해 압축 알고리즘에 합의하는 것 외에도, 서버와 클라이언트는 합의된 알고리즘에 적용되는 숫자 범위에서 압축 레벨에 합의할 수 있습니다. 알고리즘의 압축 레벨이 높아질수록 데이터 압축률이 증가하여, 메시지를 클라이언트에 전송하는 데 필요한 네트워크 대역폭과 전송 시간이 줄어듭니다. 그러나 데이터 압축에 필요한 작업량도 증가하여, 서버의 시간과 CPU 및 메모리 리소스를 더 많이 사용합니다. 압축 작업의 증가량은 압축률 증가량과 선형 관계를 가지지 않습니다.
클라이언트는 X Protocol 커넥션에 대해 서버와 기능 협상을 수행하는 동안 특정 압축 레벨을 요청할 수 있습니다.
MySQL 9.5에서 X Plugin이 사용하는 기본 압축 레벨은 압축 시간과 네트워크 전송 시간 간의 적절한 균형이 되도록 성능 테스트를 통해 선택되었습니다. 이 기본값은 각 알고리즘의 라이브러리 기본값과 반드시 동일한 것은 아닙니다. 이들은 클라이언트가 알고리즘에 대해 압축 레벨을 요청하지 않았을 때 적용됩니다. 기본 압축 레벨은 zstd의 경우 3, LZ4의 경우 2, Deflate의 경우 3으로 초기 설정됩니다. 이 설정은 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 시스템 변수를 사용하여 조정할 수 있습니다.
서버와 클라이언트가 둘 이상 공통으로 허용한 알고리즘이 있을 경우, 협상 동안 알고리즘을 선택하기 위한 기본 우선순위 순서는 Table 22.1, “X Protocol Compression Algorithm Characteristics”에 나와 있습니다. 압축 알고리즘을 지정하는 기능을 지원하는 클라이언트에서는, 커넥션 요청에 클라이언트가 허용하는 알고리즘 목록을 알고리즘 이름이나 별칭을 사용해 포함할 수 있습니다. 이 목록에서 알고리즘의 순서는 서버에 의해 우선순위 순서로 간주됩니다. 이 경우 사용되는 알고리즘은 클라이언트 목록에 있는 것 중 서버에서도 허용되는 것들 가운데 첫 번째 알고리즘입니다. 단, 압축 알고리즘에 대한 옵션은 압축 모드의 영향을 받습니다:
압축 모드가 disabled인 경우, 압축 알고리즘 옵션은 무시됩니다.
압축 모드가 preferred인데 클라이언트 측에서 허용한 알고리즘 중 서버 측에서 허용하는 것이 하나도 없는 경우, 커넥션은 압축되지 않습니다.
압축 모드가 required인데 클라이언트 측에서 허용한 알고리즘 중 서버 측에서 허용하는 것이 하나도 없는 경우, 오류가 발생합니다.
메시지 압축의 효과를 모니터링하기 위해, Monitoring Connection Compression for X Plugin에 설명된 X Plugin 상태 변수를 사용하십시오. 이러한 상태 변수를 사용하여 현재 설정에서 메시지 압축의 이점을 계산하고, 그 정보를 사용해 설정을 튜닝할 수 있습니다.
X Protocol 커넥션 압축은 다음과 같은 동작과 경계를 가집니다:
알고리즘 이름의 _stream 및 _message 접미사는 두 가지 다른 작동 모드를 나타냅니다. 스트림 모드에서는 단일 커넥션의 모든 X Protocol 메시지가 연속적인 스트림으로 압축되며, 동일한 방식으로—압축된 순서를 지키고 어떤 메시지도 건너뛰지 않고—압축 해제해야 합니다. 메시지 모드에서는 각 메시지가 개별적으로 독립적으로 압축되며, 압축된 순서대로 압축 해제할 필요가 없습니다. 또한 메시지 모드에서는 압축된 모든 메시지를 반드시 압축 해제할 필요도 없습니다.
인증이 성공하기 전에 전송되는 메시지에는 압축이 적용되지 않습니다.
Mysqlx.Ok, Mysqlx.Error, Mysqlx.Sql.StmtExecuteOk와 같은 제어 흐름 메시지에는 압축이 적용되지 않습니다.
그 외 모든 X Protocol 메시지는 서버와 클라이언트가 기능 협상 동안 서로 허용하는 압축 알고리즘에 합의하면 압축될 수 있습니다. 클라이언트가 이 단계에서 압축을 요청하지 않으면, 클라이언트와 서버 모두 메시지에 압축을 적용하지 않습니다.
X Protocol 커넥션을 통해 전송되는 메시지가 압축되는 경우에도, mysqlx_max_allowed_packet 시스템 변수로 지정된 제한은 여전히 적용됩니다. 네트워크 패킷은 메시지 페이로드가 압축 해제된 이후에도 이 제한보다 작아야 합니다. 이 제한을 초과하면, X Plugin은 압축 해제 오류를 반환하고 커넥션을 종료합니다.
다음 항목은 클라이언트의 압축 레벨 요청에 관련되며, 이 기능은 MySQL Shell에서만 지원됩니다:
압축 레벨은 클라이언트가 정수로 지정해야 합니다. 그 외의 유형의 값이 제공되면, 커넥션은 오류와 함께 종료됩니다.
클라이언트가 알고리즘을 지정하지만 압축 레벨을 지정하지 않은 경우, 서버는 해당 알고리즘에 대한 기본 압축 레벨을 사용합니다.
클라이언트가 서버 최대 허용 레벨을 초과하는 알고리즘 압축 레벨을 요청하면, 서버는 최대 허용 레벨을 사용합니다.
클라이언트가 서버 최소 허용 레벨보다 낮은 알고리즘 압축 레벨을 요청하면, 서버는 최소 허용 레벨을 사용합니다.
X Plugin 상태 변수를 사용하여 메시지 압축의 효과를 모니터링할 수 있습니다. 메시지 압축이 사용 중일 때, 세션 Mysqlx_compression_algorithm 상태 변수는 현재 X Protocol 커넥션에 사용 중인 압축 알고리즘을 보여주며, Mysqlx_compression_level은 선택된 압축 레벨을 보여줍니다.
X Plugin 상태 변수는 선택된 압축 알고리즘의 효율성(데이터 압축률)과 메시지 압축 사용의 전반적인 효과를 계산하는 데 사용할 수 있습니다. 특정 압축 알고리즘이 알려져 있는 특정 세션에 대해 메시지 압축의 이점을 확인하려면, 다음 계산에서 상태 변수의 세션 값을 사용하십시오. 또는, X Protocol 커넥션을 사용하는 모든 세션에 대해, 사용된 모든 압축 알고리즘 및 메시지 압축을 사용하지 않은 모든 세션을 포함하여, 서버 전체에 대한 메시지 압축의 전반적인 이점을 확인하려면 상태 변수의 글로벌 값을 사용하십시오. 그런 다음, Configuring Connection Compression for X Plugin에 설명된 대로 허용 압축 알고리즘, 최대 압축 레벨, 기본 압축 레벨을 조정하여 메시지 압축을 튜닝할 수 있습니다.
메시지 압축이 사용 중일 때, Mysqlx_bytes_sent 상태 변수은 서버에서 전송된 전체 바이트 수를 보여줍니다. 여기에는 압축 이후에 측정된 압축된 메시지 페이로드, X Protocol 헤더와 같이 압축된 메시지 내에서 압축되지 않은 항목, 그리고 압축되지 않은 메시지가 모두 포함됩니다. Mysqlx_bytes_sent_compressed_payload 상태 변수는 압축 이후에 측정된 압축된 메시지 페이로드의 전체 바이트 수를 보여주며, Mysqlx_bytes_sent_uncompressed_frame 상태 변수는 동일한 메시지 페이로드에 대해 압축 이전에 측정된 전체 바이트 수를 보여줍니다. 따라서 압축 알고리즘의 효율성을 나타내는 압축률은 다음 식을 사용해 계산할 수 있습니다:
1mysqlx_bytes_sent_uncompressed_frame / mysqlx_bytes_sent_compressed_payload
서버가 전송한 X Protocol 메시지에 대한 압축의 효과는 다음 식을 사용해 계산할 수 있습니다:
1(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 상태 변수에는 압축 해제 이전에 측정된 압축된 메시지 페이로드, 압축된 메시지 내의 압축되지 않은 항목, 그리고 압축되지 않은 메시지가 모두 포함됩니다.
22.5.4 Using X Plugin with the Caching SHA-2 Authentication Plugin
22.5.6 X Plugin Options and Variables