본문 바로가기

개발

분산시스템(Distributed System) - 6 - 3(Replica Consistency) Eventual Consistency

앞서 공부한 Linearizability는 많은 repilca가 존재하여도 하나인 거처럼 동작하도록 보장하기 때문에  분산 시스템에서 엄청 좋은 consistency 모델이다. 하지만 이러한 시스템을 만들기 위해서는 그만한 비용이 들기 때문에 모든 application에서 적합한 방법은 아니다. (사실 모든 것이 이렇다고 본다 소프트웨어 개발은 항상 trade off인 거 같다 이것을 잘하기 위해 공부를 해야 하는 것 같고)

performance 측면에서는 Linearizable 한 모델은 너무 많은 메시지를 주고받아야 하고 그로 인하여 latency가 증가한다 그리고 scalability측면에서는 순서를 위해서는 하나의 리더를 통해야 하는데 리더는 병목이 될 수 있다. availability 한 측면에서는 quorum에게 동의를 얻지 못하면 해당 이벤트를 수행하지 않을 것이다.

 

달력 앱을 예로 들어보자. 

노트북과 폰 패드 이렇게 세 군데에서 사용하고 각 기기들은 다른 기기들을 레플리카라고 생각할 것이다.

레플리카들과 consistency를 위해 Linearizable 한 protocol을 사용한다고 했을 때 컴퓨터에서 일정을 수정한다고 하자 이때 태블릿과 폰은 오프라인이다. 변경할 수가 없을 것이다. 이러한 문제가 발생할 수 있는 경우에는 다른 방식이 좀 더 좋다.

상태를 로컬 state로 관리를 하고 네트워크가 연결되었을 때 싱크를 맞추는데 가장 나중의 값으로 하는 것이다. 

 

이런 방식을 Eventual consistency라 한다. 

 

Eventual consistency를 사용하면 다른 여러 노드에서 하나의 데이터에 접근해서 업데이트를 할 수 있는데, 이러한 conflict들을 해결해주어야 한다. 다양한 알고리즘이 존재하는데 둘 중 더 늦게 되었다고 판단하는 것으로 덮어쓰는 방식일 것이다. 

 

처음에 언급한 세 가지 부분에서 Linearizability보다는 훨씬 좋을 것이다. 하지만 레플리카들의 consistency와 데이터의 무결성에 대해서는 좀 떨어진다. 하지만 위의 예를 든 달력 앱과 같은 경우에는 이러한 방식이 비용 측면이나 사용성에서는 장점으로 보이기 때문에 더 좋아 보인다.