AWS 기술 블로그

HAQM DocumentDB에서 압축 기능을 활용한 비용 절감

이 글은 AWS Database Blog에 게시된 Unlock cost savings using compression with HAQM DocumentDB by Sourav Biswas and Nikhil Goyal을 한국어로 번역 및 편집하였습니다.

HAQM DocumentDB(MongoDB 호환)는 완전관리형 기본 JSON 도큐먼트 데이터베이스로, 인프라를 관리하지 않고도 규모와 관계없이 중요한 문서 워크로드를 쉽고 비용 효율적으로 운영할 수 있게 해줍니다. MongoDB API(버전 3.6, 4.0 및 5.0)와 호환되는 드라이버를 사용하여 작성된 동일한 애플리케이션 코드와 도구를 사용하여 인프라를 관리하는 걱정 없이 HAQM DocumentDB에서 워크로드를 실행, 관리 및 확장할 수 있습니다. 도큐먼트 데이터베이스로서 HAQM DocumentDB는 JSON 데이터의 저장, 쿼리 및 인덱싱을 간단하게 수행할 수 있게 해줍니다.

Reduce cost and improve performance by migrating to HAQM DocumentDB 5.0 포스트에서, 우리는 워크로드를 HAQM DocumentDB로 마이그레이션하여 비용을 절감하는 다양한 방법에 대해 논의했습니다. 이번 포스트에서는 스토리지 사용량과 I/O 비용을 줄이기 위한 HAQM DocumentDB의 문서 압축 기능을 설명하겠습니다.

솔루션 개요

HAQM DocumentDB는 이제 LZ4 압축 알고리즘을 사용한 문서 압축을 지원합니다. HAQM DocumentDB에서 압축된 문서는 압축되지 않은 문서보다 최대 7배 더 작습니다. 압축 달성률은 데이터에 따라 다릅니다. 예를 들어, 반복되는 패턴이 있는 텍스트 필드는 숫자 데이터보다 더 많이 압축될 수 있습니다. HAQM DocumentDB 압축 검토 도구를 사용하여 압축을 활성화하기 전에 데이터가 얼마나 압축될 수 있는지 파악할 수 있습니다.

압축된 문서는 더 적은 저장 공간과 데이터베이스 읽기 및 쓰기에 더 적은 I/O 작업을 필요로 하기때문에 스토리지 및 I/O 비용이 낮아집니다. 문서는 버퍼 캐시에서도 압축되어 캐시가 더 많은 작업 세트를 수용할 수 있게 합니다. 문서 압축/압축 해제에는 추가 CPU가 필요하고 읽기/쓰기 지연 시간도 증가합니다. 하지만 압축 가능한 데이터가 있는 컬렉션의 경우 얻을 수 있는 이점이 오버헤드를 상회할 것입니다.

각 HAQM DocumentDB 컬렉션마다의 컬렉션 접근 패턴과 저장 요구 사항에 따라 개별 컬렉션별로 문서 압축을 구성할 수 있습니다. 이 포스트의 후반부에서 설명하는 것처럼, API를 사용하여 압축 상태와 압축 후 컬렉션 크기를 모니터링할 수 있습니다.

다음 사항을 유의하시기 바랍니다.

  • 클러스터의 새로운 컬렉션에 대한 기본 압축 설정은 클러스터 파라미터 default_collection_compression에 의해 결정됩니다. 이 파라미터는 기본적으로 비활성화되어 있습니다. 대부분의 컬렉션이 압축 사용으로 이점을 얻는 것이 아니라면 기본값을 그대로 둘 수 있습니다.
  • 기존 컬렉션에도 문서 압축을 적용할 수 있습니다. 하지만 이 방법은 압축이 켜진 후 삽입되거나 업데이트되는 문서만 압축합니다. 이러한 컬렉션의 모든 기존 문서에 압축을 적용하기 위한 한 가지 전략으로, 압축이 켜지기 전에 존재했던 문서들에 대해 통제된 느린 속도로 (애플리케이션에서 사용하지 않는 새 필드에) 더미 업데이트를 실행하는 전략을 사용할 수 있습니다. 이러한 업데이트 작업의 일부로 압축이 적용될 것입니다.
  • 문서 압축은 HAQM DocumentDB 버전 5.0에서만 지원됩니다. HAQM DocumentDB는 기본적으로 2KB 이상 크기의 문서만 압축합니다. 하지만 압축 임계값 설정에 설명된 단계에 따라 임계값을 128-8,000 Bytes 사이에서 설정할 수 있습니다. 우리의 테스트에 따르면 설정할 수 있는 가장 작은 값인 128 Bytes 미만에서는 압축의 이점이 크지 않습니다. 문서의 압축 가능성에 따라 워크로드에 대한 이상적인 임계값을 설정할 수 있습니다.
  • 이 포스트 발행 시점을 기준으로, HAQM DocumentDB에서는 컬렉션 데이터만 압축되며, 인덱스는 압축되지 않습니다.

