일관정 (consistency)

jinwook han·2021년 11월 28일
0

데이터 시스템

목록 보기
4/7
post-thumbnail

데이터 중심 어플리케이션 설계 9장을 정리했습니다.
책을 기반으로 글을 썼지만, 임의의 추가 정보나 저의 주관적인 해석이 추가될 수 있습니다.
느낀 점은 책 저자의 견해가 아니라 저의 견해입니다.


9장에서는 분산 환경에서 일어날 수 있는 문제와, 그 문제를 해결하는 방법에 대해서 다룬다.
분산 환경에서는 일관성(consistency)를 보장하는 게 단일 환경보다 어려울 수 있다.
일관성(consistency)를 보장하지 않으면 유저에게 혼란을 주는 결과를 줄 수 있다.
노드 간 합의 알고리즘을 사용하여, 일정 수준의 일관성(consistency)를 보장할 수 있다.

내용

Linearizable

Linearizable하다는 건 항상 최신 데이터를 읽을 수 있음을 보장한다는 의미다.
보통 여러 replica를 쓰는 데이터베이스의 경우, Linearizable하지 않다.
왜냐하면 replica에 대해 최신 데이터를 복제하는데 시간(replication lag)이 걸려서, replication lag 동안 최신 데이터를 읽을 수 없기 때문이다.

최신 데이터를 읽지 못하는 동안 잘못된 판단이 일어나고, 그에 따라 문제가 발생할 수 있다. 예시는 다음과 같다.

(1) 혼란을 주는 올림픽 결과
writer가 올림픽 최신 데이터를 write했고, reader1은 replication을 완료했지만 reader2는 replication을 완료하지 못했다.
철수는 reader1에서 읽은 후, 양궁에서 한국이 이겼다는 사실을 알게된다. 그리고 그 사실을 영희에게 말한다.
영희가 이후 reader2에서 양궁결과를 검색한다. 하지만 reader2는 양궁 시합이 진행중이라고 하고, 한국이 이겼다는 최신 데이터를 영희에게 알려주지 않는다.
철수에게 받은 소식과 reader2 결과가 달라서, 영희는 혼란스럽다.

(2) 자리 예약
writer에서 철수의 자리1에 대한 예약을 완료처리했다. reader1는 아직 writer의 최신 데이터에 대한 replication이 되지 않아, 자리1이 공석으로 저장되어 있다.
같은 시각 영희는 reader1에서 자리1 상태를 확인한다. 공석이다. 영희는 자리1에 대한 예약을 신청한다.(공석이므로 어플리케이션에서의 예약 validation 과정도 통과했다)
자리1에 대한 예약자가 철수에서 영희로 바뀐다.

Linearizability를 보장하면, 위와 같은 문제를 방지할 수 있다.
Linearizability를 보장하기 위해 Consensus 알고리즘을 활용할 수 있다.

(Consensus 알고리즘이 무엇인지는 잘 몰라서 이하 내용 요약 생략)

느낀점

두 가지 부분에서 실무와 큰 연관이 없다고 느꼈다.

첫째, 사용자가 최신 데이터를 읽지 못한다고 해서 혼란을 겪는 일은 거의 없다. replication lag는 대부분 사용자가 인지하지 못할 정도로 짧기 때문이다.
특정 사용자가 자신이 outdated한 결과를 본다고 인식할 수 있을 정도로 replicaiton lag는 길지 않다.
다시 말해 위 첫번째 예시에서, 영희가 철수에게 최신 올림픽 결과를 들었다면, 철수가 얘기하는 시간 동안 이미 replication 과정은 진행 중이었을 것이고, 영희가 다시 검색한 시점에
최신 올림픽 결과는 모든 reader들에게 반영되고도 시간이 남았을 것이다.

둘째, 정말로 Linearizability를 보장해야 할 경우에는, multiple writer 구성을 포기한다.
따라서 엄격한 Linearizability를 보장해야 하는 경우 Elaticsearch나 dynamoDB를 사용하지 않는다.
RDS로 single writer를 구성한다.
빈 좌석을 예약하는 경우에는, 결제 관련 서비스이므로 오류가 일어나지 않도록 정밀하게 해야할 것이다.
이런 경우에는, single writer로 구성하여, 예약 관련 서비스가 읽기/쓰기를 무조건 writer에서 하도록 구성한다.
그렇게 하여 무조건 최신 데이터 기반으로 예약을 진행하도록 한다.

0개의 댓글