paint-brush
MinIO에서 투명한 데이터 압축을 활성화하는 방법by@minio
7,079
7,079

MinIO에서 투명한 데이터 압축을 활성화하는 방법

MinIO8m2023/11/10
Read on Terminal Reader

MinIO용 압축은 시스템의 전체 성능에 영향을 주지 않고 투명한 압축이 가능하도록 개발되었습니다.
featured image - MinIO에서 투명한 데이터 압축을 활성화하는 방법
MinIO HackerNoon profile picture

대부분의 데이터는 쉬운 애플리케이션 상호 운용성을 위해 읽기 쉬운 파일 형식으로 저장됩니다. 이미지, 비디오 및 사운드 압축에 널리 사용되는 형식이 있지만 대부분의 다른 데이터는 JSON, CSV 또는 기타 유사한 텍스트 기반 형식과 같은 텍스트로 저장됩니다.


Parquet, Avro 및 ORC와 같은 형식에는 선택적 압축이 있으므로 일반적으로 이러한 형식은 저장 시 이미 압축되어 있습니다. 비디오와 이미지는 일반적으로 일반 형식보다 더 나은 압축을 제공하는 도메인별 알고리즘으로 압축됩니다.


그러나 사용자 정의 데이터의 경우 액세스할 압축 해제 단계가 포함되지 않은 복잡하지 않은 형식으로 데이터를 유지하는 것이 좋습니다. 우리는 이 데이터를 디스크에 저장하기 전에 압축할 수 있는 옵션을 제공하고자 합니다.

IO 속도의 투명한 압축

MinIO용 압축은 시스템의 전체 성능에 영향을 주지 않고 투명한 압축이 가능하도록 개발되었습니다.


MinIO는 S2라는 Snappy 기반 압축 방식을 사용합니다. Snappy 콘텐츠와 호환되지만 두 가지 형식 확장자가 있습니다. 우선, Snappy 스트림에 허용되는 64KB 블록보다 더 큰 블록을 허용합니다. 이렇게 하면 압축이 크게 향상됩니다. 둘째, 주로 로그 파일, JSON, CSV와 같은 기계 생성 데이터에 대한 압축 개선 기능을 제공하는 "반복 오프셋"을 추가합니다. 또한 64바이트보다 긴 일치 항목을 효과적으로 인코딩할 수 있는데, 이는 Snappy의 문제점입니다.


또한 S2는 입력이 단일 코어가 흡수할 수 있는 것보다 빠른 경우 여러 블록을 동시에 압축할 수 있습니다. 이는 개별 요청의 응답성을 유지하는 데 중요합니다. 사실상 16개 이상의 코어로 인한 제한은 메모리 속도입니다.

압축 비율

일부 어플라이언스 공급업체는 TB당 비용을 계산할 때 특정 압축 비율을 약속하거나 가정하기도 합니다. 압축을 사용하면 1:1 이상의 비율이 보장되지 않습니다. 데이터 유형이 다르면 압축 비율도 달라지며, 우리 의견으로는 평균 압축 비율을 제공할 수 있는 의미 있는 방법은 없습니다. 압축 비율은 진공 상태에서 평가해서는 안 됩니다. 실제 압축은 이 두 요소의 절충안이므로 항상 압축 속도와 쌍을 이루어야 합니다.


차이점을 관찰하기 위해 단일 데이터 유형을 비교해 보겠습니다. 최대 16개의 코어를 사용하여 AMD64 플랫폼에서 이러한 알고리즘의 Go 구현을 비교합니다.


압축비


우선, 가로축은 잘린 압축 비율로, 압축되지 않은 크기에서 축소된 비율입니다. 오른쪽이 더 좋습니다. 참조를 제공하기 위해 단일 스레드 gzip 레벨 5가 포함되었습니다.


압축기

속도 MB/초

크기

절감

12월MB/초

S2 기본값

15148

1043196283

83.37%

2378

S2 더 나은

11551

954430842

84.79%

2300

S2 베스트

680

832855431

86.73%

2572

LZ4 가장 빠른

5645

1280414160

79.59%

2680

LZ4 베스트

1552

1091826460

82.60%

2694

팔팔한

946

1525176492

75.69%

1828년

Gzip L5

206

942726276

84.97%

557


S2가 동시 압축 해제를 제공하더라도 압축 해제 속도는 단일 코어를 사용합니다.


이 데이터의 경우 Snappy는 Gzip 참조보다 약 10% 정도 부족합니다. 우리가 감소 비율을 다루고 있으므로 이는 Snappy가 Gzip 압축 데이터 공간의 약 1.6배를 차지한다는 의미이기도 합니다. 이는 Snappy가 Gzip보다 약 4배 빠르게 압축을 푼다는 사실을 무시합니다.


