아키텍쳐

[강의 정리] Distributed System 5.2: Quorums (정족수)

hayz 2023. 3. 31. 00:08

# 강의 영상


정리

이 강의의 시작에서 얘기 했던 것과 같이 replication 은 시스템의 신뢰도를 향상시키는데 많이 유용합니다. 여러개의 replica 가 있을 때 하나의 replica 가 고장났을 때, 남은 하나가 이어서 연산을 진행 시킬 수 있기 때문입니다. 고장이 났다는건, 하드웨어 요소일 수도 있고 네트워크 문제일 수 있고, 소프트웨어 업데이트 등의 계획된 작업들 때문일 수도 있습니다. 

하지만, 그 replication 을 정확히 어떤 식으로 구현했냐에 따라 시스템의 안정성에 큰 영향을 끼칩니다. fault tolerance 를 제외 하고는, 여러개의 replica 를 가진다는 것은 오히려 안정성을 안좋게 만듭니다. 더 많은 replica 를 가질 수록 각 replica 에 오류가 생길 확률이 높아지기 때문입니다. 그치만, 이러한 오류를 가진 replica 가 있음 에도 동작을 진행한 다면, 안정성은 높아집니다. (?) 모든 replica 에 오류가 날 확률 보다 최소 몇개의 replica 가 오류날 확률이 훨씬 적기 때문입니다. 

 

자 이제, replication 에서 어떻게 fault tolerance 를 지켜낼 수 있는지 자세히 알아봅시다. 시작하기에 앞서 아래의 예시를 하나 살펴 봅시다. 아래 상황은 A, B 노드에 (x, v0), t0 으로 key 가 x, value 가 v0 그리고 timestamp 가 t0 인 값이 저장되어 있을 때 client 가 x 를 v1 로 저장 하며 timestamp 가 t1 으로 업데이트 된 상황을 보여줍니다. 하지만 여기에서 문제는 A 노드에 는 제대로 반영되지 않았고 B 노드에는 제대로 반영이 되었고, 그 다음 client 가 read 를 요청 했을 때 반대로 아까 업데이트에 실패했던 노드인 A 노드에서 데이터를 가지고 오는 상황이라면 client 가 업데이트하기 전인 (x, v0), t0 값을 다시 읽게 되는 문제가 생기게 됩니다. 

위와 같은 문제를 방지하는 것이 "Read-after-write consistency" 라고 합니다. write 후 read 했을 때의 일관성을 보장할 수 있는것을 말하죠. 여기서 짚고 넘어가야 할 것은, read-after-write consistency 가 단일 client 에게 제공되는 일관성이 아닌, 여러 client 에게 제공되는 기점을 얘기하기 때문에, 특정 사용자가 x 를 v1 으로 write 했다고 해도, 누군가 그 사이에 v2 로 write 하면 client 는 모두 v2 를 보게 되는 것을 말합니다. 즉, 자기 자신이 update 한 것이 아닌 가장 마지막에 쓰여진 값을 보여주는 것을 의미합니다. 

 

우리는 위 문제를 세개의 replica 를 가지고 한번 풀어보도록 하겠습니다. A,B,C 노드가 있을 때 각각에 write 를 날리고, 그 다음에 read 을 날리게 되었을 때 만약 write 는 B,C 만 성공하고 A 는 실패하고 그리고 read 는 A,B 만 성공하고 C 는 실패했다고 했을 때, 결국 client 는 서로 다른 데이터를 결과로 얻게 됩니다. 하지만 여기서 우리는 timestamp 를 적용했기 때문에 어떤 것이 최신 데이터인지 구분할 수 있습니다. 

여기서 write 요청에 응답한 {B, C} 를 write quorum, read 요청에 응답한 {A,B} 를 read quorum 이라고 합니다. 일반적으로 quorum 이란 요청에 성공적으로 응답했다고 판단할 수 있는 최소 갯수를 의미합니다. (quorum 의 어원은 정치판에서 의결이 통과하기에 최소 인원을 나타낼때 쓰였던 용어입니다. ) read-after-write consistency 를 보장하기 위해서는, read quorum 과 write quorum 이 최소 하나이상 겹쳐야 합니다. 

 

분산 시스템에서 주로 쓰이는 quorum 은 majority quorum 입니다. majority quorum 은 n개의 노드가 있을 때 n의 반 이상을 나타내는 subset 을 나타냅니다. 예를 들어, {A,B,C} 가 있으면 {A,B}, {B,C}, {A,C} 가 majority quorum 으로 볼 수 있습니다. 만약 n 이 홀 수 라면 n+1/2 가 majority quorum 의 갯수 이고 n 이 짝수라면 n+1/2 한것의 반올림인 n+2/2 로 나타낼 수 있습니다. 이 majority quorum 의 특징은 아무 두 subset 을 골라도 최소 한개가 겹친다는 것입니다. 

위의 그림에 있는 설명에 의하면 만약 3 개의 replica 가 있을 때 2개가 majority quorum 이기 때문에 최소 1개의 장애에 대해서는 견딜 수 있고, 5개가 있을땐 최소 2개의 장애에 대해선 견딜 수 있습니다. 

혹은 이런 경우도 있습니다. 만약 timestamp 가 다른 두개의 값이 동시에 반한되었을 때, client 는 어떤 값이 최근이고, 어떤게 최신화가 되지 않았는지 파악할 수 있으므로, 한번 더 최근 값에 대해서 write 를 적용해 주기도 합니다. 이를 read repair 라고 불립니다.