[Database] - CAP + 서비스를 잘 설계하려면
이미지가 좀 이상하긴 하지만.. 이론상 CAP 를 100% 충족시키지 못한다.
CPA 에는 일관성, 가용성, 파티션 허용성이라는 세 가지 속성 중 두 가지만 보장할 수 있다.
일관성 (Consistency)
모든 노드가 동일한 시점에 동일한 데이터를 볼 수 있도록 보장
어떤 데이터에 대한 쓰기가 완료되면, 그 이후에 해당 데이터에 접근하는 모든 클라이언트는 최신 정보를 보게 된다.
가용성 (Availability)
클라이언트의 요청(R/W)에 대해 항상 응답을 받을 수 있도록 보장
시스템의 일부 노드에 문제가 생기더라도, 남은 노드들이 계속해서 요청에 응답할 수 있어야 하며, 클라이언트는 항상 응답을 받을 수 있어야 합니다. 단, 그 응답이 최신 상태인지(일관성)는 보장하지 않을 수 있다.
파티션 허용 (Partition Tolerance)
네트워크에 장애가 생겨 노드 간 통신이 단절되더라도 시스템이 동작을 멈추지 않고, 가능한 계속 서비스를 제공할 수 있는 특성
네트워크 파티션(분리)이 발생해도 시스템은 중단되지 않아야 하며, 분할된 상태에서도 일부 기능을 제공할 수 있어야 한다.
파티션이 복구되면 시스템은 일관된 상태로 복구되어야 한다.
데이터베이스에서 이 3가지를 모두 충족시킬수는 없지만, 서비스를 설계할 때 이를 100% 충족시키도록 하는게 매우 어렵고 가능한 충족하도록 설계하는게 고급 개발자라고 한다. 이것만 잘 해도 평생 먹고살 수 있다고..
일관성과 파티션 허용을 선택 (CP)
- A와 B는 서로 통신이 안 되니까, 데이터를 동기화할 수 없다.
- 이때는 일관성을 유지하려면, 쓰기 요청을 거부해야 한다.
- 즉, A에서 "지금은 데이터 정확성이 보장되지 않아서 요청을 받을 수 없다."라고 응답할 수 있다.
- 이건 가용성을 포기한거다.
가용성과 파티션 허용을 선택 (AP)
- A와 B가 서로 통신이 안 되더라도, 각자 자기 노드에서 읽기/쓰기를 허용한다.
- 이러면 데이터가 일시적으로 불일치할 수 있다.
- 이건 일관성을 포기한거다.
일관성과 가용성을 선택 (CA)
- 두 노드가 항상 최신 데이터로 응답하고, 모든 요청에 응답할 수 있어야 한다.
- 이러려면 Partition이 아예 발생하지 않는 전제가 있어야 가능하다.
- 즉, 현실적으로 네트워크 분할은 언제든 발생할 수 있기 때문에, 이 조합은 실현 불가에 가깝다.
그래서
때문에 100% 충족시키지 못하기에, 서비스는 특성에 따라 잘 선택해줘야 한다.
- 금융 시스템: 일관되고 가용성이 높음
- 채팅 애플리케이션: 일관성 및 파티션 허용
- 캐시: Redis — 일관성 및 파티션 허용
- 소셜 사이트(좋아요, 피드, 조회수와 같은 분석 메타데이터) - 사용 가능 및 파티션 허용
그래서 프로젝트의 특성 따라 비즈니스 니즈를 충족시킬 수 있도록 적절한 데이터베이스를 선택해야 한다.
데이터베이스는 ACID 원칙을 따르는 것과 BASE 원칙을 따르거나 BSAE 원칙이면서 일부 ACID 원칙을 차용한 데이터베이스가 있다.
ACID : MySQL, MariaDB, Oracle
BASE : MongoDB, Redis, Cassandra
BASE 이면서 일부 ACID 원칙을 차용한 : ClickHouse
이걸 잘 이용해서 서비스 특성에 맞춰 설계하고, 잘 분산해서 100% 를 보장할 수 있다면 좋다.....
그래서 이 글을 읽어보면 좋다.
https://www.linkedin.com/pulse/cap-choosing-right-distributed-databasenosql-your-somasundaram
The CAP on choosing the Right Distributed Database(NoSQL) for your application?
Amazon found that every 100 milliseconds of latency, costs them 1% in sales. The application users, customers, and website visitors make an instant judgement about the application and the business.
www.linkedin.com