샘플 데이터셋 및 압축 결과

압축된 컬렉션과 압축되지 않은 컬렉션 간의 결과를 비교하기 위해, 동일한 데이터셋을 압축되지 않은 컬렉션과 압축된 컬렉션에 각각 따로 로드합니다. 모든 HAQM DocumentDB 컬렉션에서 기본적으로 압축은 꺼져 있기 때문에, 첫번째 단계로 압축하려는 데이터를 로드하기 위해 압축이 켜진 컬렉션을 생성해야 합니다. compressed_collection이라는 이름의 압축된 컬렉션을 생성하려면 mongo 쉘 명령 프롬프트에서 다음 명령을 사용하세요.

db.runCommand( {
    create: "compressed_collection",
    storageEngine: {
        DocumentDB: {
            compression: { "enable": true }
        }
    }
} )

컬렉션을 생성한 후, mongoimport 명령을 사용하여 데이터를 컬렉션에 로드할 수 있습니다. 데이터를 압축된 컬렉션과 압축되지 않은 컬렉션 모두에 로드한 후, mongo shell에서 stats() 명령을 사용하여 개별 컬렉션의 통계를 표시할 수 있습니다.

다음 섹션에서는 몇 가지 샘플 데이터셋과 이러한 데이터셋에서 달성할 수 있는 압축 수준을 살펴보겠습니다.

FeTaQA(Free-form Table Question Answering dataset): 자유 형식 테이블 질문 답변 데이터셋

이 테스트를 위해 FeTaQA: 자유 형식 테이블 질문 답변 데이터셋을 사용합니다. 이 데이터셋은 여러 JSON 파일을 포함하고 있습니다.

다음 코드는 샘플 문서의 축약된 구조를 보여줍니다.

