복제 및 최종 일관성
복제 및 최종 일관성
1) 최종 일관성
시스템이 영역/영역별로 배포되면 모든 곳에서 동기 기록이 네트워크 오류시 대기 시간이 길고 가용성이 낮습니다. 최종 일관성 (EC) 은 다음을 위해 복제본을 일시적으로 잘못 정렬 할 수 있습니다
낮은 기록 지연 (로컬 수신),
네트워크 파티션 중 더 나은 가용성
수평 스케일링.
주요 작업은 제어 된 느슨한 일관성입니다. 사용자는 "상당히 새로운" 데이터를보고, 도메인 불변량이 보존되고, 충돌이 감지되고 예측 가능하게 해결됩니다.
2) 일관성 모델-고객에게 약속 한 것
강력: 독서는 즉시 마지막 항목을 봅니다.
경계 오래된/읽기 이상 (RNOT): 마크보다 오래되지 않은 읽기 (LSN/버전/시간).
인과 관계: "인과 관계" (A와 B) 가 유지됩니다.
읽기: 고객이 최근 녹음을 봅니다.
단조로운 읽기: 다음에 읽을 때마다 "롤백" 되지 않습니다.
세션: 한 세션의 보증 세트.
결국: 새로운 항목이 없으면 모든 복제본이 수렴합니다.
연습: 중요한 경로에서 세션 + RNOT를 결합하고 상점/캐시에서 최종적으로 결합하십시오.
3) 복제: 역학 및 엔트로피 방지
동기식 (쿼럼/RAFT): 레코드는 N 노드로 확인 한 후 성공한 것으로 간주됩니다. 최소 RPO, p99 이상.
비동기: 리더는 로컬로 커밋하고 나중에 로그를 배포합니다. 낮은 대기 시간, RPO> 0.
물리적 (WAL/binlog): 빠르고 균질합니다.
논리/CDC: 행/이벤트 레벨 변경 흐름, 유연한 라우팅, 필터.
엔트로피 방지: 주기적 조정 및 수리 (머클 트리, 해시 비교, 배경 재 동기화).
4) 버전 식별자 및 인과 관계 주문
모노톤 버전: 증분/LSN/epoch; 간단하지만 병렬 처리를 인코딩하지 마십시오.
램 포트 타임 스탬프: 논리 시계 별 부분 순서.
벡터 시계: 병렬 분기를 수정하고 상충되는 업데이트를 감지 할 수 있습니다 (동시).
하이브리드/TrueTime/Clock-SI: 글로벌 주문에 대한 "T 이전이 아님" 논리.
권장 사항: CRDT/상충되는 업데이트-벡터 시계; "오래되지 않은" -LSN/GTID.
5) 충돌: 발견과 해결
일반적인 상황: 두 영역에서 동일한 객체로 기록.
전략:1. 시간/논리 스탬프별로 LWW (Last-Write-Wins) - 간단하지만 업데이트가 "손실" 될 수 있습니다.
2. 도메인 논리별로 함수를 병합합니
카운터 필드가 추가됩니다 (G-Counter/PN-Counter)
세트는 "애드윈/제거 윈" 과 결합됩니다
금액/균형-간단한 LWW가 아닌 거래 저널을 통해서만.
3. CRDT (수렴 유형): 목록에 대한 G-Counter, OR-Set, LWW-Register, RGA.
4. 운영 변환 (데이터베이스에서는 드물고 편집기에서는 더 자주).
5. 수동 해상도: "받은 편지함" 에서 충돌하면 사용자가 올바른 버전을 선택합니다.
규칙: 도메인 불변량은 전략을 지시합니다. 돈/잔액의 경우-LWW를 피하십시오. 보상 된 거래/이벤트를 사용하십시오.
6) 기록 보증 및 demmpotency
명령 (지불, 철회, 생성) 의 이데올로기 키 → 재 시도는 안전합니다.
demempotence 키/일련 번호로받은 편지함 및 아웃 박스 중복 제거.
정확히 한 번은 건물이 없으면 달성 할 수 없습니다. 적어도 한 번은 + dempotency를 연습하십시오.
전송/받은 편지함 패턴: 데이터베이스에 기록하고 이벤트를 게시하는 것은 demempotency 키에 의한 수신자 프로세스 인 원자 (로컬 트랜잭션) 입니다.
7) 더 오래된 X 읽기 없음 (RNOT)
기술자:- LSN/GTID 게이트: 클라이언트는 최소 버전 (쓰기 응답에서) 을 전송하고 라우터/프록시는 LSN
- 시간 제한: "2 초 이하의 시간" -버전이없는 간단한 SLA.
- 세션 피닝: N 초를 기록한 후 리더 만 읽습니다 (읽기).
8) 흐름 변경 및 캐시 협상
CDC → 이벤트 버스 (Kafka/Pulsar) → 소비자 (캐시, 인덱스, 상점).
캐시 장애: 주제 '무효화: {ns}: {id}'; dempotent 처리.
재구성/백필: 동기화되지 않으면 이벤트 로그에서 프로젝션을 다시 조립하십시오.
9) 사가 및 보상 (서비스 간 거래)
EC 세계에서 장기 운영은 보상 조치의 단계로 나뉩니다
오케스트레이션: 코디네이터는 단계와 보상을 호출합니다.
안무: 단계는 이벤트에 반응하고 다음 단계를 직접 게시합니다.
불변량 (예): "밸런스 확장 0" -편차에 대한 단계 경계 + 보상을 확인하십시오.
10) 다중 지역 및 네트워크 파티션
로컬 쓰기, 무균 복제: 로컬 지역에 쓰기 + 다른 지역 (EC) 에 전달하십시오.
지리적 펜싱: 데이터가 해당 지역에 "접착" 됩니다 (대기 시간이 짧고 충돌이 적음).
CP 데이터에 대한 쿼럼 데이터베이스 (Raft); 캐시/상점-AP/EC.
분할 뇌 계획: 통신이 손실되면 영역은 도메인 제한 (작성 펜싱, 할당량) 내에서 계속 작동 한 다음 조정합니다.
11) 관찰 및 SLO
메트릭:- 복제 지연: 시간/LSN 거리/오프셋 (p50/p95/p99).
- 동일성: 임계 값을 초과하는 응답의 백분율 (예:> 2s 또는 LSN
- 갈등률: 갈등률과 성공적인 합병.
- 수렴 시간: 피크 후 복제본의 수렴 시간.
- 화해 백 로그: 지연 배치의 볼륨/시간.
- 데이터 범주 별 RPO/RTO (CP/AP).
- Lag> 대상, 충돌 증가, "긴" 불가능성 창구.
12) EC 데이터 체계 설계
각 항목의 명시 적 버전/벡터 (열 '버전', 'vc').
중요한 불변량에 대한 추천 전용 로그 (밸런스, 발생).
주문 및 중복 제거를위한 이벤트 식별자 (눈송이/ULID).
정류 필드 (카운터, 세트) → CRDT 후보.
API 디자인: if-match/etag가있는 PUT, 전제 조건이있는 PATCH.
13) 저장 및 읽기 패턴
모델/CQRS 읽기: "소스" 에 쓰기, 프로젝션에서 읽기 (→ "업데이트 된"... 뒤에 지연 될 수 있음).
부동산 경로 (카탈로그/테이프) vs 엄격한 (지갑/제한).
요청시 끈적 끈적한/바운드 오래된 플래그 (헤더 'x- 읽기 일관성').
14) 구현 점검표 (0-45 일)
0-10 일
데이터 분류: CP 크리티컬 (돈, 주문) vs EU/스틸 확인 (카탈로그, 검색 색인).
스틸 SLO를 정의하십시오 (예: "2s보다 오래되지 않음"), 대상 지연.
API에서 객체 버전 지정 및 demempotency 키를 사용합니다.
11-25 일
CDC 및 아웃 박스/받은 편지함, 캐시 장애 경로를 구현합니다.
쓰기 중요 경로에 RNOT (LSN 게이트) 및 세션 피닝을 추가하십시오.
하나 이상의 병합 전략 (LWW/CRDT/도메인) 및 충돌 로그를 구현합니다.
26-45 일
엔트로피 방지 (조정/수리) 및 스타일링 보고서를 자동화하십시오.
게임 데이: 네트워크 분리, 충돌 급증, 복구.
지연, 정체, 충돌 률, 수렴 등 대시 보드를 시각화하십시오.
15) 반 패턴
중요한 불변량에 대한 블라인드 LWW (돈/포인트 손실).
dempotency → 재 훈련 중 작업 복제본이 부족합니다.
전체 → 고장시 과도한 p99 꼬리와 취약성에 대한 "강력한" 모델.
노트/세션은 → UX "깜박임" 을 보장하지 않으며 사용자는 변경 사항을 "보지 못합니다".
숨겨진 캐시 및 소스 오정렬 (CDC/장애 없음).
조정/엔트로피 도구가 부족합니다. "수세기 동안" 데이터가 다릅니다.
16) 성숙도 지표
Replica lag p95 체 대상 (예를 들어, 영역 내에서 약 500ms, 지역 간 2 초).
Staleness SLO는 "엄격한" 경로에서 요청의 99% 이상을 수행합니다.
충돌 해결 성공 이상 99. 9%, 평균 해상도 시간
피크 후 수렴 시간-시간이 아닌 분.
"돈" 거래의 100% 는 demempotency 키와 아웃 박스/받은 편지함으로 덮여 있습니다.
17) 요리법 (스 니펫)
만약 일치하는/ETag (HTT)
PUT /profile/42
If-Match: "v17"
Body: { "email": "new@example.com" }
버전이 변경되면 '412 전제 조건 실패' → 클라이언트가 충돌을 해결합니다.
"LSN보다 오래되지 않은" 쿼리 (의사)
x-min-lsn: 16/B373F8D8
라우터는 'replay _ lsn 많은 x-min-lsn' 을 사용하여 복제본을 선택합니다. 그렇지 않으면 리더입니다.
CRDT G- 카운터 (아이디어)
각 지역은 자체 카운터를 유지합니다. 합계-모든 구성 요소 복제의 합-작동은 정기적입니다.
18) 결론
최종적인 일관성은 품질의 타협이 아니라 의식적인 계약입니다. 속도와 가용성을 위해 신선함을 지불하는 곳이지만 도메인 전략과 도구로 중요한 불변을 보호합니다. 버전, demotency, RNOT/Session 보증, CDC 및 엔트로피 방지를 입력하고 지연/정지/충돌을 측정하십시오. 분산 시스템은 결함 및 피크로드 하에서도 빠르고 안정적이며 예측 가능하게 수렴합니다.