분산 시스템 개발을 위한 CRDT(Conflict-free Replicated Data Type)의 이해
CRDT(Conflict-free Replicated Data Type)는 분산 환경에서 데이터 일관성을 유지하는 기술로, Google Docs, Figma와 같은 협업 도구에 활용됨
LWW(Last Write Wins) 레지스터는 CRDT의 기본 구성 요소로, 타임스탬프(Timestamp)를 사용하여 마지막 쓰기 값을 결정함
LWW 맵(Map)은 LWW 레지스터를 기반으로 구축되며, 키-값 쌍(Key-Value Pair)의 충돌 없는 동기화를 지원함
모노토닉하게 증가하는 데이터 구조(Monotonically Increasing Data Structures)의 특성으로 인해, 삭제 연산(Delete Operation)이 아닌 툼스톤(Tombstone)을 사용함
CRDT(Conflict-free Replicated Data Type)의 기본 개념
CRDT(Conflict-free Replicated Data Type)는 분산 환경에서 데이터 일관성을 유지하기 위한 핵심 기술이다. 상태 기반(State-based) CRDT는 전체 상태를 공유하고, 연산 기반(Operation-based) CRDT는 수행된 연산만 공유한다. 본문에서는 상태 기반 CRDT를 중점적으로 다루며, LWW(Last Write Wins) 레지스터와 LWW 맵(Map)을 통해 CRDT의 구현 원리를 설명한다. 특히, Commutativity, Associativity, Idempotence의 세 가지 속성을 만족해야 데이터가 정확하게 병합됨을 강조한다.
LWW(Last Write Wins) 레지스터의 동작 방식
LWW(Last Write Wins) 레지스터는 가장 간단한 형태의 CRDT로, 단일 값을 저장하고 타임스탬프(Timestamp)를 사용하여 마지막 쓰기 값을 결정한다. LWW 레지스터(Register)는 로컬 타임스탬프(Local Timestamp)와 수신된 타임스탬프(Remote Timestamp)를 비교하여 값을 업데이트한다. 만약 수신된 타임스탬프가 로컬 타임스탬프보다 크면, 로컬 값을 수신된 값으로 덮어쓴다. 또한, Peer ID를 사용하여 타임스탬프가 동일할 경우 충돌을 해결한다.
LWW 맵(Map)을 이용한 복잡한 데이터 구조 구현
LWW 맵(Map)은 LWW 레지스터를 기반으로 구축되어, 여러 개의 키-값 쌍을 관리한다. LWW 맵은 각 키에 대해 LWW 레지스터를 사용하며, Composition을 통해 복잡한 데이터 구조를 구현한다. Merge 함수는 수신된 상태의 각 키에 해당하는 LWW 레지스터의 merge 함수를 호출하여 상태를 병합한다. 삭제 연산은 실제 데이터 삭제 대신 Tombstone을 사용하여, 데이터의 모노토닉 증가(Monotonically Increasing)를 보장한다.
분산 시스템(Distributed System)에서의 CRDT 활용
댓글에서는 CRDT가 분산 시스템에서 데이터 일관성을 유지하는 데 유용하다고 언급한다. 특히, Counter, Append-only 데이터 구조, Multi-Value 레지스터 등 다양한 CRDT 유형을 소개하며, 각 유형이 특정 사용 사례에 적합함을 강조한다. 또한, Operation-based CRDT와 State-based CRDT의 차이점을 언급하며, Elixir 생태계의 Horde와 같은 Operation-based CRDT 구현체를 예시로 제시한다. Delta-CRDT는 State-based CRDT의 최적화 기법으로, 상태 차이(State Diff)를 공유하여 효율성을 높인다.