rs0:PRIMARY> db.fetaqav1.findOne()
{
    "_id" : ObjectId("66f174d0305bdb12a2513b6d"),
    "feta_id" : 18162,
    "table_source_json" : "totto_source/train_json/example-10461.json",
    "page_wikipedia_url" : "http://en.wikipedia.org/wiki/1982 …”,
    "table_page_title" : "1982 Illinois gubernatorial election",
    "table_section_title" : "Results",
    "table_array" : [
         [
            "Party",
            "Party",
            "Candidate",
            "Votes",
            "%",
            "±"
         ],
         [
            "-",
            "Republican",
            "James R. Thompson (incumbent)",
            "1,816,101",
            "49.44",
            "-"
         ],
…
…

다음 표는 컬렉션 통계(stats) 명령 출력의 storageSize(Kilo bytes)를 비교합니다.

Uncompressed Compressed
rs0:PRIMARY> db.fetaqav1.stats(1024)
{
    "ns" : "qa.fetaqav1",
    "count" : 7326,
    "size" : 16180.55078125,
    "avgObjSize" : 2261.65492765,
    "storageSize" : 17480,
    "compression" : {
        "enable" : false
    },
…
…
rs0:PRIMARY> db.fetaqav1_comp.stats(1024)
{
    "ns" : "qa.fetaqav1_comp",
    "count" : 7326,
    "size" : 16180.55078125,
    "avgObjSize" : 2261.6549276549276,
    "storageSize" : 12568,
    "compression" : {
        "enable" : true,
        "threshold" : 2032
    },
…
…

이 데이터셋에서 7,326개 문서에 대한 압축 사용으로 절약된 저장 공간은 (17480 - 12568) = 4912 Kilo bytes 또는 ((4912 * 100) / 17480) = 28%입니다. 압축 비율 측면에서, 이 샘플은 12568 / 17480 = 1:0.7 압축을 달성했습니다.

뉴스 관련 트윗

이 테스트를 위해 Kaggle에서 호스팅되는 뉴스 기사 관련 twitter-news 데이터셋을 사용합니다. 다음 코드는 샘플 문서의 축약된 구조를 보여줍니다.

rs0:PRIMARY> db.us_news.findOne()
{
    "_id" : ObjectId("66b2efa90bb97b46d3081039"),
    "_type" : "snscrape.modules.twitter.Tweet",
    "url" : "http://twitter.com/MarketsCafe/status/1558153858920202240",
    "date" : "2022-08-12T18:10:03+00:00",
    "content" : "July consumer price inflation comes in at …",
    "renderedContent" : "July consumer price inflation …",
    "id" : NumberLong("1558153858920202240"),
    "user" : {
             "_type" : "snscrape.modules.twitter.User",
             "username" : "MarketsCafe",
             "id" : NumberLong("1263898793012916224"),
             "displayname" : "Market's Cafe",
             "description" : "This twitter profile will get you the …",
             "rawDescription" : "This twitter profile will get you …",
             "descriptionUrls" : null,
             "verified" : false,
             "created" : "2020-05-22T18:25:46+00:00",
             "followersCount" : 1986,
             "friendsCount" : 21,
             "statusesCount" : 553848,
...
...

다음 표는 컬렉션 통계(stats) 명령 출력의 storageSize(Kilo bytes)를 비교합니다.

Uncompressed Compressed
rs0:PRIMARY> db.us_news.stats(1024)
{
    "ns" : "tweets.us_news",
    "count" : 2877354,
    "size" : 7789087.1953125,
    "avgObjSize" : 2772.544,
    "storageSize" : 8791784,
    "compression" : {
        "enable" : false
    },
…
…
rs0:PRIMARY> db.us_news_comp.stats(1024)
{
    "ns" : "tweets.us_news_comp",
    "count" : 2877354,
    "size" : 7730078.958984375,
    "avgObjSize" : 2751.1825,
    "storageSize" : 5826144,
    "compression" : {
        "enable" : true,
        "threshold" : 2032
    },
…
…

이 컬렉션에서 2,877,354개 문서에 대한 압축 사용으로 절약된 저장 공간은 (8791784 - 5826144) = 2965640 Kilo bytes 또는 ((2965640 * 100) / 8791784) = 34%입니다. 압축 비율 측면에서, 이 샘플은 5826144 / 8791784 = 1:0.7 압축을 달성했습니다.

이러한 예시들에서, 문서 압축을 사용한 결과로 저장 크기를 최대 34%까지 줄일 수 있었습니다. 컬렉션의 데이터 크기가 매우 큰 경우, 이는 상당한 저장 비용 절감으로 이어질 수 있습니다.

압축은 읽기 및 쓰기 작업 중에 약간의 오버헤드가 있으므로, 압축이 워크로드에 적합한지 판단하는 가장 좋은 방법은 데이터셋으로 비슷한 실험을 수행하고 이점을 비교 검토하는 것입니다. HAQM DocumentDB 클러스터의 볼륨을 복제하는 것은 프로덕션 시스템에 영향을 주지 않고 프로덕션 데이터로 테스트를 수행할 수 있는 안전하고 빠르며 비용 효율적인 메커니즘입니다. 앞으로 워크로드가 변경되면 언제든지 컬렉션에서 압축을 활성화할 수 있습니다.

요약

이 포스트에서는 HAQM DocumentDB의 압축 기능이 어떻게 스토리지 크기를 줄이는데 도움이 되는지를 보여드렸습니다. 샘플 데이터셋을 사용했고, 문서 내용에 따라 크기 감소율은 달라졌습니다. 최근 출시된 기능과 블로그 포스트에 대한 자세한 내용은 HAQM DocumentDB(MongoDB 호환) 리소스를 참조하세요.

DaeHyun Baek

DaeHyun Baek

백대현 Cloud Support Engineer는 데이터베이스 전문 엔지니어로서 HAQM Aurora and RDS 서비스에 대해 고객들의 기술적 문의 및 이슈 분석 등의 고객 지원 업무를 수행하고 있습니다.