LZ4는 일반적으로 Snappy보다 우수한 것으로 간주됩니다. 여러 코어에서 압축을 허용하는 LZ4 구현도 이 점을 더욱 명확하게 만듭니다. 그러나 기본 압축이 더 좋습니다. LZ4-HC라고도 하는 LZ4 Best는 gzip에 가까운 압축을 제공하지만 압축 해제 속도는 빠르지만 대화형 속도는 아닙니다.


S2는 세 가지 압축 수준을 제공합니다. S2 Default는 가장 빠르며 단일 코어 사용과 관련하여 Snappy의 직접적인 경쟁자로 볼 수 있습니다. 이 데이터 유형을 사용하면 훨씬 더 높은 처리량으로 LZ4 수준보다 더 나은 성능을 발휘합니다. 이 모드는 어셈블리 구현을 사용할 수 없는 플랫폼의 MinIO에서 사용됩니다.


S2 Better를 사용하면 더 높은 압축률을 위해 약간의 CPU를 거래할 수 있습니다. 여기서 압축은 Gzip과 경쟁하지만 압축 해제 속도는 훨씬 더 좋습니다. 이 모드는 어셈블리가 가능한 플랫폼(현재 AMD64)의 MinIO에서 사용됩니다.


S2 Best는 S2가 현재 형식으로 수행할 수 있는 최고의 압축입니다. 이는 압축 속도/리소스가 가장 중요하지 않지만 여전히 빠른 압축 해제가 필요한 상황에서 사용할 수 있습니다. 현재 MinIO는 이 모드를 사용하지 않지만, 한동안 변경되지 않은 객체에 대한 수명 주기 옵션으로 구현할 수 있습니다.


비교를 위해 다음은 다른 데이터 유형과의 몇 가지 비교입니다.


VM 백업


DB 백업


CSV

압축할 수 없는 객체

최신 압축의 중요한 특징은 사전 압축된 데이터와 잘 작동한다는 것입니다. 전통적으로 사전 압축된 데이터는 압축 알고리즘에 문제가 되었습니다. 압축할 수 없는 데이터에 직면하면 압축기가 비합리적으로 느려지는 경우가 많습니다.


따라서 많은 사람들은 이미 압축된 데이터를 다시 압축하는 것이 좋지 않다는 것을 본능적으로 알고 있습니다. 그러나 많은 최신 구현에서는 이제 합리적인 수준으로 압축할 수 없는 섹션을 빠르게 건너뛸 수 있습니다.


위 압축기의 경우 2GiB(2,147,483,647바이트) 비압축 데이터의 속도는 다음과 같습니다.


압축기

속도 MB/초

크기

절감

S2 기본값

13045

2147487753

0.00%

S2 더 나은

9894

2147487753

0.00%

S2 베스트

3938

2147487753

0.00%

LZ4 고속

6400

2147485710

0.00%

LZ4 베스트

12488

2147745841

-0.01%

팔팔한

6564

2147745801

-0.01%

Gzip(이동) L5

63

2148139030

-0.03%

Gzip(대체) L5

5535

2147647512

-0.01%


여기에는 이러한 "나쁜" 동작을 나타내는 Go 표준 라이브러리의 gzip도 포함되었습니다. 대체 gzip 구현에서는 이 문제가 표시되지 않습니다. 다른 모든 경우에는 콘텐츠가 매우 빠르게 처리되어 통과됩니다.


이는 MinIO가 사전 압축된 데이터를 잘 처리할 것으로 예상할 수 있음을 의미합니다.

압축 파일 찾기

압축의 일반적인 단점은 파일 내에서 건너뛰는 기능이 손실된다는 것입니다. 이에 대한 해결책은 블록을 독립적으로 압축하고 압축되지 않은 여러 오프셋을 압축 해제가 시작될 수 있는 압축된 오프셋에 매핑하는 인덱스를 유지하는 것입니다.


독립 블록을 압축하면 압축이 약간 줄어들지만 블록이 클수록 압축이 줄어듭니다. Snappy/S2는 설계에 따라 스트림을 독립 블록으로 압축합니다.


MinIO의 경우 S3 GetObject 요청에 검색할 선택적 범위가 포함될 수 있으므로 이는 관련이 있습니다. 이를 통해 객체의 일부를 검색할 수 있으며, 우리는 이것이 최대한 효율적이기를 원합니다.


RELEASE.2022-07-13T23-29-44Z 부터 이제 8MB보다 큰 업로드된 모든 파일 부분에 대한 색인을 생성합니다. 그러면 인덱스가 메타데이터에 내부적으로 첨부됩니다. 이를 통해 효과적으로 앞으로 건너뛰고 요청된 데이터를 반환하는 데 필요한 개체 부분만 디코딩할 수 있습니다.


인덱스는 일반적으로 16바이트 + 데이터 MB당 약 3바이트입니다. 이를 통해 MinIO는 첫 번째 바이트를 검색하는 것과 동일한 속도로 압축 파일 내의 모든 바이트를 제공할 수 있습니다.

압축 + 미사용 암호화

기본적으로 MinIO가 디스크에서 암호화할 데이터를 압축하려면 추가 매개변수가 필요합니다. 이는 귀하가 이것의 의미를 알고 있는지 확인하기 위한 것입니다.


