CAP Theorem : Consistency, Availability, Partition tolerance
이전에 소프트웨어 시스템의 성능을 향상시키는 방법은 하드웨어 성능을 올리거나(scale up) 구현 알고리즘을 수정하는 방향이였고 현재에 들어서는 수평적 확장의 방법(scale out)의 세번째 옵션을 선택할 수 있게 되었다.
2010년도에 들어서 글로벌 서비스와 클라우드화 복잡한 애플리케이션 요구사항에 따라 성능 요구가 증가함에 따라서 수평적 확장이 필요해졌고 현재에서 비지니스를 진행하게 위해서는 분산 환경이 필요로 하고 수평적 확장으로 가져온 성능 이점은 복잡성이라는 비용을 지불한다.
CAP Theorem은 분산 시스템에서 Consistency(일관성), Availability(가용성), Partition tolerance(파티션 인내) 이 세가지 특성 중 2가지 특성만 가질 수 있다고 말한다. 우선 각 세가지 특성에 대해 알아보자.
Consistency (일관성)
일관성은 어떤 노드에서든 모든 클라이언트가 동일한 데이터를 보도록 보장해야 한다.
Availability (가용성)
분산 시스템에서 노드가 몇개 죽는다고 서비스가 중지되지 않고 요청에 대한 유효 응답을 받을 수 있어야 한다.
Partition tolerance ((네트워크) 파티션 인내)
네트워크 분할(network partitioning)로 하위 시스템간의 통신 오류가 발생하더라도 시스템이 지속적으로 계속 동작할 수 있어야 한다.
* Network partitioning (네트워크 분할)은 분산 시스템에서 서로 다른 노드가 네트워크 문제로 연결 불가능한 상태로
물리 장비(라우터, 스위치 등), 네트워크 과부하, DDos 등 문제로 발생 가능.
분산 시스템에서는 CP 조합과 AP 조합 2가지가 있을 수 있다.
- CP - Consistency / Partition tolerance
- 일관성이 중요한 금융 시스템에서 사용
- MySQL(cluster), MongoDB, Redis, Zookeeper
- 데이터 일관성이 보장되어 신뢰성과 무결성 유지
- 가용성과 성능 저하가능
- AP - Availability / Partition tolerance
- 가용성이 중요한 SNS, 이커머스 등에서 사용
- Cassandra, DynamoDB
- 무중단과 높은 가용성을 제공
- 일시적으로 데이터 일관성이 없음 (최종적으로는 보장)
- CA - Consistency / Availability
- 네트워크 분할이 적고 데이터 일관성이 중요한 시스템에서 사용
- MySQL(replica), PostgreSQL
- 데이터 정확성과 신뢰성을 유지
- 분산 시스템 장점을 활용하기 어려움, 따라서 많이 선택되지 않음
CAP 관점에서 본 MySQL Replica 구성
Consistency
MySQL Replica 구성은 강한 일관성을 보장하지 않고 약한 일관성으로 Eventual consistency 를 보장한다. 네트워크 분할이 없는 상황에서 Master DB에서 수행된 데이터 변경사항이 Slave DB로 동기화 되는데 이 과정에서 실시간으로 데이터는 일관되지 않는다.
Availability
네트워크 분할이 없는 경우 높은 가용성을 제공한다. Slave DB로 읽기 작업을 분산 처리함으로 트래픽을 분산하고 애플리케이션단의 성능을 향상 시킬 수 있다. 하지만 네트워크 분할이 발생한다면 데이터 일관성은 깨질 위험을 가지고 있다.
Partition tolerance
MySQL Replica 구성은 네트워크 분할 상황에서 데이터 일관성을 보장하지 않거나, 쓰기 작업을 중단하는 방식으로 동작한다.
CAP Theorem에 대해서 이해해야 하는 이유
CAP 이론(Consistency, Availability, Partition Tolerance)은 분산 시스템 설계를 이해하고, trade-off를 분석하며, 특정 애플리케이션의 요구사항에 맞는 아키텍처를 선택하는 데 중요한 개념입니다. 이를 이해해야 하는 이유는 현실적은 분산시스템의 한계를 이해하여 비지니스 요구사항에 맞는 적절한 아키텍쳐를 선택하고 결정하는 필수적인 기반을 제공한다.
출처
https://en.wikipedia.org/wiki/Network_partition
https://www.ibm.com/kr-ko/topics/cap-theorem