CAP 이론
- 시스템은 일관성(Consistency), 가용성(Availability), 분단 허용성(Partition tolerance) 중 두 가지만 가질 수 있다는 이론
- 위의 그림처럼 C+A , C+P, A+P의 조합만 가능하지, C+A+P 모두를 만족하는 시스템은 존재할 수 없음
Consistency
- 데이터를 저장하는 장비가 많든 적든 모든 장비에서 동일한 데이터가 저장되어 있어야 한다는 것
- DB 속성에 Consistency가 있다면, 트랜잭션 기능 혹은 그에 준하는 매커니즘이 존재한다
Availability
- 죽지 않은 상태의 모든 서버는 클라이언트에게 항상 정상 처리 응답을 보내주여야 한다는 것
- 현재 시스템에 문제가 있어서 읽을 수 없다고 보내면 가용성이 보장되지 않는 것
Partition Tolerance
- 클러스터가 여러 대 동작하고 있을 때, 해당 클러스터 사이에 접속이 단절되어 서로 통신을 할 수 없는 상황에서도 시스템이 잘 동작해야 한다
- 관계형 DB는 CA 시스템, NoSQL은 CP나 AP 시스템
- DBMS성능은 초당 트랜잭션 실행 수(TPS)로 측정함
데이터베이스는 ACID라는 네 개의 원칙을 준수해야 함
ACID 트랜잭션
- 원자성(Atomicity)
- 트랜잭션과 관련되 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 것
- 중간단계까지만 실행되고 실패하는 일이 없도록 보장해야 한다
- 처리 중인 트랜잭션에서 오류가 발생했을 때에 현재의 처리 중인 내용을 취소하고 트랜잭션 실행 시 임시 영역에 저장해 두었던 이전의 상태를 다시 불러와서 rollback
- 일관성(Consistency)
- 트랜잭션의 실행이 성공적으로 완료되면 데이터베이스를 항상 일관성있게 유지해야 한다.
- 무결성(DB의 데이터 값과 현실 세계의 실제값이 일치해야 한다라는 정황성을 가지는 조건) 제약이 있다면 이를 위반하는 트랜잭션은 모두 중단되어야 한다
- 트랜잭션 실행 시 미리 정의된 트리거를 통해 한 쪽 DB의 수정이 발생했을 때 다른 DB도 함께 수정될 수 있도록 하여 일관성 보장
- 독립성 or 고립성(Isolation)
- 트랜잭션 중 다른 연산 작업이 중간에 끼어들어 기존 트랜잭션의 작업에 영향을 주지 못하도록 독립성을 보존하는 것
- 기존 트랜잭션이 완료되고 나서 추가 쿼리를 실행할 수 있도록 트랜잭션 처리는 순차적이어야 함
- 트랜잭션 중 해당 영역에 lock을 걸고 unlock하는 방법.
- lock & unlock은 deadlock 발생 위험이 있음.
- 지속성(Durability)
- 성공적인 트랜잭션은 요청된 작업의 내용이 데이터베이스에 영원히 반영되어야 함
- 시스템 문제나 데이터 일치 작업을 수행해도 내용은 기존과 같이 유지되어야 함
- 모든 트랜잭션은 로그로 남겨져 시스템 장애 발생 전 상태로 되돌릴 수 있어야 함
Eventual Consistency VS Strong Consistency
Eventual Consistency
- NoSQL의 특성
- 항목이 새롭게 업데이트되지 않는다는 전제 하에 항목의 모든 읽기 작업이 최종적으로는 마지막으로 업데이트된 값을 반환한다는 것을 이론적으로 보장
- 복제본을 읽는 것은 언제든 가능하지만 일부 복제본은 특정 시점에 상위 노드에 쓰여진 값과 일치하지 않을 수 있음
- 오래된 데이터를 가져올 가능성이 있음에도 사용하는 이유는 '가용성'때문. ex) 소셜 미디어
Strong Consistency
- 즉각적 일관성
- 업데이트 즉시 조회된 데이터는 항목을 보는 모든 사용자에게 일관성 있게 표시된다
- 관계형 데이터베이스가 이 개념을 토대로 설계됨
- strong consistency를 얻기 위해서는 개발자가 애플리케이션의 확장성과 성능을 어느정도 포기해야 함
- 업데이트 또는 복제 프로세스 도중에는 데이터를 lock하여 다른 프로세스에서 동일한 데이터를 업데이트하지 않도록 해야 함
Reference
- https://dongwooklee96.github.io/post/2021/03/26/cap-이론이란/
- https://velog.io/@soongjamm/Eventual-Consistency-란
- https://www.stevenjlee.net/2020/06/26/이해하기-데이터베이스-트랜잭션의-기본-속성-acid-그/
- https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore?hl=ko
'Cloud Architecture' 카테고리의 다른 글
Service Mesh (0) | 2022.06.17 |
---|---|
L4와 L7 (0) | 2022.06.16 |
Proxy / Forward Proxy / Reverse Proxy (0) | 2022.06.15 |
TCP, UDP, TCP Window Size (0) | 2022.06.15 |
SAGA 패턴 (0) | 2022.06.14 |