CAP 이론
기술노트
CAP 이론 (CAP Theorem)
CAP 이론은 분산 데이터 시스템이 동시에 보장할 수 있는 세 가지 속성, 즉 일관성(Consistency), 가용성(Availability), 분할 용납성(Partition Tolerance) 중에서 최대 두 가지만을 만족시킬 수 있다는 원칙입니다.
2000년에 에릭 브루어(Eric Brewer)에 의해 제기된 이 이론은, 여러 대의 서버(노드)로 구성된 분산 시스템을 설계할 때 반드시 고려해야 할 기본적인 제약 조건을 제시합니다. 특히, 네트워크 장애는 언제든 발생할 수 있다는 현실을 인정하고, 그 상황에서 시스템이 어떤 특성을 우선할지 선택해야 함을 알려주는 중요한 지침입니다.
CAP의 세 가지 속성
- 1. 일관성 (Consistency)
- 모든 노드가 동시에 같은 데이터를 보여주는 것을 의미합니다.
- 어떤 노드에 접속해서 데이터를 조회하더라도 항상 가장 최근에 쓰여진(committed) 데이터를 볼 수 있어야 합니다. 데이터의 일관성이 깨지면 안 되는 금융 시스템 등에서 매우 중요합니다.
- 2. 가용성 (Availability)
- 모든 요청에 대해 시스템이 항상 정상적인 응답을 주는 것을 의미합니다.
- 특정 노드에 장애가 발생하더라도, 다른 노드들은 계속해서 읽기 및 쓰기 요청을 처리할 수 있어야 합니다. 즉, 시스템이 다운되지 않고 항상 작동 가능한 상태를 유지하는 것을 목표로 합니다.
- 3. 분할 용납성 (Partition Tolerance)
- 노드 간의 네트워크 연결이 끊어지거나(네트워크 분할), 메시지가 유실되더라도 시스템 전체가 계속해서 동작하는 것을 의미합니다.
- 현대의 분산 시스템은 수많은 노드와 복잡한 네트워크로 연결되므로, 네트워크 분할은 피할 수 없는 문제입니다. 따라서 분산 시스템은 반드시 분할 용납성(P)을 가져야 합니다.
현실적인 선택: CP인가, AP인가?
분산 시스템은 반드시 분할 용납성(P)을 가져야 하므로, 네트워크 분할 상황이 발생했을 때 **일관성(C)과 가용성(A) 중 하나를 선택**하는 트레이드오프에 직면하게 됩니다.
- CP 시스템 (Consistency + Partition Tolerance)
- 네트워크 분할 시, 데이터의 일관성을 우선하기 위해 가용성을 희생하는 시스템입니다.
- **동작 방식:** 특정 노드에 쓰기 작업이 발생하면, 그 데이터가 다른 모든 노드에 복제될 때까지 기다립니다. 만약 네트워크 분할로 인해 일부 노드에 데이터가 복제되지 못하면, 데이터의 일관성을 해칠 수 있는 해당 노드에 대한 읽기/쓰기 요청을 거부하거나 에러를 반환합니다. 이로 인해 시스템의 일부는 일시적으로 "사용 불가능(unavailable)" 상태가 될 수 있습니다.
- **대표 시스템:** `MongoDB`, `Redis`, `HBase`, `Zookeeper`
- **적합한 경우:** 은행 계좌, 결제 시스템 등 데이터의 불일치가 절대로 허용되지 않는 서비스
- AP 시스템 (Availability + Partition Tolerance)
- 네트워크 분할 시, 가용성을 우선하기 위해 일관성을 일부 희생하는 시스템입니다.
- **동작 방식:** 네트워크 분할이 발생하더라도 모든 노드는 계속해서 읽기/쓰기 요청을 받습니다. 이로 인해 일부 노드는 아직 동기화되지 않은 낡은 데이터를 반환할 수 있습니다. 데이터는 네트워크가 복구된 후에 점진적으로 동기화되며, 이를 '결과적 일관성(Eventual Consistency)'이라고 부릅니다.
- **대표 시스템:** `Cassandra`, `Amazon DynamoDB`, `CouchDB`
- **적합한 경우:** 소셜 미디어 피드, 실시간 검색 등 일시적인 데이터 불일치가 큰 문제가 되지 않으며, 항상 서비스가 제공되는 것이 더 중요한 경우
결론적으로, CAP 이론은 "완벽한 분산 시스템은 없다"는 것을 알려줍니다. 개발자는 서비스의 특성을 정확히 파악하고, CAP 이론에 근거하여 일관성과 가용성 사이에서 현명한 트레이드오프를 선택해야 합니다.