온라인강의

[udemy] 데이터 베이스 엔지니어링 - Consistency

콩콩(๓° ˘ °๓)♡ 2024. 7. 1. 16:35

Consistency

일관성이란, 실제로 디스크에 있는 것과 데이터 모델이 일치해야한다는 원칙입니다.

데이터가 디스크에서 일관성을 유지할 수 있지만, 

데이터의 읽기는 여러 인스턴스가 동기화되지 않아 일관성이 없어질 수 있습니다.

 

참조무결성에 의한 불일치가 발생할 수 있습니다.

예를 들어, 다음과 같은 데이터베이스가 있습니다.

PICTURE_ID  (PK) BLOB LIKES
1 xx 5
2 xx 1
USER (PK) PICTURE_ID (PK) (FK)
Jon 1
Edmond 1
Jon 2
Edmond 4

 

1번 사진에 대한 좋아요는 5개이지만, 실제 2명의 유저만 좋아요를 누른 상태입니다.

이는 좋아요를 눌렀다 취소하는 이벤트를 LIKES에 반영하지 않아 일관성이 깨진 경우입니다.

 

또한, Edmond는 4번 사진에 좋아요를 누른 기록이 있지만, 사진 테이블에는 4번 사진이 없습니다.

이는 사진 삭제 이벤트에 대해 좋아요 기록을 삭제하지 않아 일관성이 깨진 경우입니다.

 

다음은 일관되지 않은 읽기 불일치가 발생하는 경우입니다.

  -> 작업자 db 1
원본 db -> 작업자 db 2
  -> 작업자 db 3

 

하나의 원본db를 복제하여 사용하는 작업자 db가 있다고 가정합니다.

원본 db의 변경사항이 작업자 db에 반영되는 사이에 발생할 수 있는 읽기 불일치입니다.

 

대부분의 데이터베이스는 이러한 불일치로부터 최종 일관성을 통해 회복됩니다.

즉, 동기화 복제를 강제하여 복제 프로세스가 완료되면, 결과적으로 그 읽기로부터 최종 결과를 얻게 할 수 있습니다.

이는 느리지만 강한 일관성을 제공하며, 비동기 복제는 약한 일관성을 제공합니다.

 

실제의 사례를 살펴보자면 AWS S3와 RDB를 비교해볼 수 있습니다.

 

AWS S3 데이터 일관성 모델의 특징을 보면 
"Amazon S3은 모든 리전의 S3 버킷에 있는 새 객체의 PUT에 대해 한 가지 주의 사항을 제시함으로써 읽기 후 쓰기 일관성을 제공합니다. 주의할 점은 객체를 만들기 전에 (객체가 있는지 찾기 위해) 키 이름에 HEAD 또는 GET 요청을 하는 경우 Amazon S3가 읽기 후 쓰기에 대한 최종 일관성을 제공하는 것입니다.
Amazon S3은 모든 리전의 덮어쓰기 PUT 및 DELETE에 대한 최종 일관성을 제공합니다."
라고 설명하고 있습니다.

여기에서 최종 일관성은 일관성이 어떻게 된다는 것일까요?


기존의 RDB(관계형 데이터베이스)는 동시성이라고 해서 같은 시간에 조회하는 데이터는 항상 동일한 데이터임을 보증하는걸 기본으로 합니다.
그런데 NoSQL이 쓰이게 되면서 동시성을 더 이상 보장하기가 힘들어지게 됩니다. NoSQL은 분산 노드를 이용하여 빅데이터에 대해 빠른 데이터 처리가 주 목적이기 때문입니다.

그래서 데이터 변경이 발생했을때, 시간이 지남에 따라 여러 노드에 전파되면서 당장은 아니지만 최종적으로 일관성이 유지되는 것을 최종 일관성이라고 합니다.
결국은  동시성을 제공하지 않고 결과적으로 일관성을 가지게 된다는것입니다.

그러므로 덮어쓰기 PUT 및 DELETE에 대한 최종일관성을 가지는 S3는 객체를 처음 생성 후 가져올 시에는 일관성 있는 데이터를 제공하나, 삭제 후 가져올시에는 일관성 없는 결과를 리턴할 수 있다는 특징을 가집니다.