caffeine-library / system-design-interview

🌱 가상 면접 사례로 배우는 대규모 시스템 설계 기초를 읽는 스터디
4 stars 0 forks source link

[additional] 정족수 합의와 벡터 시계 #20

Closed ngwoon closed 2 years ago

ngwoon commented 2 years ago

연관 챕터

16

조사 내용

책에서 정족수 합의와 벡터 시계를 활용한 데이터 일관성 관리 방법을 언급했는데, 그 내용이 디테일하지 않아 이해하기 어려움이 있었습니다. 조금 더 제대로 이해하고 넘어가고자 이에 대해 조사합니다.

@caffeine-library/readers-system-design-interview

ngwoon commented 2 years ago

정족수 합의 프로토콜

정족수 합의 프로토콜은 분산 환경에서 쓰기, 읽기 연산에 대해 K개 이상의 성공 결과를 받아낸 뒤에 클라이언트에 반환함으로써 데이터의 일관성을 유지하는 프로토콜이다.

정족수 합의 프로토콜에는 “중재자 (coordinator)” 노드가 필요하며, 중재자가 실제 클라이언트와 통신하는 매개체이다.

정족수 합의 프로토콜은 세 가지 변수가 존재한다. N, W, R

N, W, R 변수를 튜닝하는 과정은 애플리케이션의 성격에 따라 다르다.

빠른 읽기 연산을 지원해야 하는 앱은 R이 작아야 한다.

빠른 쓰기 연산을 지원해야 하는 앱은 W가 작아야 한다.

보통 아래와 같은 공식으로 강한 일관성, 약한 일관성을 판단한다.

W + R > N. 어떻게 강한 일관성을 보장할까?

N = 3인 상황을 가정해보자.

위 식에 의하면, W, R은 아래와 같은 값을 가질 때 강한 일관성이 보장된다.

벡터 시계

벡터 시계는 각 데이터에 [서버, 버전] 쌍을 달아두는 버저닝 방법이다.

이렇게 각 데이터에 벡터 시계를 달아두면, 서로 다른 여러 노드에 다중화된 데이터가 현재 일관적인 상태인지 아닌지 판별할 수 있다.

벡터 시계는 아래와 같은 규칙으로 변화한다.

벡터 시계는 어디에 위치한 값이고, 누가 관리하는가?

데이터가 실제 저장되는 가상 노드에 존재한다.

즉, 키-값-벡터시계 형태로 각 가상 노드에 데이터가 저장된다.

아울러 벡터 시계를 증가시키는 건 각각의 가상 노드가 관리한다.

벡터시계를 coordinator가 관리한다고 가정하면, coordinator는 각각의 가상 노드의 벡터 시계 인덱스를 가지고 있어야 한다. 만약 coordinator에 장애가 생겨서 새로운 coordinator가 선출될 경우, 이전 coordinator가 관리하던 벡터 시계 인덱스들이 전부 사라졌기 때문에 데이터 버저닝에 문제가 생긴다.

책에서 제시한 키-값 저장소 분석

책의 예시를 가져와서, 키-값 분산 저장소를 설계해보자.

키-값 저장소 구조.jpg

어떤 구조인가?

분산 시스템은 크게 두 가지로 구분된다.

leaderless 구조의 단점

이 때문에, 책에서는 coordinator라 불리는 Single Leader 구조를 제시하고 있다.

coordinator는 leaderless 구조에서 클라이언트가 맡았던

등에 더해서

역할을 수행한다.

= 백엔드 애플리케이션, 키-값 저장소의 역할이 분명하게 나뉘었다!!

coordinator는 Single Leader인가? Leaderless인가?

coordinator는 Leader의 역할 중 하나인 “선작업” 을 수행하지 않는다.

단순히 요청을 포워딩하는 proxy역할을 할 뿐이다. 이 부분 때문에 coordinator가 섞여있는 구조가 Single Leader인지, Leaderless인지 애매한 부분이 있지만, 클라이언트가 요청을 coordinator에게만 보낸다는 점, 요청의 성공 여부를 coordinator가 판단한다는 점을 봐서 Single Leader 구조라고 생각하겠다.

정족수 합의 프로토콜, 벡터 시계의 역할

모든 레플리카에 요청을 보내서 모두 성공 응답을 받는 방식은 비효율적.

→ 정족수 합의 프로토콜을 사용해서 읽기, 쓰기 성능을 향상시킬 수 있다.

단, 정족수 합의 프로토콜을 사용하면 네트워크 파티션 등으로 인한 데이터 일관성 깨짐이 발생할 수 있다.

→ 이에 대한 해결책으로 벡터 시계가 제시되었다.

정족수 합의 프로토콜 + 벡터 시계

두 가지 기술이 함께 사용될 때, 데이터 저장 흐름은 아래와 같다.

(레플리카는 2개로 가정한다.)

참고

https://efficientcodeblog.wordpress.com/2017/12/25/leaderless-replication-dynamo-style-quorum-consensus-eventual-consistency-high-availability-and-low-latency/

https://towardsdatascience.com/database-replication-explained-3-32d6deceeca7

https://darkstart.tistory.com/144

https://medium.com/omarelgabrys-blog/consistent-hashing-beyond-the-basics-525304a12ba

https://www.educative.io/courses/grokking-adv-system-design-intvw/JE7p471DQ3l

https://www.waitingforcode.com/big-data-algorithms/conflict-resolution-distributed-applications-vector-clocks/read

https://www.exploredatabase.com/2014/04/quorum-consensus-protocol-distributed.html

https://sujithjay.com/data-systems/dynamo-cassandra/

https://martinfowler.com/articles/patterns-of-distributed-systems/