
CAP란?
- 분산 데이터베이스는 방대한 데이터를 다루기 위해 필요한 시스템이다. 이는
Scale-out이 가능하기 때문에 트래픽이 증가하더라도 낮은 지연시간을 유지할 수 있고, 노드 장애에 적절히 대응할 수 있다.
- 이러한 분산 시스템에서 일관성(Consistency), 가용성(Availability), 분할 내성(Partition Tolerance)의 세 가지 특성을 동시에 모두 완벽하게 만족할 수 없다는 이론이다.

분산 데이터 베이스 시스템
- 분산 데이터베이스 시스템에서, 데이터 베이스를 사용하는 애플리케이션 관점에서 하나의 데이터베이스에 접속하는 것처럼 보인다.
- 하지만, 실제 분산 데이터베이스는 데이터를 여러 대의 노드에 저장한다. 그리고 각 노드는 서로 다른 노드와 서로 통신하며 DBMS를 유지한다.
- 애플리케이션 관점에서 보았을 때, 데이터는 분산 데이터베이스를 구성하는 임의의 노드에 써지며 정확히 어느 노드에 데이터가 쓰여졌는지 알 수 없다. 조회의 경우에도 마찬가지로 어디에 저장되어 있는지 알지 못한다. 마치 하나의 데이터베이스 인 것 처럼 사용하는 것이다.
- 이러한 시스템의 장점은 사용자 트래픽이 늘어남에도, 분산 데이터베이스 환경에 노드를 추가함으로써 쉽게
Scale-out이 가능하다는 점이다.
CAP 이론의 세 가지 특성
- 일관성(Consistency)
- 모든 노드에 데이터가
동시에 동일하게 반영되어야 한다는 것을 의미한다. 즉, 모든 어플리케이션은 시스템의 어느 노드에 접근하든 항상 동일한 데이터를 읽을 수 있어야 한다는 특징이다.
- 예를 들어, 어떤 데이터를 한 노드에서 수정했다면, 그 변경 사항이 즉시 모든 다른 노드에 반영되어야 하고, 클라이언트는 어느 노드에서든 일관된 최신 데이터를 볼 수 있어야 한다.
- 가용성(Availability)
- 시스템이
항상 응답할 수 있는 상태를 의미한다. 즉, 일부 노드에 장애가 발생하거나 네트워크에 문제가 있더라도, 여전히 요청에 대해 응답이 가능해야한다.
- 분할 내성(Partition Tolerance)
- 네트워크 단절이나 지연이 발생해도
시스템이 정상적으로 동작할 수 있는 특성을 말한다.
- 분산 시스템에서
네트워크 분할은 서로 다른 두 노드가 서로 연결되지 못하고 통신이 불가능해지는 상태를 의미한다.
데이터 베이스 유형
- CA 시스템 (일관성 + 가용성)
- CA 시스템은 모든 노드가 동일한 데이터를 제공하며 시스템은 항상 응답할 수 있다.
- 분산 시스템에서는 네트워크를 통해 노드끼리 통신하기 때문에, 분할을 피할 수 없다. 이론적으로 CA 분산 데이터베이스 시스템이 존재할 수 있지만, 실제로는 불가능하다.
- 그러나 `분할 내성이 손실`되면, 네트워크 장애 시 시스템이 제대로 동작하지 못하고 응답을 거부할 수 있으며, 네트워크 장애시 가용성을 일부 포기하는 방식으로 동작한다.
- 전통적인 RDBMS가 이에 해당한다.
- CP 시스템 (일관성 + 분할 내성)
- CP 시스템은 네트워크 분할이 발생해도 데이터의 일관성을 유지할 수 있지만, 일부 노드는 응답을 거부하여 가용성이 희생될 수 있다.
- 만약 두 노드 사이에 분할이 발생하면 시스템은 분할이 해결될 때까지 일관성이 없는 노드를 종료해야 한다. (즉 종료하는 것)
- MongoDB는 CP 데이터 저장소로, 일관성을 유지하면서 가용성을 저하시켜 네트워크 분할을 해결한다.
- AP 시스템 (가용성 + 분할 내성)
- AP 시스템은 가용성과 분할 내성을 우선한다. 네트워크 분할 상황에서도 시스템이 계속 응답할 수 있지만, 데이터 일관성은 일시적으로 깨질 수 있다.
- 이러한 시스템은 최종적 일관성(Eventually Consistancy)을 보장하며 시간이 지나면서 데이터가 데이터가 동기화 된다.
- Cassandra, DynamoDB 같은 DB가 대표적이다.
MongoDB (CP)

- 일관성(Consistency)
- MongoDB는 단일 마스터 시스템으로, 모든 쓰기 작업을 수신하는 프라이머리 노드가 하나만 존재한다.
- 보조 노드는 프라이머리 노드의 작업 로그를 복제하여 자신의 데이터 세트에 적용함으로써 데이터의 일관성을 유지한다.
- 프라이머리 노드가 중단되면, 최근 작업 로그를 가진 보조 노드가 새 프라이머리 노드로 선출되고, 클러스터는 다시 일관성을 유지하게 된다.
- 분할 내성(Partition Tolerance)
- 네트워크 분할이 발생하거나 프라이머리 노드가 접근 불가 상태가 되었을 때, 보조 노드 중 하나가 자동으로 프라이머리 노드로 승격된다.
- 이 과정에서 일시적으로 쓰기 작업은 불가능해지지만, 새로운 프라이머리 노드가 선출되면서 네트워크 분할 상황을 해결한다.
Cassandra (AP)

- 가용성(Availability)
- Cassandra는 모든 노드가 독립적으로 읽기와 쓰기 작업을 수행할 수 있는 Peer-to-peer 시스템이다.
- 노드 간의 특정 프라이머리가 없기 때문에, 특정 노드의 장애에도 불구하고 시스템 전체의 가용성이 유지된다.
- 데이터를 여러 노드에 복제하여, 하나의 노드가 실패하더라도 다른 노드가 요청을 처리할 수 있도록 설계되어 있다.
- 분할 내성(Partition Tolerance)
- 네트워크 분할 상태에서도 각 노드는 여전히 읽기 및 쓰기 작업을 수행할 수 있으며, 이는 시스템의 전반적인 내성을 높인다.
- 데이터의 일관성이 일시적으로 깨질 수 있지만, 네트워크가 복구되면 데이터를 동기화하여 최종적 일관성을 달성한다.
마무리
- CAP 이론을 통해서 애플리케이션마다 적합한 데이터베이스를 선택할 수 있다.
- 하지만 단순히 CAP이론을 이분법적으로 바라보는 것보다, 분산 데이터베이스 시스템에서 이러한 특징이 있으며 각 상황에서 알맞게 각각의 특징의 trade-off를 이해하고 적용하는 것이 더 중요하다고 생각한다.
- DBMS마다 적절히 각각의 비율을 조정할 수 있는 옵션도 제공하고 있으므로 열려있는 시각으로 필요에 맞게 적용하면 된다고 생각한다.