[AWS] DocumentDB: 디스크 축소 관리

[원본 링크]

AWS DocumentDB 같은 Full-Managed DB의 가장 장점은, 디스크의 확장과 축소가 편리하다는 것이다.
자동으로 확장되는 것도 좋지만, 사실 더 특별한 것은 축소가 완벽하게 된다는 것이다. 다른 Half-Managed DB 서비스들은 DB를 축소하는 것이 근본적으로 불가능하다. 볼륨을 재생성해야 한다.




디스크 계층의 이해

디스크 비용 관리를 하려면 기본적인 계층 구조에 대한 이해가 있어야 한다.
근본적으로 DB가 쓰는 논리적 볼륨이 있고, 그 논리적 볼륨은 물리적 볼륨(EBS 등) 위에서 할당된다.

논리적 볼륨에서 축소가 되더라도 물리적 볼륨에서 반환이 불가능한 구조라면 결국 비용을 줄일 수가 없는 것이다.
AuroraDB가 아닌 일반 RDS 등은 이러한 한계 위에서 돌아간다.
하지만 스토리지 계층을 완전 관리형으로 제공하는 AuroraDB나 DocumentDB 등은 물리적 볼륨 수준에서의 수축을 지원하기 때문에, DB가 디스크를 반환하면 실제로도 물리적 볼륨을 반환해서 비용을 줄일 수 있다.

그래서 실제로 데이터를 줄이면, 이런 식으로 줄어든다. 다음은 DocumentDB의 경우다.




DB나 컬렉션 단위 제거일 경우

데이터베이스나 컬렉션 단위로 통째로 제거할 경우에는 빠르게 논리 볼륨 - 물리 볼륨까지 반환이 완료된다.
거의 아무리 늦어도 딜레이가 1시간 미만일 것이다.

이 경우에는 위 메트릭처럼 아주 명쾌하게 비용이 줄어드는 것을 볼 수 있다.




Document 단위 제거일 경우

컬렉션에서 일부 document들을 제거한 경우에는, 생각과는 좀 다르게 동작할 수 있다.

내 경우에는 거의 200GB에 달하는 document를 정리했는데도, 그게 일주일이 넘도록 스토리지를 반환하지 않았다. stats을 찍어보면

db.runCommand({collStats: "table", indexDetails: true})

실제로 66%에 달하는 쓰레기가 미사용 영역으로만 남아있을 뿐이고, 디스크는 커녕 논리 볼륨 수준에서도 반환되지 않은 것이었다.

사실, DocuementDB는 document 단위 제거에 대해서는 최종적인 디스크 반환을 제공하지 않는다.
삭제된 데이터들의 스토리지는 미사용 영역으로 빠져서 추후 재사용을 위해서 대기할 뿐이다.

그리고 이 미사용 영역은 해당 컬렉션 단위에만 종속된다. a collection을 미사용 영역은 a collection에서 발생한 write을 위해서만 사용된다는 것이다.

그래서 진짜 디스크를 반환하고 싶다면, 컬렉션을 만들어서 옮기고, 기존 컬렉션을 삭제하는 등의 번거로운 작업을 해야만 한다.

// 1단계: 새 컬렉션 준비
db.createCollection("users_temp");

// 인덱스 복사
db.users.getIndexes().forEach(function(index) {
    if (index.name !== "_id_") {
        delete index.v;
        delete index.ns;
        db.users_temp.createIndex(index.key, index);
    }
});

// 2단계: 필요한 데이터만 복사
db.users.find({/* 필요한 조건 */}).forEach(function(doc) {
    db.users_temp.insertOne(doc);
});

// 3단계: 교체
db.users.renameCollection("users_backup");
db.users_temp.renameCollection("users");


참조
https://docs.aws.amazon.com/documentdb/latest/developerguide/garbage-collection.html
https://docs.aws.amazon.com/ko_kr/documentdb/latest/developerguide/doc-compression.html
https://docs.aws.amazon.com/ko_kr/documentdb/latest/developerguide/troubleshooting.index-creation.html