Linearizability란 무엇인가
분산 시스템에서 여러 서버가 동일한 데이터를 복제해서 저장하다 보면, ‘지금 이 값이 진짜 최신 값이 맞나?’라는 의문이 생긴다. 이 의문에 가장 엄격하게 답을 주는 개념이 바로 Linearizability(선형성)다. Linearizability는 분산 환경에서 여러 노드에 데이터가 복제되어 있어도, 마치 단일 서버에서 하나씩 순서대로 작업이 처리되는 것처럼 동작하도록 보장하는 일관성 모델이다.
쉽게 비유하면, 은행 창구가 여러 개(노드)이지만 실제로는 뒤에서 한 명의 직원이 모든 요청을 순서대로 처리하는 것과 같다. 고객이 어느 창구에서 요청하든, 실제 처리 순서와 결과는 마치 창구가 하나였던 것처럼 일관되게 보인다.
동작 원리와 예시
Linearizability의 핵심 규칙은 두 가지다.
- 모든 연산은 호출 시점과 응답 시점 사이 어느 한 순간에 즉시 실행된 것처럼 보여야 한다.
- 실제 시간 순서상 먼저 끝난 연산은, 나중에 시작된 연산보다 항상 먼저 반영되어야 한다.
예를 들어 클라이언트 A가 write(x, 1)을 완료한 뒤, 클라이언트 B가 read(x)를 호출했다면 B는 반드시 1을 읽어야 한다. 만약 B가 이전 값을 읽는다면 이는 Linearizability를 위반한 것이다. 즉, 한 번 쓰기 연산이 끝나면 그 이후의 모든 읽기는 즉시 그 값을 봐야 한다는 뜻이다. 이를 위해 시스템은 내부적으로 합의 알고리즘(Paxos, Raft 등)을 이용해 모든 노드가 동일한 순서로 연산을 적용하도록 조율한다.
반면 Eventual Consistency(최종 일관성)는 ‘언젠가는’ 모든 노드가 같은 값을 갖게 된다는 약한 보장만 제공한다. 그 사이에는 노드마다 다른 값을 볼 수 있다. Linearizability는 이런 시간차를 허용하지 않는, 가장 엄격하고 직관적인 모델이다.
실무에서 왜 중요한가
Linearizability는 분산 락, 리더 선출, 잔액 차감처럼 정확성이 생명인 작업에서 필수적이다. 예를 들어 은행 계좌에서 동시에 출금 요청이 들어올 때, 각 노드가 서로 다른 잔액을 본다면 중복 출금 같은 심각한 오류가 발생할 수 있다. 이런 상황을 막기 위해 ZooKeeper, etcd, Consul 같은 분산 코디네이션 시스템은 Linearizability를 핵심 보장으로 제공한다.
다만 Linearizability를 지키려면 모든 연산마다 노드 간 합의 과정을 거쳐야 하므로 지연 시간이 늘어나고 처리량이 떨어진다. 그래서 실무에서는 모든 데이터에 Linearizability를 적용하지 않고, 정확성이 중요한 일부 핵심 데이터(락, 카운터, 설정값 등)에만 선택적으로 적용하고 나머지는 더 느슨한 일관성 모델을 사용해 성능과 정합성 사이의 균형을 맞춘다.
결국 Linearizability를 이해한다는 것은 ‘내 시스템이 얼마나 강한 일관성을 필요로 하는가’를 판단하는 기준을 갖는 것과 같다. CAP 이론에서 일관성(C)의 기준점이 되는 개념이기도 하므로, 분산 시스템을 설계하거나 면접을 준비하는 개발자라면 반드시 짚고 넘어가야 할 개념이다.