[데이터베이스] ACID와 CAP

데이터의 무결성과 일관성

  • 무결성 (integrity): 데이터가 올바른가, 데이터에 결점이 없는가
    • 동의어: 정확성(correctness), 완전성(completeness), 신뢰성(reliability), 유효성(validation)
    • 무결성 위반: 올바르지 않은(잘못된) 데이터가 저장됨
    • 무결성 위반 예
      • 숫자형 데이터에 문자열이 존재하는 경우
      • 중복을 허용하지 않는 데이터가 중복 저장된 경우
      • null 값을 허용허지 않는 데이터에 null 값이 존재하는 경우
    • 무결성 유지를 위한 방법
      • 올바른 데이터가 저장된 상태를 유지할 수 있도록 데이터 저장 및 변경 시 검증 과정을 거친다.
      • 데이터베이스가 제공하는 네 가지 무결성 제약조건을 설정한다.
        • 도메인 제약조건: 데이터베이스가 지원하는 자료형을 사용하여 일치하는 유형의 데이터만 저장될 수 있도록 한다.
        • 엔티티 제약조건: 기본키를 사용하여 null 값을 가질 수 없는 데이터인 경우 null 값을 가질 수 없도록 한다.
        • 참조 무결성 제약조건: 외래키를 사용하여 참조하는 테이블이 참조되는 테이블의 기본키를 참조하도록 하여 올바른 데이터를 가질 수 있도록 한다.
        • 유니크 제약조건: 기본키 또는 유니크키를 사용하여 데이터가 중복되어 저장될 수 없도록 한다.
  • 일관성 (consistency): 데이터가 서로 일치하는 가
    • 동의어: 정합성
    • 정합성 위반: 데이터가 서로 일치하지 읺음
    • 정합성 위반 예: 동일한 데이터가 서로 다른 테이블에 분산되어 존재하는 경우 하나의 테이블의 데이터만 변경 사항을 적용하고 다른 테이블의 데이터는 그대로 유지할 때 데이터 일관성을 위반한다.
    • 일관성 유지를 위한 방법: 데이터베이스가 제공하는 외래키 제약조건을 통해 테이블 간 관계를 설정함으로써 두 테이블에 동일한 데이터가 저장될 수 있도록 한다.


트랜잭션 ACID 특성

ACID란 데이터베이스의 트랜잭션이 안전하게 수행되는 것을 보장하기 위해 트랜잭션이 가져야 하는 네 가지 특성을 말한다.

  • 원자성 (atomicity): 트랜잭션의 작업들은 모두 성공하거나 모두 실패해야 한다. 작업이 성공적으로 수행되다가 하나의 작업이 실패하면 이전의 성공된 작업은 모두 취소되어야 한다. 작업의 일부만 성공하거나 일부만 실패해서는 안 된다.
  • 일관성 (consistency): 트랜잭션이 성공한 이후에 데이터베이스는 유효한 상태를 유지해야 한다. 유효한 상태란 데이터베이스에 정의된 규칙(데이터 타입, NULL 가능 여부, 기타 제약조건 등)를 위반하지 않는 상태를 말한다. 트랜잭션이 수행되기 전에 데이터베이스가 유효한 상태였다면 트랜잭션의 수행이 완료된 후 데이터베이스는 또 다른 유효한 상태가 되어야 한다. 즉, 데이터베이스는 트랜잭션 수행 전후 유효한 상태를 일관성 있게 항상 유지해야 한다. 데이터베이스의 일관성을 유지하기 위해 이를 위반하는 트랜잭션은 항상 실패되어야 한다.
  • 격리 (isolation): 트랜잭션은 다른 트랜잭션의 진행 사항에 대해 알 수 없어야 한다. 한 트랜잭션의 작업이 다른 트랜잭션의 작업을 방해하지 않아야 한다. 격리 수준은 성능에 영향을 준다. 격리 수준이 높을수록 성능이 낮아진다.
  • 내구성 (durability): 성공적으로 완료된 트랜잭션의 작업 결과는 어떠한 시스템 실패에도 손실되지 않고 영구적으로 유지되어야 한다.


CAP 이론

CAP 이론이란 데이터를 분산하여 저장하는 분산 시스템(distributed system)은 특정 시간에 다음 세 가지 특성 중 최대 두 가지 특성을 제공하는 것이 보장된다는 이론이다. CAP 이론은 분산 시스템에 대한 것이므로 네트워크 분할(network partition)이라는 개념을 포함한다. 분산 시스템이란 데이터를 여러 데이터베이스 노드에 분할 또는 복제하여 저장하는 시스템이다. 이때 서로 다른 노드는 서로 네트워크 통신을 할 수 있다. 네트워크 분할이란 분산 시스템에서 서로 다른 노드 간 통신이 중단되는 것을 의미한다. 네트워크 분할의 원인은 노드의 하드웨어 또는 소프트웨어 장애, 네트워크 환경 문제 등 다양할 수 있다. CAP는 네트워크 분할이 발생할 수 있다는 전제하에 시스템의 일관성과 가용성 둘 중 어떤 특성을 선택할 것인가에 관한 것이다.

