개발자를 위한 MongoDB 일관성 이해: BASE 모델 해설
현대 애플리케이션 개발 세계에서 올바른 데이터베이스를 선택하는 것은 매우 중요하며, 그 기반이 되는 일관성 모델을 이해하는 것은 필수적입니다. 선도적인 NoSQL 문서 데이터베이스인 MongoDB는 유연성, 확장성 및 성능으로 인해 엄청난 인기를 얻었습니다. 하지만 데이터 일관성에 대한 MongoDB의 접근 방식은 기존 관계형 데이터베이스와 상당히 다릅니다. 이 글에서는 최종 일관성(eventual consistency) 개념과 MongoDB에 적용되는 BASE 모델에 대해 명확히 설명하고, MongoDB가 읽기 및 쓰기 고려 사항(Read and Write Concerns)을 어떻게 처리하는지 살펴보고, ACID 모델과 비교하며, 이러한 선택이 고성능 애플리케이션을 확장하는 데 왜 근본적인지 설명할 것입니다.
SQL 데이터베이스에서 전환하는 개발자나 분산 시스템을 구축하는 사람들에게 MongoDB의 일관성 보장을 파악하는 것은 안정적이고 예측 가능한 애플리케이션을 설계하는 데 필수적입니다. 우리는 관련된 상충 관계를 탐색하고 특정 애플리케이션 요구 사항을 충족하기 위해 MongoDB의 동작을 조정할 수 있는 방법에 대한 실용적인 통찰력을 제공할 것입니다.
ACID 대 BASE: 일관성을 위한 두 가지 접근 방식
MongoDB의 모델을 자세히 살펴보기 전에, 데이터베이스 일관성을 위한 두 가지 주요 패러다임인 ACID와 BASE를 이해하는 것이 유용합니다.
ACID 속성 (전통적인 RDBMS)
PostgreSQL이나 MySQL과 같은 전통적인 관계형 데이터베이스 관리 시스템(RDBMS)은 일반적으로 ACID 속성을 준수하여 특히 트랜잭션 워크로드에서 데이터 신뢰성을 보장합니다. ACID는 다음을 의미합니다:
- 원자성 (Atomicity): 각 트랜잭션은 단일하고 분할 불가능한 단위로 처리됩니다. 완전히 완료되거나(커밋) 전혀 발생하지 않습니다(롤백). 부분적인 트랜잭션은 없습니다.
- 일관성 (Consistency): 트랜잭션은 데이터베이스를 한 유효 상태에서 다른 유효 상태로 전환합니다. 데이터베이스에 기록된 데이터는 정의된 모든 규칙과 제약 조건에 따라 유효해야 함을 보장합니다.
- 격리성 (Isolation): 동시 트랜잭션은 격리되어 실행되며, 마치 순차적으로 실행되는 것처럼 보입니다. 동시 트랜잭션의 결과는 순차적으로 실행된 결과와 동일합니다.
- 지속성 (Durability): 트랜잭션이 커밋되면 전원 손실, 충돌 또는 기타 시스템 장애 발생 시에도 커밋 상태로 유지됩니다. 변경 사항은 영구적으로 저장됩니다.
ACID는 강력한 일관성을 보장하므로 금융 거래와 같이 엄격한 데이터 무결성이 필요한 애플리케이션에 이상적입니다.
BASE 속성 (MongoDB와 같은 NoSQL 데이터베이스)
대조적으로, MongoDB를 포함한 많은 NoSQL 데이터베이스는 즉각적인 일관성보다 가용성과 파티션 허용 오차를 우선시하며, 종종 BASE 모델과 일치합니다. BASE는 다음을 의미합니다:
- 기본적으로 사용 가능 (Basically Available): 시스템은 데이터의 최신 버전을 보장할 수 없더라도 모든 요청에 응답할 것임을 보장합니다.
- 약한 상태 (Soft State): 시스템의 상태는 입력 없이도 시간이 지남에 따라 변경될 수 있습니다. 이는 데이터가 시스템 전반에 비동기적으로 전파되는 최종 일관성 모델로 인해 발생합니다.
- 최종 일관성 (Eventual Consistency): 주어진 데이터 항목에 대해 새로운 업데이트가 발생하지 않으면, 결국 해당 항목에 대한 모든 액세스는 마지막으로 업데이트된 값을 반환합니다. 분산 시스템의 모든 노드에서 변경 사항이 표시되기까지 지연 시간이 있습니다.
BASE를 준수하는 시스템은 분산 환경 전반에서 높은 가용성과 확장성을 위해 설계되었으므로 데이터 전파의 지연을 감수할 수 있는 애플리케이션에 적합합니다.
MongoDB에서 최종 일관성 이해하기
MongoDB의 기본 일관성 모델은 최종 일관성입니다. 이는 MongoDB 복제본 세트에 데이터를 쓸 때 기본 노드가 쓰기를 승인하고 비동기적으로 해당 쓰기를 보조 노드로 복제한다는 의미입니다. 기본 노드는 쓰기가 영구적임을 보장하지만, 성공을 클라이언트에게 승인하기 전에 모든 보조 노드가 따라잡을 때까지 기다리지는 않습니다. 결과적으로 보조 노드에서 수행하는 후속 읽기는 최신 쓰기를 즉시 반영하지 않을 수 있지만, 결국에는 일관성이 있게 됩니다.
이러한 설계 선택은 MongoDB가 수평적으로 확장하고 높은 가용성을 유지할 수 있는 능력의 근간입니다. 모든 작업에 대해 모든 노드가 완벽하게 동기화되도록 요구하지 않음으로써, MongoDB는 일부 노드가 일시적으로 사용할 수 없거나 지연되더라도 읽기 및 쓰기를 계속 제공할 수 있습니다.
최종 일관성의 상충 관계
- 장점: 더 높은 가용성, 더 나은 성능(쓰기 지연 시간 감소), 분산 시스템을 위한 더 큰 확장성.
- 단점: 애플리케이션은 오래된 데이터를 읽을 가능성을 처리하도록 설계되어야 합니다. 이는 모든 복제본 전반에 걸친 즉각적인 일관성이 중요한 작업에서 특히 관련이 있습니다.
MongoDB의 읽기 및 쓰기 고려 사항: 일관성 조정
MongoDB는 기본적으로 최종 일관성을 따르지만, 개발자가 작업 단위별로 일관성 수준을 조정할 수 있도록 강력한 메커니즘인 읽기 고려 사항(Read Concerns)과 쓰기 고려 사항(Write Concerns)을 제공합니다. 이를 통해 애플리케이션 요구 사항에 따라 일관성, 가용성 및 성능 간의 균형을 맞출 수 있습니다.
쓰기 고려 사항
쓰기 고려 사항은 쓰기 작업에 대해 MongoDB로부터 요청하는 승인 수준을 설명합니다. 이는 작업이 성공으로 반환되기 전에 복제본 세트 멤버 중 몇 개가 쓰기를 확인해야 하는지를 결정합니다.
주요 쓰기 고려 사항 옵션:
w: 쓰기를 확인해야 하는mongod인스턴스의 수를 지정합니다.w: 0: 승인 없음. 클라이언트는 데이터베이스로부터의 어떤 응답도 기다리지 않습니다. 이는 처리량은 가장 높지만, 기본 노드가 쓰기 직후 충돌하면 데이터 손실 위험이 있습니다.w: 1(기본값): 기본 노드로부터의 승인만 해당됩니다. 기본 노드가 쓰기를 수신하고 처리했음을 확인합니다. 빠르지만 쓰기가 보조 노드에 복제되었음을 보장하지는 않습니다.w: "majority": 복제본 세트 멤버(기본 노드 포함)의 다수로부터의 승인. 이는 쓰기가 다수 노드에 커밋되므로 더 강력한 내구성 보장을 제공합니다. 기본 노드가 실패하더라도 데이터는 다른 노드의 다수에서 존재함이 보장됩니다.
j:mongod인스턴스가 쓰기를 승인하기 전에 온디스크 저널에 쓸지 여부를 지정합니다. 저널링을 활성화(j: true)하면mongod프로세스가 충돌하더라도 내구성이 보장됩니다.wtimeout: 쓰기 고려 사항이 충족되어야 하는 시간 제한입니다. 이 시간 내에 쓰기 고려 사항이 충족되지 않으면 쓰기 작업은 오류를 반환합니다.
쓰기 고려 사항 예시 (저널링을 사용한 w: "majority"):
db.products.insertOne(
{ item: "laptop", qty: 50 },
{ writeConcern: { w: "majority", j: true, wtimeout: 5000 } }
);
팁: 영구적이고 가용성이 높은 중요한 데이터의 경우,
j: true와 함께w: "majority"를 사용하는 것이 좋습니다. 덜 중요한 데이터나 높은 처리량의 로깅의 경우,w: 1또는 심지어w: 0도 허용될 수 있습니다.
읽기 고려 사항
읽기 고려 사항은 읽기 작업에 대한 일관성 및 격리 수준을 지정할 수 있도록 합니다. 이는 복제 환경에서 쿼리에 대해 MongoDB가 어떤 데이터를 반환하는지를 결정합니다.
주요 읽기 고려 사항 옵션:
local: 클라이언트가 연결된 인스턴스(기본 또는 보조)로부터 데이터를 반환합니다. 이는 독립 실행형 인스턴스 및 보조 노드의 기본값입니다. 복제본 세트의 경우, 이는 지연 시간이 가장 낮지만 오래된 데이터를 반환할 수 있습니다.available: 복제본 세트의 다수에 데이터가 기록되었음을 보장하지 않고 인스턴스로부터 데이터를 반환합니다.local과 유사하게 가용성과 낮은 지연 시간을 우선시합니다.majority(기본 노드 읽기의 기본값): 복제본 세트 멤버의 다수에 의해 승인된 데이터를 반환합니다. 이는 데이터가 영구적이며 롤백되지 않음을 보장합니다.local또는available보다 강력한 일관성을 제공하지만 잠재적으로 더 높은 지연 시간이 발생합니다.linearizable: 반환되는 데이터가 전역적으로 승인된 최신 쓰기를 반영함을 보장합니다. 이는 가장 강력한 읽기 고려 사항으로, 읽기가majority쓰기 고려 사항에 의해 승인된 모든 쓰기를 볼 수 있도록 보장합니다. 상당한 성능 오버헤드가 발생할 수 있으며 기본 노드에서 읽을 때만 사용할 수 있습니다.snapshot(다중 문서 트랜잭션의 경우): 쿼리가 특정 시점의 데이터를 반환하도록 보장하여 트랜잭션 내의 여러 문서 전반에서 읽기가 일관되도록 합니다.
읽기 고려 사항 예시 (majority 사용):
db.products.find(
{ item: "laptop" },
{ readConcern: { level: "majority" } }
);
경고:
linearizable은 강력한 일관성을 제공하지만 성능에 영향을 미칩니다. 쓰기의 엄격한 순서와 전역적 가시성이 중요한 시나리오에서 신중하게 사용하십시오.
확장성에 BASE와 최종 일관성이 중요한 이유
BASE 모델과 최종 일관성은 MongoDB의 확장성과 높은 가용성을 가능하게 하는 핵심 요소입니다.
- 수평적 확장 (샤딩): 즉각적인 일관성을 완화함으로써 MongoDB는 데이터를 여러 샤드(복제본 세트 클러스터)에 분산할 수 있습니다. 각 샤드는 비교적 독립적으로 작동하여, 전체 분산 시스템의 모든 노드가 항상 완벽하게 동기화될 필요 없이 데이터베이스가 수평적으로 확장되어 대규모 데이터 세트와 높은 처리량을 처리할 수 있도록 합니다.
- 고가용성 및 내결함성: 복제본 세트에서 기본 노드를 사용할 수 없게 되면 보조 노드 중에서 새 기본 노드가 선출될 수 있습니다. 최종 일관성은 장애 조치 중에도 보조 노드가 읽기를 계속 제공할 수 있으며(읽기 고려 사항에 따라), 시스템이 계속 사용 가능함을 의미합니다. 기본 노드가 모든 쓰기에 대해 모든 보조 노드를 기다려야 했다면, 단 하나의 지연되는 보조 노드가 전체 시스템의 병목 현상을 일으킬 수 있었습니다.
- 성능: 덜 엄격한 일관성 요구 사항은 쓰기 작업에 대한 지연 시간이 낮아지고 전체 처리량이 높아짐을 의미합니다. 시스템이 진행하기 전에 모든 노드로부터의 승인을 기다리며 차단될 필요가 없기 때문입니다.
읽기 및 쓰기 고려 사항을 통한 튜닝 가능한 일관성 제공을 통해 MongoDB는 개발자가 정보에 입각한 결정을 내릴 수 있도록 지원합니다. 높은 가용성과 처리량을 우선시하는 애플리케이션(예: IoT 데이터 수집, 실시간 분석)은 약한 일관성을 선택할 수 있습니다. 반대로, 더 강력한 데이터 무결성을 요구하는 애플리케이션(예: 금융 거래, 재고 업데이트)은 관련된 성능 상충 관계를 수용하면서 더 강력한 일관성 수준을 선택할 수 있습니다.
실용적인 고려 사항 및 모범 사례
- 중요 데이터 식별: 어떤 데이터가 강력한 일관성을 절대적으로 요구하는지(예: 계정 잔액)와 최종 일관성을 감수할 수 있는 데이터(예: 사용자 프로필 업데이트, 세션 데이터)를 결정하십시오.
- 멱등성 설계: 약한 쓰기 고려 사항을 사용할 경우, 쓰기가 기본 노드에서 성공했지만 보조 노드에 복제되기 전에 실패하여 롤백되고 클라이언트는 쓰기가 실패했다고 생각할 수 있습니다. 클라이언트가 작업을 재시도하면 중복이 발생할 수 있습니다. 가능한 경우 작업이 멱등성을 갖도록 설계하십시오.
- 클라이언트 측 읽기-자체-쓰기: 사용자가 쓰기를 수행한 후 즉시 읽으려고 시도하는 경우, 약한 읽기 고려 사항을 가진 보조 노드에서 읽으면 오래된 데이터를 볼 수 있습니다. 사용자가 항상 자신의 최신 쓰기를 읽도록 보장하려면, 해당 읽기를 기본 노드로 지시하거나, 특정 작업에 대해
majority쓰기 고려 사항과 결합하여majority읽기 고려 사항을 사용하는 것을 고려하십시오. - 모니터링:
rs.printReplicationInfo()또는 MongoDB Atlas 메트릭을 사용하여 복제본 세트 지연 시간을 확인하십시오. 높은 복제 지연 시간은 최종 일관성 문제를 악화시킬 수 있습니다.
결론
MongoDB가 BASE 모델과 최종 일관성 접근 방식을 채택한 것은 확장성, 성능 및 고가용성 측면에서 MongoDB의 강점의 근간입니다. 정교한 읽기 및 쓰기 고려 사항을 제공함으로써 MongoDB는 개발자에게 개별 작업에 대해 원하는 일관성 수준을 명시적으로 정의할 수 있는 유연성을 제공하며, 엄격한 데이터 무결성과 분산 시스템 요구 사항 사이의 균형을 맞춥니다. 이러한 개념을 이해하는 것은 단순한 이론이 아니라 MongoDB에서 강력하고 확장 가능하며 고성능 애플리케이션을 구축하기 위한 실질적인 필요 사항입니다.
MongoDB 스키마와 상호 작용을 설계할 때, 항상 애플리케이션의 특정 일관성 요구 사항을 고려하고 이러한 강력한 조정 메커니즘을 활용하여 신뢰성과 속도 모두에 대해 데이터베이스를 최적화하십시오.