Reddit

There is no ‘now’ in a distributed system

분산 시스템에는 ‘지금’이 없습니다

분산 시스템에서는 서버 시각만으로 동시 쓰기의 순서를 정할 수 없습니다. 글은 Lamport의 happens-before 관계를 바탕으로 시계 대신 인과관계를 추적하는 방법을 설명하고, Last Write Wins, 버전 벡터, CRDT를 비교합니다.

에디터 노트

동시 편집에서 벽시계의 순서와 인과관계의 순서를 구분한 설명이 글의 실용적인 기준입니다. 특히 연결이 끊긴 동안에는 시각상 몇 시간 차이가 나도 두 편집이 서로를 보지 못했을 수 있다는 조건이 중요합니다. 다만 세 방식의 결과는 같지 않습니다. Last Write Wins는 값을 하나로 정하는 대신 데이터를 잃을 수 있고, 버전 벡터는 충돌을 애플리케이션으로 넘기며, CRDT는 정해진 자료구조와 규칙으로 병합합니다. 글은 CRDT의 동작 원리를 개괄하지만 구체적인 보장 범위와 자료구조별 차이는 후속 Yjs 글로 미룹니다. Reddit 댓글은 대부분 '지금'이라는 표현을 빌린 농담이며 기술 설명을 검증하거나 반박하는 내용은 없습니다.

AI 요약

공동 편집기에서 Alice가 입력한 “fast”를 보지 못한 Bob이 오프라인 상태에서 같은 자리에 “slow”를 입력하면 두 편집은 어느 쪽이 먼저라고 정하기 어려운 동시 쓰기가 됩니다. 글은 서버 시각이 더 늦다는 이유로 Bob의 편집만 남기는 Last Write Wins가 Alice의 내용을 조용히 잃게 만든다고 설명합니다. 분산 시스템에는 모든 복제본의 시계를 판정할 단일한 기준이 없기 때문입니다.

시각보다 인과관계

글은 특수 상대성 이론의 동시성 사례를 빌려, 관찰자마다 사건의 시간 순서가 다르게 보일 수 있지만 원인과 결과의 순서는 뒤집히지 않는다고 설명합니다. Lamport의 happens-before 관계도 시계가 아니라 사건 사이의 연결을 정의합니다. 한 컴퓨터에서 먼저 일어난 사건, 메시지를 보낸 사건과 받은 사건, 또는 이런 연결의 연쇄가 있으면 앞선 사건이 뒤 사건에 영향을 줬다고 봅니다. 어느 쪽에서도 연결을 찾을 수 없다면 두 사건은 동시적입니다.

다만 물리학의 빛 원뿔과 네트워크의 인과관계는 같지 않습니다. 네트워크에서는 신호가 이론상 도달할 수 있었는지가 아니라 실제로 메시지가 전달됐는지가 기준입니다. 연결이 끊기거나 기기가 잠들면 몇 시간 간격을 둔 편집도 서로를 보지 못한 동시 쓰기가 될 수 있습니다.

동시 쓰기를 다루는 세 방식

첫째는 Last Write Wins입니다. 각 쓰기에 시각을 붙여 가장 늦은 값을 남깁니다. Cassandra의 기본 방식으로 소개되지만, 시계가 어긋나면 실제 인과관계와 다른 값이 이길 수 있고 다른 편집은 사라집니다.

둘째는 Dynamo 방식입니다. 버전 벡터로 각 데이터 버전이 어떤 업데이트를 봤는지 기록합니다. 서로의 업데이트를 포함하지 않은 버전은 동시 쓰기로 판단해 함께 보관하고 애플리케이션에 병합을 맡깁니다. 글은 장바구니 사례를 듭니다. 한 복제본에 책을 추가하고 다른 복제본에 휴대전화를 추가했다면 두 버전을 유지한 뒤 합집합으로 병합할 수 있습니다. 대신 삭제한 항목이 다시 나타날 수 있습니다.

셋째는 CRDT입니다. 같은 업데이트를 받은 복제본이 같은 결과를 내도록 자료구조와 병합 규칙을 설계합니다. 글은 편집 위치를 숫자로 저장하는 대신 삽입 항목에 고유 ID를 붙이고 기존 항목과의 관계를 기록하는 방식을 설명합니다. 삭제 항목도 tombstone으로 남겨 이후 업데이트가 위치를 찾게 합니다. 같은 위치에 들어온 항목에는 복제본 ID 같은 공통 규칙으로 순서를 정합니다. Yjs와 Automerge가 CRDT 기반 라이브러리로 언급됩니다. 후속 글에서는 Yjs의 구현을 다룬다고 밝힙니다.

Reddit 반응

  • @olearyboy — 하지만 결국 그렇게 될 겁니다.
  • @ToaruBaka — 지금은 과거에만 존재합니다.
  • @winky9827 — 아니, 그건 그때였어요.
  • @Opening_Lead_1836 — 그때가 언제 지금이 되나요?
  • @Sojobo1 — 곧요.
  • @Weak-Doughnut5502 — 선생님! 저들의 위치를 확인했습니다. 베가의 위성입니다.
  • @winky9827 — 얼마나 곧이요?
  • @random_lonewolf — 지금은 이전과 이후 사이입니다.
  • @DrShocker — 제 지금은 당신의 지금보다 12분 늦다는 걸 알아냈습니다.
  • @commenterzero — 이리 와서, 지금 거기서 네가 어떤 상태인지 말해 봐.
  • @commenterzero — 지금 무슨 소리 하는 거야?
  • @AccurateInflation167 — 메시지가 순서대로 도착한다는 것. 분산 시스템에서 가장 중요한 부분은…

원문: itworkslocally.dev / 번역·요약: Trawling