0006 — 복사 호스팅은 원자적 DB 리스에 의해 조정됩니다
컨텍스트
실행 중인 복사 프로필은 정확히 하나의 노드에 의해 호스팅되어야 합니다 — 동일한 프로필의 두 호스트는 모든 소스 거래가 두 배로 미러링됨을 의미합니다(실제 돈 손실). 노드는 오고 갑니다(스케일링, 충돌, 롤링 업데이트), 그리고 우리는 별도의 조정자 서비스를 실행하고 유지하고 싶지 않습니다.
결정
각 CopyEngineSupervisor는 CopyProfiles 테이블에서 원자적 DB 리스로 프로필을 청구합니다:
- Claim — 원자적
ExecuteUpdate(또는 노드별 capping 시FOR UPDATE SKIP LOCKED)는 할당되지 않은 프로필 또는 리스가 lapsed된 프로필을 취합니다. 원자성은 두 개의 경합 supervisors가 절대 동일한 행을 청구하지 않음을 의미합니다. - Renew — 실시간 노드는 매 사이클마다 리스를 새로 고칩니다, 그래서 그것은 청구를 유지합니다.
- Reclaim — crashed 노드의 리스가 만료되고, 생존자는 다음 사이클에서 프로필을 픽업합니다(self-heal). graceful 셧다운에서 노드는 리스를 즉시 releases하므로 failover는 빠릅니다.
- Watchdog — 프로필이 여전히 우리의 것인 동안 태스크가 종료된 호스트는 재시작됩니다.
- Reconcile은 규모에서
UPDATE의 thundering herd를 피하기 위해 jittered됩니다.
결과
- 배포 또는 건강 유지할 독립형 조정자 없음 — Postgres는 단일 진실 소스입니다.
- 중복 복사는 애플리케이션 레벨 locking이 아닌 행 레벨 원자성에 의해 방지됩니다.
- Failover latency는 리스 TTL로 제한됩니다(fast-path graceful release를 제외하고).
- 이것은 자금 경로입니다; 결정론적 스트레스 스위트(DST)에 의해 보호됩니다 — DST 시나리오를 약하게 하지 마세요 그것을 만나게 하기 위해.