프로그래밍공부(Programming Study)/데이터베이스(Database)

CAP 정리: 일관성, 가용성, 분할내성의 상충관계 완벽 정리

Chann._.y 2024. 12. 4. 23:13
728x90

1. CAP 정리란?

CAP 정리는 분산 시스템에서 Consistency(일관성), Availability(가용성), Partition Tolerance(분할내성)의 세 가지 특성을 동시에 완벽히 만족할 수 없다는 이론이다. 이는 Eric Brewer가 2000년에 주장하였으며, 이후 2002년 ACM 논문에서 증명되었다.

  • 일관성 (Consistency): 모든 노드가 동일한 데이터를 동시에 볼 수 있는 상태.
  • 가용성 (Availability): 모든 요청이 항상 성공적으로 응답을 받을 수 있는 상태.
  • 분할내성 (Partition Tolerance): 네트워크 단절 상황에서도 시스템이 동작할 수 있는 상태.

CAP 정리는 분산 시스템 설계 시 세 가지 특성 중 두 가지를 우선시해야 한다는 트레이드오프를 설명한다.


2. CAP 정리의 특징

  • Consistency는 데이터의 정확성과 신뢰성을 보장한다.
  • Availability는 시스템이 항상 작동할 것을 약속한다.
  • Partition Tolerance는 네트워크 단절이 발생해도 시스템이 살아남을 수 있도록 보장한다.

CAP 정리가 제시하는 핵심은 네트워크 분할(Partition) 상황에서, 일관성과 가용성 중 하나를 희생해야 한다는 것이다.


3. CAP 정리의 상충관계

CAP 정리에서의 상충 관계를 구체적으로 이해하기 위해, 각 조합을 살펴보자.

  1. CA (Consistency + Availability)
    • 네트워크 분할이 없을 때 가능.
    • 분할내성을 포기하여 네트워크 문제가 발생하면 시스템이 중단될 수 있음.
    • 사례: 관계형 데이터베이스(RDBMS).
  2. CP (Consistency + Partition Tolerance)
    • 네트워크 분할 상황에서도 데이터를 일관되게 유지하지만 가용성을 일부 희생.
    • 사례: HBase, MongoDB.
  3. AP (Availability + Partition Tolerance)
    • 네트워크 분할 상황에서도 가용성을 유지하지만 데이터 일관성을 희생.
    • 사례: Cassandra, DynamoDB.

4. CAP 정리의 실제 사례

1) CP 시스템 예제 (MongoDB)
MongoDB는 네트워크 분할 상황에서 일관성을 유지한다. 하지만 가용성을 희생해 특정 요청이 실패할 수 있다.

2) AP 시스템 예제 (Cassandra)
Cassandra는 분할 상황에서 가용성을 우선시한다. 이로 인해 데이터 복제나 일관성이 느슨해질 수 있다.


5. CAP 정리의 한계

CAP 정리는 실용적인 설계에서는 세 가지 요소를 완전히 희생하지 않는 트레이드오프 접근법으로 발전했다. 특히 BASE 시스템(Basically Available, Soft state, Eventually consistent)은 완벽한 일관성을 요구하지 않는 **궁극적 일관성(Eventual Consistency)**으로 발전하며 이를 보완하고 있다.


6. Python으로 간단히 구현한 예제: CP vs AP

import time
from threading import Thread

class DistributedSystem:
    def __init__(self):
        self.data = {"key": "value"}
        self.partitioned = False

    def write_data(self, key, value):
        if self.partitioned:
            print("Network partition: Write delayed")
            return False
        self.data[key] = value
        return True

    def read_data(self, key):
        if key in self.data:
            return self.data[key]
        return None

# CP 시스템 시뮬레이션
def simulate_cp():
    system = DistributedSystem()
    system.partitioned = True  # 네트워크 단절
    print("CP System: Writing...")
    system.write_data("key", "new_value")  # 쓰기 실패
    print("CP System: Read data:", system.read_data("key"))  # 기존 데이터 유지

# AP 시스템 시뮬레이션
def simulate_ap():
    system = DistributedSystem()
    system.partitioned = True  # 네트워크 단절
    print("AP System: Writing...")
    system.data["key"] = "new_value"  # 데이터 손상 위험
    print("AP System: Read data:", system.read_data("key"))  # 변경된 데이터 반환

print("Simulating CP System:")
simulate_cp()
print("\nSimulating AP System:")
simulate_ap()
728x90