CAP theorem

· 5분 읽기

분산 시스템, CAP 이론

분산 시스템

현대 시스템 설계에서 분산 시스템은 자주 등장하는 개념이다.

분산 시스템은 여러 대의 컴퓨터가 네트워크를 통해 상호 작용하여 하나의 시스템처럼 작동하는 시스템을 말한다.

이 시스템은 데이터 처리, 저장, 통신 등을 분산하여 수행함으로써 성능을 향상시키고, 신뢰성을 높이며, 확장성을 확보한다.

분산 시스템의 주요 목표는 고가용성, 데이터 무결성, 일관성 유지 등을 통해 사용자가 안정적이고 신뢰할 수 있는 서비스를 제공받을 수 있도록 하는 것이다.

분산 시스템의 장점 중 하나는 확장성이다. 시스템에 더 많은 컴퓨터를 추가함으로써 처리 능력을 확장할 수 있다.

또한, 특정 컴퓨터에 장애가 발생해도 전체 시스템의 운영에는 영향을 미치지 않도록 설계할 수 있다.

이러한 이점은 대규모 데이터 처리와 고가용성이 요구되는 현대의 다양한 서비스에서 분산 시스템이 필수적인 이유 중 하나이다.

CAP 이론

CAP 이론은 분산 시스템에서 일관성(Consistency), 가용성(Availability), 네트워크 분할 허용(Partition Tolerance) 세 가지 특성을 동시에 모두 만족할 수 없다는 것을 설명하는 이론이다.

graph TD
    C["Consistency<br/>일관성"]
    A["Availability<br/>가용성"]
    P["Partition Tolerance<br/>분할 허용"]

    C --- A
    A --- P
    P --- C

    CP["CP 시스템<br/>MongoDB, HBase"]
    AP["AP 시스템<br/>Cassandra, DynamoDB"]

    C -.- CP
    P -.- CP
    A -.- AP
    P -.- AP

Consistency

모든 노드가 동일한 시점에 동일한 데이터를 보유하고 있는 상태를 말한다.

강한 일관성을 보장한다면, 어떤 업데이트가 발생했을 때 모든 노드가 즉시 그 변경을 반영해야 한다.

CAP에서 말하는 일관성(Consistency)은 ACID의 일관성과 다른 개념이다. ACID의 C는 트랜잭션 전후로 데이터베이스가 유효한 상태를 유지하는 것(제약 조건 충족 등)을 의미하는 반면, CAP의 C는 분산된 모든 노드가 같은 시점에 같은 데이터를 보는 것을 의미한다.

실제로 물리적으로 완벽한 동시 일관성은 불가능하다. 노드 간 데이터 복제에는 반드시 지연(replication lag)이 발생하기 때문이다. 여기서 말하는 일관성이란, 그 지연이 체감할 수 없을 정도로 짧아서 모든 노드가 사실상 같은 데이터를 보는 상태를 의미한다.

Availability

모든 요청에 대해 항상 응답할 수 있는 상태를 의미한다.

노드에 장애가 발생하더라도 시스템은 계속해서 정상적으로 동작해야 한다. 즉, 일부 노드가 다운되어도 나머지 노드가 읽기/쓰기 요청을 정상적으로 처리할 수 있어야 한다.

Partition Tolerance

네트워크 단절 상황에서도 시스템이 정상적으로 동작할 수 있는 능력을 의미한다.

네트워크가 분할되어도 시스템은 계속해서 기능을 제공해야 한다.

Split-Brain 문제

네트워크 파티션이 발생하면 Split-Brain 현상이 나타날 수 있다. 예를 들어 5개의 노드가 {A, B}와 {C, D, E} 두 그룹으로 분리되었을 때, 각 그룹이 자신이 정상적인 주(Primary) 클러스터라고 판단하는 상황이다.

이 문제를 해결하기 위해 쿼럼(Quorum) 방식을 사용한다. 노드를 홀수 개로 구성하고, 과반수 이상의 동의가 있어야만 쓰기 작업을 허용하는 것이다. 위 예시에서 {C, D, E} 그룹(3/5)만 쓰기가 가능하고, {A, B} 그룹은 읽기 전용 혹은 불가용 상태가 된다.

P는 선택이 아니다

CAP 이론을 처음 접하면 “세 가지 중 두 가지를 선택한다”고 이해하기 쉽다. CA, CP, AP 세 가지 조합이 가능한 것처럼 보이기 때문이다.

하지만 이는 오해이다. 네트워크 파티션은 분산 시스템에서 반드시 발생하는 현상이기 때문에, P를 포기하는 것은 현실적으로 불가능하다.

네트워크 장비의 고장, 데이터센터 간 연결 끊김, 클라우드 리전 간 통신 장애 등은 언제든 발생할 수 있다. 분산 시스템을 운영하는 이상, P는 기본 전제이다.

따라서 실질적인 선택은 네트워크 파티션이 발생했을 때 일관성(C)을 우선할 것인가, 가용성(A)을 우선할 것인가이다.

Use Case

실제 사례를 통해 CP와 AP 선택이 어떻게 이루어지는지 살펴보자.

CP — MongoDB

MongoDB는 기본적으로 Single-Primary 아키텍처를 사용한다. 하나의 Primary 노드만 쓰기 연산을 수행하고, Secondary 노드들은 Primary의 데이터를 복제한다.

네트워크 파티션이 발생하면, 과반수를 확보한 파티션에서 새로운 Primary를 선출한다. 소수 파티션의 노드들은 쓰기가 불가능해지므로 가용성을 희생하고 일관성을 보장하는 CP 전략이다.

금융 거래, 재고 관리 등 데이터 정합성이 최우선인 시스템에서 CP 전략이 적합하다. 잠시 서비스가 중단되더라도 잘못된 데이터가 반영되는 것이 더 큰 문제이기 때문이다.

AP — Blockchain

블록체인은 분산 원장 기술로, 거래 기록을 중앙 관리자 없이 여러 노드에 분산하여 저장한다.

블록체인 역시 네트워크 분할 허용성과 가용성을 우선시하는 AP 설계를 취하고 있다.

네트워크가 분할되었을 때도 각 분할된 네트워크가 독립적으로 블록을 생성하고 거래를 기록할 수 있다. 이 과정에서 일시적인 불일치가 발생하며, 고아블록(Orphan Block)이 생성되기도 한다.

블록체인은 합의 알고리즘을 통해 네트워크가 다시 연결되었을 때 일관성을 맞추는 방식으로 동작한다. 비트코인의 경우 작업 증명(Proof of Work)을 사용하여 가장 긴 체인을 인정하는 방식으로 최종적 일관성을 달성한다.