데이터를 압축하면 두 개의 숫자가 표시됩니다. 압축되지 않은 크기와 압축된 크기입니다. 압축하지 않으면 데이터를 얻는 사람은 누구나 압축되지 않은 크기 중 하나만 볼 수 있습니다.


이렇게 해도 압축 파일 내의 데이터에 액세스할 수는 없지만 데이터에 대한 몇 가지 힌트는 제공됩니다. 이는 가능하지 않은 일부 유형의 데이터를 알려줄 수 있습니다. 50% 압축된 파일을 보면 MP4 압축 비디오가 포함될 가능성이 거의 없습니다.


마찬가지로 몇 바이트로 압축된 파일에는 매우 간단한 반복 시퀀스가 포함될 가능성이 높습니다. 순서가 무엇인지 알 수는 없지만 가능성이 줄어듭니다. RELEASE.2022-07-13T23-29-44Z 의 MinIO는 압축된 출력을 256바이트의 배수로 채웁니다. 이 패딩은 어디에도 기록되지 않습니다. 우리는 이것이 문제에 대한 완전한 수정이라고 생각하지 않지만, 적에게 유출된 크기 정보의 유용성을 크게 줄입니다.


이것이 MinIO가 압축된 크기에 대한 정보를 클라이언트에 반환하지 않는 주된 이유입니다. 따라서 이에 대한 정보를 얻으려면 백엔드 스토리지 또는 백엔드 네트워크 통신에 대한 액세스가 필요합니다.


이 정보를 통해 이제 압축 및 암호화를 활성화하는 것이 안전한지 판단할 수 있는 충분한 지식을 갖추게 되었습니다.


압축된 스트림을 수정하거나 추가하는 것을 허용하지 않기 때문에 MinIO에서는 CRIME 스타일 공격이 불가능합니다. 또한 파일에 대한 정보가 너무 많이 유출될 수 있으므로 개체 버전 전반에 걸쳐 중복 제거/압축을 수행하지 않습니다.

MinIO에서 압축 구성

기본적으로 MinIO에서는 온디스크 압축이 비활성화되어 있습니다. 온디스크 압축은 언제든지 활성화하거나 비활성화할 수 있습니다. 온디스크 압축을 활성화하려면 mc admin config set myminio compression enable=on 사용하세요.


이렇게 하면 사전 설정된 확장자 수와 MIME 유형에 대한 압축이 활성화됩니다. 기본적으로 여기에는 다음이 포함됩니다.


확장

마임 유형

.txt.log.csv.json.tar.xml.bin

텍스트/*응용 프로그램/jsonapplication/xmlbinary/옥텟-스트림


mc admin config get myminio compression 사용하여 현재 설정을 검사할 수 있습니다.


다음을 수정하여 언제든지 이 목록을 수정할 수 있습니다.

 mc admin config set myminio compression \ extensions=.txt,.log,.csv,.json,.tar,.xml,.bin \ mime_types=text/*,application/json,application/xml,binary/octet-stream


기본적으로 MinIO는 gzip, 오디오, 비디오, 이미지 파일과 같이 일반적으로 압축할 수 없는 데이터의 확장자를 강제로 제외합니다.


확장자 목록과 MIME 유형을 비어 있게 설정하여 제외된 개체를 제외한 모든 개체에 대해 압축을 활성화할 수 있습니다.


 mc admin config set myminio compression enable=on extensions= mime_types=


최종 설정은 암호화할 객체에 대해서도 압축을 허용하는 allow_encryption=on 입니다. 위 섹션을 읽고 그 의미를 이해한 경우에만 이 설정을 설정하세요.

결론

MinIO는 디스크의 데이터를 완전히 투명하게 압축할 수 있는 동급 최고의 압축 방식을 제공합니다. 이는 많은 시나리오에서 단순히 압축을 활성화함으로써 스토리지 비용을 절감할 수 있습니다.


GET 및 PUT 성능은 압축이 활성화된 경우 모든 경우에 거의 동일하게 유지되어야 합니다. 실제로 디스크 읽기 속도로 인해 성능이 제한되는 상황에서는 읽어야 하는 데이터가 줄어들기 때문에 압축을 통해 추가 성능을 제공할 수 있습니다.


새로운 기능을 계속 추가하겠습니다. 현재 우리는 버킷/접두사 수준 구성 옵션과 특정 수명에 도달하면 파일을 압축하는 수명 주기를 통한 압축을 평가하고 있습니다.


이러한 기능에 관심이 있으시면 MinIO를 다운로드하여 직접 사용해 보십시오. 질문이 있거나 MinIO를 사용하여 구축 중인 멋진 앱에 대해 알려주고 싶다면 [email protected] 로 핑을 보내거나 Slack 커뮤니티 에 가입하거나 블로그를 팔로우하거나 뉴스레터를 구독하세요.


여기에도 게시되었습니다.