← 기술 지식

기술 지식 / 데이터 시스템 / 분산 시스템 / 일관성·시계

벽시계·Lamport·Vector·HLC의 순서 의미

표시·경과·인과를 나누고 Lamport 수신·벡터 비교·참여자 퇴역·HLC 증가·LWW 손실·감사와 lease 시간의 경계를 설명합니다.

분산 시스템 · 원리·구현·운영
기술 지식 트리

분산 시스템에서 시각을 읽기 전에 사건 사이의 화살표가 무엇을 뜻하는지 정해야 합니다. 벽시계는 표시와 deadline에, 단조 시계는 한 프로세스의 경과 측정에, 논리 시계는 모델 안의 인과·권위 순서에 쓰이며 어느 하나도 모든 의미를 자동으로 대신하지 않습니다.

Timestamp 크기와 사용자 변경의 시간 순서 불일치

A의 시계가 5분 빠르면 먼저 한 A 수정이 나중의 B 수정보다 큰 timestamp를 가질 수 있습니다. NTP는 오차를 줄이는 운영 수단이지 모든 순간의 정확한 전역 순서 증명은 아닙니다. 감사 표시용 시각·로컬 경과 시간·권위 commit 순서·인과를 다른 값으로 다룹니다.

도구 알 수 있는 것 알 수 없는 것
wall clock 달력 시각에 가까운 표시 완전한 서버 간 순서
monotonic clock 같은 clock domain의 경과 다른 서버·재부팅 전후 전역 비교
객체 version·log index 해당 권위 범위의 순서 다른 객체·클러스터의 전역 선후
Lamport 인과를 거스르지 않는 논리 번호 번호 대소만으로 실제 인과 증명
vector clock 모델 안의 인과 포함·동시성 콘텐츠의 올바른 병합
HLC 물리 시각에 가까운 논리 증가 모든 동시성 판별·선형화

로컬 timeout은 같은 단조 시계의 시작·끝으로 재고 다른 프로세스에는 남은 예산 또는 오차를 포함한 절대 deadline 계약을 전달합니다. 이전 부팅의 단조값을 저장해 새 프로세스에서 그대로 비교하지 않습니다. 감사 로그에는 wall time·시간대·동기화 상태·요청/작업 ID·원본 version을 함께 남깁니다.

Lamport 수신 시 Max+1 갱신

로컬 사건마다 카운터를 증가하고 메시지에 실어 보냅니다. 받은 값이 5, 로컬이 8이면 수신 사건의 값은 max(5,8)+1=9입니다. 송신은 수신의 원인이므로 번호가 앞서도록 합니다.

하지만 서로 통신하지 않은 두 사건도 5와 9를 가질 수 있어 L(A)<L(B)에서 A→B를 역추론할 수 없습니다. node ID를 tie-breaker로 붙이면 전체 정렬은 만들 수 있지만 새 인과관계가 생기는 것은 아닙니다.

메시지 수신은 원인의 논리 시간을 포함합니다A 송신 · L=5. B 현재 · L=8. B 수신 · L=9받은 값 5max(8,5)+1A 송신 · L=5B 현재 · L=8B 수신 · L=9
메시지 수신은 원인의 논리 시간을 포함합니다 화살표는 실제 메시지 인과입니다. B의 다른 로컬 사건과 A의 모든 사건을 숫자만으로 인과 관계라고 판단하지 않습니다.
그림을 글로 읽기
  • A 송신 · L=5
  • B 현재 · L=8
  • B 수신 · L=9
  1. A 송신 · L=5 → B 수신 · L=9: 받은 값 5
  2. B 현재 · L=8 → B 수신 · L=9: max(8,5)+1

Vector 성분별 포함과 동시성 판정

두 참여자 A,B의 벡터 [1,0]과 [0,1]은 어느 쪽도 모든 성분이 다른 쪽 이하가 아니므로 동시입니다. [1,0]과 [1,1]은 전자가 후자에 포함되고 하나가 작아 인과적으로 앞섭니다. 로컬 사건은 자기 성분을 늘리고 수신은 성분별 max 후 자기 성분을 증가하는 규칙을 따릅니다.