CAP 이론에서 다루는 세 가지 특성은 다음과 같다.

  • 일관성 (consistency): 모든 읽기 요청은 가장 최신 데이터(가장 최근에 커밋된 쓰기 작업이 완료한 데이터)를 동일하게 조회하거나 실패해야 하는 특성이다. 일관성이 높은 분산 시스템은 데이터의 동기화 일관성이 높은 분산 시스템은 모든 노드가 특정 시점에 모두 동일한 최신 데이터를 가지고 있다. 반면, 일관성이 낮은 분산 시스템은 노드 중 일부 노드는 이전 데이터를 가지고 있고, 일부 노드는 최신 데이터를 가지고 있다. 일관성이 유지되는 분산 시스템에서 네트워크 분할 상황이 발생하게 되면 일관성이 깨질 수도 있다.
  • 가용성 (availability): 장애가 없는 노드가 수신한 모든 요청은 반드시 응답으로 이어져야 하는 특성이다. 가용성은 요청에 대해 항상 응답할 수 있는 능력을 의미한다. 이때, 노드의 응답은 반드시 가장 최신의 데이터일 필요는 없다. 가용성이 유지되는 분산 시스템에서 네트워크 분할 상황이 발생하게 되면 가용성이 깨질 수도 있다.
  • 분할 허용성 (partition tolerance): 네트워크 분할이 발생하더라도 분산 시스템이 계속 동작하여 요청을 처리할 수 있는 특성이다. 일부 노드에 간헐적이거나 일시적인 장애 또는 영구적인 장애가 발생하더라도 분산 시스템 전체가 계속 동작해야 한다.


분산 시스템에서 네트워크 분할은 불가피하므로 이를 허용하면서 요구 사항을 만족하는 시스템 설계가 필요하다. CAP 이론에 따라 분산 시스템은 특정 시간에 세 가지 속성 중 두 가지 속성을 만족하는 것이 보장된다. 네트워크 분할이 발생하지 않는 경우 시스템은 일관성과 가용성 모두를 만족할 수 있지만, 네트워크 분할 발생 시에는 일관성과 가용성 중 하나를 선택해야 한다.

분산 시스템에서는 새로운 데이터의 쓰기 작업이 수행되면 모든 노드에 데이터를 동기화하는 과정이 일어난다. 이때, 데이터의 동기화 처리 방법(동기 또는 비동기)에 따라 데이터 일관성, 가용성의 수준이 달라지게 된다.

가용성 보다 일관성이 중요한 시스템에서는 네트워크 분할로 인해 데이터가 최신 상태임을 보장할 수 없는 경우 요청에 대한 응답은 성공적으로 처리되는 대신 오류로 곧바로 처리되거나 또는 타임아웃 처리되어야 한다. 일관성을 보장하기 위해 가용성을 희생한다. 레플리케이션 구성에서 작업에 따른 일관성을 유지하기 위한 시스템의 동작은 다음과 같다.

  • 쓰기 작업: 마스터 노드에 쓰기 작업 요청이 들어온 경우, 네트워크 분할로 인해 마스터 노드가 모든 슬레이브 노드와 통신하여 데이터를 동기화할 수 없다면 쓰기 작업은 실패되어야 한다. 마스터 노드는 클라이언트에게 곧바로 실패 응답을 전송하거나, 데이터 동기화 작업이 완료될 때까지 작업을 블로킹하여 클라이언트가 타임아웃 처리를 할 수 있도록 한다.
  • 읽기 작업: 슬레이브 노드 중 하나에 읽기 작업 요청이 들어온 경우, 네트워크 분할로 인해 마스터 노드의 최신 데이터가 해당 슬레이브 노드에 동기화되지 않은 상태이라면 읽기 작업은 실패되어야 한다. 슬레이브 노드는 클라이언트에게 곧바로 실패 응답을 전송하거나, 데이터 동기화 작업이 완료될 때까지 작업을 블로킹하여 클라이언트가 타임아웃 처리를 할 수 있도록 한다.


일관성 보다 가용성이 중요한 시스템에서는 네트워크 분할로 인해 데이터가 최신 상태임을 보장할 수 없더라도 모든 요청에 대한 응답이 성공적으로 처리되어야 한다. 가용성을 보장하기 위해 일관성을 희생한다. 레플리케이션 구성에서 작업에 따른 가용성을 유지하기 위한 시스템의 동작은 다음과 같다.

  • 쓰기 작업: 마스터 노드에 쓰기 작업 요청이 들어온 경우, 네트워크 분할로 인해 마스터 노드가 모든 슬레이브 노드와 통신하여 데이터를 동기화할 수 없더라도 쓰기 작업은 성공적으로 처리되어야 한다. 마스터 노드는 다른 슬레이브 노드의 데이터 동기화 성공 여부에 관계 없이, 자신의 데이터 쓰기 작업을 완료한 후 클라이언트에게 성공 응답을 전송한다.
  • 읽기 작업: 슬레이브 노드 중 하나에 읽기 작업 요청이 들어온 경우, 네트워크 분할로 인해 마스터 노드의 최신 데이터가 해당 슬레이브 노드에 동기화되지 않은 상태이더라도 읽기 작업은 성공적으로 처리되어야 한다. 슬레이브 노드는 데이터 동기화 작업이 완료될 때까지 작업을 블로킹하지 않으며 이전 데이터를 곧바로 응답한다.


CAP 이론에서 일관성 개념은 ACID 특성의 일관성 개념과 다르다. ACID 특성에서 일관성은 단일 데이터베이스의 유효한 상태 유지에 대한 것이며, CAP 이론에서 일관성은 분산 시스템에서 분산된 노드 간 데이터 동기화 수준에 대한 것이다.

CAP 이론에서 가용성 개념은 소프트웨어 아키텍처의 가용성 개념과 다르다. 소프트웨어 아키텍처에서 가용성 개념은 시스템이 얼마나 오랫동안 문제 없이 정상적으로 동작하는가에 대한 것이며, CAP 이론에서 가용성은 분산 시스템에서 네트워크 분할이라는 특정 상황이 발생했을 때 데이터가 최신 데이터인지에 관계 없이 요청이 정상적으로 처리되는가에 대한 것이다.


참고

Comments