Read Repair는 분산 데이터베이스에서 읽기 작업 중 복제본 간 불일치를 감지하고 자동으로 수정하는 메커니즘이다. 읽기 경로에서 일관성을 복구하여 별도의 백그라운드 프로세스 없이 데이터 일관성을 유지한다. Cassandra, DynamoDB 등에서 사용한다.
동작 원리
Coordinator 노드가 3개 복제본에 읽기 요청:
복제본1: {user_id: 1, name: "Alice", version: 3}
복제본2: {user_id: 1, name: "Alice", version: 3}
복제본3: {user_id: 1, name: "Bob", version: 2} ← 오래된 데이터!
1. Coordinator: 최신 버전(3) 확인 → 클라이언트에 반환
2. Read Repair 수행:
Coordinator → 복제본3: "최신 데이터로 업데이트"
복제본3: {name: "Alice", version: 3}으로 갱신
Read Repair 조건
read_repair_chance: 비동기 Read Repair 발생 확률 (0.0 ~ 1.0)
dclocal_read_repair_chance: 로컬 DC 내 Read Repair 확률
# Cassandra 설정
CREATE TABLE users (
id UUID PRIMARY KEY,
name TEXT
) WITH read_repair_chance = 0.1 -- 10% 확률로 Read Repair
AND dclocal_read_repair_chance = 0.1;
Blocking vs Background Read Repair
Blocking Read Repair (동기):
클라이언트 응답 전 모든 복제본 수정 → 지연 증가, 강한 일관성
Background Read Repair (비동기):
클라이언트에 먼저 응답 → 이후 복제본 수정 → 낮은 지연, 최종 일관성
Hinted Handoff: 쓰기 실패 시 나중에 복구
Read Repair: 읽기 시 불일치 복구
두 메커니즘이 함께 최종 일관성을 보장:
쓰기 장애 → Hinted Handoff → 복구 후 일관
읽기 시 불일치 → Read Repair → 즉시 일관
Anti-Entropy (Merkle Tree)
Read Repair가 커버하지 못하는 데이터를 주기적으로 복구한다.
1. 각 복제본이 저장 데이터의 Merkle 트리 구성
2. 두 복제본의 Merkle 트리 루트 해시 비교
3. 불일치 발견 → 트리를 따라 불일치 데이터 특정
4. 불일치 데이터만 전송 → 효율적 동기화
관련 개념