문서 제목을 두 기기에서 다르게 바꿨다면 동시라는 판정 뒤에도 사용자 병합·보존·명시 우선순위가 필요합니다. vector가 어떤 문장이 옳은지 선택하지 않습니다. 참여자 모델·메시지 전파·버전 생성 규칙을 정확히 따를 때의 인과 정보입니다.

Vector 참여자 성분 삭제와 과거 인과 정보 손실

[A:2,B:0]과 [A:1,B:1]은 동시인데 A 성분을 제거하면 [B:0]과 [B:1]로 보여 선후로 오판할 수 있습니다. 옛 참여자가 떠났다는 이유만으로 그 성분을 모두 지우면 지연 메시지·오래된 replica가 가져온 과거를 해석할 수 없습니다.

퇴역 조건·causal stability·epoch·안전한 축약·재동기화 규칙을 마련하고 ID 재사용 때 옛 counter와 새 사건을 섞지 않습니다. 무한 참여자 메타데이터 비용과 보관 요구를 함께 봅니다. 단일 권위 객체라면 더 단순한 version이 적합할 수 있습니다.

HLC 물리 성분과 논리 성분의 조합

HLC를 (p,l)로 두고 수신 시 p를 로컬 p·받은 p·현재 물리 시간 중 최댓값으로 정합니다. 로컬 (100,2), 수신 (100,5), 현재 물리 시간 99라면 p=100이고 받은 논리값 5를 이어 l=5+1=6이 되어 결과는 (100,6)입니다. 로컬 물리 시간이 기존 p보다 앞서면 p를 전진시키고 논리값을 초기화할 수 있으며, 물리 시간이 같거나 뒤로 가면 p를 유지하고 l을 늘리는 식으로 물리 시계가 뒤로 가도 논리 순서를 유지합니다.

정확한 병합·overflow·지속성은 채택 구현을 따릅니다. 큰 미래 물리값을 받은 뒤 p가 앞으로 끌려가면 표시 오차가 커질 수 있어 출처·허용 미래 범위를 검사합니다. HLC의 크기만으로 두 사건이 실제 인과인지 동시인지 완전히 판별할 수 없고, 전역 최신 읽기나 분산 lease 독점을 자동 만들지도 않습니다.

LWW 수렴과 변경 손실의 절충

(timestamp,node ID) 같은 전체 순서로 하나를 고르는 LWW는 결정적인 선택 규칙일 수 있지만 사용자 의도 보존과 다릅니다. 빠른 시계의 과거 수정이 나중 정상 수정을 오래 이길 수 있고, 같은 timestamp의 tie-breaker도 어떤 변경을 잃는 선택입니다.

선호 설정처럼 손실을 허용할 수 있는 데이터와 금전·권리·중요 문서를 구분합니다. version 조건·동시 변경 보존·CRDT 또는 사용자 병합을 검토하고 버려진 수정의 감사·복구를 남깁니다. lease는 로컬 시간 확인 직후 pause할 수 있어 저장 지점의 원자 fencing이 별도로 필요합니다.

시계 점프·동률·미래 수신·참여자 퇴역 수치 실험

검산 입력을 작게 고정하면 의미가 선명해집니다. 예를 들어 Lamport 로컬 8에 메시지 5를 받으면 9, 벡터 [1,0]과 [0,1]은 동시, HLC (100,2)가 (100,5)를 받아 현재 물리 시간이 99여도 논리 성분은 6이 되어야 합니다. 이 예측과 구현 로그가 다르면 clock 종류를 잘못 섞었거나 수신 갱신 규칙이 빠진 것입니다.

Lamport의 송수신, 벡터의 포함·동시, HLC의 물리 역행·동률·미래 수신, 성분 삭제 반례를 작은 모델로 검사합니다. 실제 배포에서는 시계 jump·재시작·지연 메시지와 최종 적용 version을 함께 확인해야 합니다. 본문은 알고리즘 의미 설명이며 실제 분산 clock 구현이나 wall-clock 장애 실험을 수행한 결과는 아닙니다.

후속·관련 개념

함께 읽을 문서

전체 기술 지식
선택 연습 · 관련 질문 6개

질문은 이해를 확인하는 보조 자료입니다. 학습 경로와 문서의 범위는 질문 수와 독립적입니다.