프로그래밍공부(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 정리에서의 상충 관계를 구체적으로 이해하기 위해, 각 조합을 살펴보자.
- CA (Consistency + Availability)
- 네트워크 분할이 없을 때 가능.
- 분할내성을 포기하여 네트워크 문제가 발생하면 시스템이 중단될 수 있음.
- 사례: 관계형 데이터베이스(RDBMS).
- CP (Consistency + Partition Tolerance)
- 네트워크 분할 상황에서도 데이터를 일관되게 유지하지만 가용성을 일부 희생.
- 사례: HBase, MongoDB.
- 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