CRDT 카운터(G-Counter·PN-Counter) 병합 계산기
노드별 벡터를 넣으면 G-Counter·PN-Counter 병합 결과를 계산합니다. 순서를 바꿔 합쳐도 같은 값이 나오는 것을 실제로 확인하고, 감소를 그냥 빼면 왜 무너지는지 숫자로 보여 줍니다.
복제본별 상태
한 줄이 한 복제본입니다. 맨 앞은 이름, 그다음이 노드별 증가 벡터입니다. 각 노드는 자기 칸만 올릴 수 있고, 남의 칸에 적힌 값은 «그 노드에게서 전해 들은 값»입니다.
모두 합친 뒤의 값
12
지금은 복제본마다 4만큼 벌어져 있지만, 서로 한 번씩 주고받으면 모두 이 값으로 모입니다.
복제본이 지금 보는 값
합치기는 칸마다 큰 쪽을 고르는 것뿐입니다. 남의 칸을 아무도 건드리지 않으므로 큰 쪽이 언제나 «더 최근»입니다.
순서를 바꿔 합쳐 보면
가능한 순서 6가지를 모두 확인했고 전부 같은 값이 나왔습니다. 교환·결합·멱등이 모두 성립하므로 메시지가 뒤바뀌든 중복되든 재전송되든 같은 값으로 모입니다.
사용 방법
- 1G-Counter(증가만)와 PN-Counter(증감) 중 하나를 고릅니다.
- 2한 줄에 복제본 하나씩, 이름과 노드별 증가 벡터를 넣습니다.
- 3PN-Counter면 막대(|) 뒤에 감소 벡터를 넣습니다.
- 4합친 벡터와 최종 값, 복제본마다 얼마나 뒤처져 있는지 확인합니다.
- 5병합 순서를 바꾼 표에서 값이 모두 같은지 봅니다.
자주 묻는 질문
칸마다 큰 쪽을 고릅니다. merge(x, y)[i] = max(x[i], y[i])이며 값은 벡터의 합입니다. 노드가 자기 칸만 올리므로 큰 쪽이 언제나 더 최근이고, 그래서 최댓값을 고르는 것만으로 합쳐집니다.
멱등이 깨지기 때문입니다. 덧셈으로 합치면 같은 상태를 두 번 받았을 때 값이 두 배가 됩니다. 분산 시스템에서 메시지가 정확히 한 번 도착한다는 보장이 없으므로 재전송이나 중복만으로 값이 틀어집니다.
주지 않습니다. max 병합은 교환·결합·멱등을 모두 만족하므로 어느 순서로 몇 번을 합쳐도 같은 값에 이릅니다. 이 도구는 가능한 순서를 실제로 돌려 같은 값이 나오는 것을 표로 보여 줍니다.
음수를 허용하면 max 병합이 감소를 삼키기 때문입니다. A가 5를 올렸다가 3을 내려 자기 칸이 2가 되어도, 아직 5만 아는 복제본과 max로 합치면 5가 남아 감소가 사라집니다. 증가 벡터 P와 감소 벡터 N을 나누면 둘 다 커지기만 하므로 각각 합쳐져 5−3=2가 그대로 남습니다.
될 수 있습니다. ΣP − ΣN이라 감소가 더 많으면 음수가 나옵니다. 재고처럼 0 아래로 내려가면 안 되는 값에는 그대로 쓰기 어려우며, 그런 곳에는 별도의 예약·정산 절차가 함께 필요합니다.
재는 대상이 다릅니다. 벡터 시계는 두 사건 중 무엇이 먼저인지, 아니면 동시인지를 판정하려고 벡터를 비교합니다. CRDT 카운터는 비교하지 않고 합쳐서 값 하나를 얻는 것이 목적입니다. 생김새가 같은 벡터라 헷갈리기 쉽습니다.
벡터가 노드 수만큼 길어집니다. 노드가 아주 많거나 자주 바뀌는 환경에서는 이 벡터 자체가 부담이 되므로, 실무에서는 오래 쉰 노드의 칸을 정리하는 별도의 절차를 함께 둡니다. 이 도구는 그 정리는 다루지 않습니다.
전송되지 않습니다. 계산은 모두 브라우저 안에서 이루어지고 넣은 값은 이 기기에만 남습니다.
알아두면 좋은 점
- 병합 순서 확인은 증명이 아니라 실제로 돌려 본 결과입니다. 복제본이 다섯 개를 넘으면 가능한 순서 가운데 일부만 확인합니다.
- 각 노드는 자기 칸만 올린다고 봅니다. 남의 칸을 올리는 구현이라면 max 병합의 전제가 깨집니다.
- 벡터가 커질 때의 저장·전송 비용과 오래 쉰 노드를 정리하는 문제는 다루지 않습니다.
- PN-Counter는 0 아래로 내려가는 것을 막지 않습니다.
함께 보면 좋은 도구
마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.