...
S3 데이터 일관성 모델 (Data Consistency Model)
데이터 일관성이란, 같은 시간에 조회하는 데이터는 항상 동일한 데이터임을 보증하는 것을 말한다.
만일에 내가 S3에 파일을 넣자마자(0.01초 간격으로) 바로 파일을 조회해 보았다고 가정하자.
S3도 프로그램이니 파일을 업로드하는 시간(0.1초 라고 가정하자)이 걸린다.
그러면 내가 조회한 결과는 빈 데이터가 된다. 분명 나는 파일을 넣는 동작을 분명히 했는데도 말이다.
이것이 "데이터 일관성을 갖지 않는다"를 말하는 것이다.
즉, 최신의 내용으로 변경한 내용이 즉각적으로 반영되지 않거나, 업데이트 직후 데이터를 읽으려 할 때 변경된 내용을 확인할 수 없게 될 가능성이 있는 것이다.
반대로 내가 행한 동작에 대해 반드시 결과를 내줘야(보증) 하면 데이터 일관성을 가진 것이다.
S3에서는 PUT 동작(쓰기 후 읽기)에 대해서는 데이터 일관성을 보장해준다.
파일을 올리고 성공한(200) 즉시 읽기 가능하다.
다만 같은 키에서 동시에 여러사람이 PUT요청을 한다면, 먼저 put한 요청이 우선권을 갖고 순차적으로 행하게 된다.
즉, 동일 파일에 대해서 동시다발적으로 요청이 오는 경우 최종 타임스템프를 지닌 요청 제일 나중에 온 요청을 따르게 된다.
그러나 문제는 Update / Delete 동작이다.
Update / Delete는 데이터 일관성을 보장해 주지 않는다.
파일을 삭제하거나 업데이트 하면, 일정 시간 후에 결과가 반영 되게된다. (그래봣자 1초 미만)
그래서 내가 파일을 업데이트 했을때 바로 누가 읽게되면 그 파일이 업데이트가 안되있는 상태일 수도 있다.
예를 들어 서울 서버에 있는 S3에 파일을 업데이트 했다. 같은 서울권에 있는 사람이 파일을 읽으면 문제없이 일관성을 보장받을수 있겠지만 상대적으로 거리가 먼 부산 사람이 파일을 읽으면 업데이트가 안된 구버젼 파일이 읽혀 버릴수 있게된다.
이를 원자성 확보 불가능이라고 말한다.
원자성: 트랜잭션과 관련된 일은 모두 실행되던지 모두 실행되지 않도록 하던지를 보장하는 특성
S3 일관성 모델
일관성 모델 관련하여 다음과 같은 예시가 있다.
Read after Write (데이터 일관성 보장)
- S3에서 객체 X를 create한 뒤, 즉시 읽기(get)를 시도해보자.
→ 변경 사항이 이루어지고나서 객체 X를 반환한다.
Eventually Consistent (최종 일관성. 데이터 일관성 보장 안함)
- S3에서 객체 X를 create한뒤 기존의 객체를 대체(overwrite)한 뒤, 즉시 읽기(get)를 시도해보자.
→ Old 데이터를 반환할수도 New 데이터를 반환할수도 있다. - S3에서 객체 X를 create한 뒤 기존의 객체를 삭제(delete)한 뒤, 즉시 읽기(get)를 시도해보자.
→ 삭제가 정상적으로 되서 error를 주거나, 삭제 동작을 했는데도 파일이 그대로 읽혀올수도 있다.
데이터 일관성과 최종 일관성은 데이터베이스에서 자주 등장하는 용어이다.
RDB(관계형 데이터베이스)는 동시성이라고 해서 같은 시간에 조회하는 데이터는 항상 동일한 데이터임을 보증하는걸 기본으로 한다.
그런데 NoSQL이 쓰이게 되면서 동시성을 더 이상 보장하기가 힘들어졌다.
NoSQL은 분산 노드를 이용하여 그냥 무조건 빠른 데이터 처리가 주목적이기 때문이다.
그래서 데이터 변경이 발생했을 때, 시간이 지남에 따라 여러 노드에 전파되면서 당장은 아니지만 최종적으로 일관성이 유지되는 것을 최종 일관성(Eventual Consistency)이라고 한다.
결국은 동시성을 제공하지 않고 결과적으로 일관성을 갖는 다는 의미이다.
그러므로 UPDATE 및 DELETE에 대한 최종 일관성을 가지는 S3는 객체를 처음 생성 후 가져올 시에는 일관성 있는 데이터를 제공하나, 삭제 후 가져올 시에는 일관성 없는 결과를 리턴할 수 있다는 특징을 가지게 되는 것이다.
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.