CAP 이론이란?
CAP 정리에 의하면 데이터베이스 시스템은 일관성(Consistency), 가용성(Availablity), 분단 허용성(Partition torlerance) 세 가지 속성중에서, 두 가지만 가질 수 있고 3가지 모두를 충족할 수는 없다는 이론이다. Consistency, Availablity를 합치면, CA 또는 Consistency와 Partition tolerance를 조합하면 AP가 된다.
CAP에 대해 설명하기 앞서 용어에 대해 정리하자면, 분산 데이터베이스는 데이터를 여러 대의 노드에 저장한다. 노드란 데이터베이스 인스턴스를 구동하는 물리적인 서버이고, 각 노드는 다른 노드와 서로 통신한다.
일관성(Consistency)
- 일관성은 데이터를 저장하는 장비가 1대든 100대든 모든 장비에서 동일한 데이터가 저장되어 있어야 한다는 것이다.
- ACID 원리에서 의미하는 Consistency와 같다.
가용성(Availablity)
- 가용성은 모든 요청이 응답을 받을 수 있어야 한다는 것을 의미한다. 사용자가 읽기 작업을 하든 쓰기 작업을 하든, 심지어 작업이 실패했더라도 사용자는 응답을 받을 수 있어야 한다.
- 즉, 시스템이 중단되는 일 없이 언제든지 사용 가능한 상태여야 한다.
- 가용성은 사용자가 데이터가 일관되지 않더라도 언제든지 접근할 수 있다는 것을 의미한다.
- 현재 시스템에 문제가 있어서 읽을 수 없다고 보내면 가용성이 보장되지 않는 것을 뜻한다.
분할 허용성(Partition tolerance)
- 분할이란 노드 간 통신이 끊어지는 것을 의미한다. 즉, 한 노드가 다른 노드와 통신할 수 없을 때 분할이 생겼다고 한다.
- 분할 허용성은 노드가 여러 대 동작하고 있을 때, 해당 노드 사이에 접속이 단절되어 서로 통신을 할 수 없는 상황에서도 사용자 요청에 응답할 수 있어야 한다.
- 이는 데이터의 복제본을 여러 다른 노드에 저장하여 처리하는 것을 의미한다. 따라서 분할이 생기더라도 복제본으로부터 데이터를 조회할 수 있다.
- 분할 허용성은 분산 데이터베이스 시스템에서 필수적이다.
예시
관계형 데이터베이스 : CA 시스템
- 일관성(C)와 가용성(A)를 보장하되, 분단 허용성(P)는 보장하지 않는다.
- 관계형 데이터베이스가 동시에 다량의 서버를 운용하는 클러스터링에 적합하지 않는 이유가 여기에 있다. 만약 10대의 서버중에서 한 서버의 접속이 끊어졌다고 가정을 하면, 분단 허용성을 지원하지 않으므로 이는 수용할 수 있지만 끊어진 서버 때문에 일관성과 가용성이 훼손되므로 아예 1번 부터 10번까지 모든 서버를 중단시켜서 어떤 클라이언트도 서버와 접속할 수 없어야한다. 일반적으로 불가능한 방법이다.
NoSQL 데이터베이스 : CP나 AP 시스템
- 대용량의 분산 시스템을 구축하는데에는 CP보다도 AP가 알맞다.
- C가 들어가서 강력한 일관성 즉, ACID 트랜잭션을 지원한다고 가정하면 예를 들어 하나의 쓰기 작업을 수행한다고 가정할 때 2대가 정상 응답할 때까지 LOCK이 걸리겠지만 100대라면 너무 긴 시간동안 LOCK이 걸리게 된다.
MongoDB : CP 시스템
MongoDB는 데이터를 하나 혹은 여러 개의 프라이머리 노드에 이진 JSON 형태로 저장한다.
각 프라이머리 노드는 로그를 이용해 비동기적으로 업데이트되는 복제본을 가진 여러 개의 세컨더리 노드를 가진다. 각 노드는 다른 모든 노드와 통신하여 서로의 상태를 확인한다.
만약 몇 초동안 응답을 받지 못하면 해당 노드는 접근 불가능한 상태로 지정된다. 프라이머리 노드가 중단되었다면 세컨더리 노드 중 하나가 프라이머리 노드로 승격되어야 한다. 새로운 프라이머리 노드가 선출되는 동안 시스템은 모든 쓰기 작업이 잠시 사용 불가능(unavailable)한 상태가 된다. (가용성 불가능)
따라서 MongoDB는 CP시스템으로 분류된다.
Cassandra : AP 시스템
Cassandra는 Peer-to-Peer 시스템이다.
즉, 프라이머리 노드 없이 모든 노드가 읽기 작업과 쓰기 작업을 수행할 수 있고, 복제본을 분리된 다른 노드에 저장한다. 지정된 복제 수만큼 데이터를 시계 방향으로 인접한 노드에 복제한다.
한 노드가 통신에서 끊어졌다면, 여전히 읽기 쓰기 작업은 수행할 수 있으나 데이터가 다른 노드와 맞지 않는 상태, 즉 일관성이 깨진 상태가 된다. Cassandra는 이를 최종적 일관성(Eventual Consistency)를 통해 추후에 복구한다. 모든 노드 간 데이터가 동기화되기 전까지 각 노드는 서로 다른 버전의 데이터를 가지고 있다.
따라서 Cassandra는 일관성을 포기한 대신 높은 가용성을 확보한 AP시스템으로 분류된다.
출처
- https://dongwooklee96.github.io/post/2021/03/26/cap-이론이란/
- https://onduway.tistory.com/106