GH GambleHub

리더의 선택

1) 왜 당신은 지도자가 필요하고 그가 정당화 될 때

리더-중요한 작업을 수행 할 수있는 독점적 인 권한을 가진 노드: 크라운/ETL 시작, 파편 조정, 키 배포, 구성 변경. 불변량 ("한 출연자") 을 단순화하지만 위험 (SPOF, 재선거, 지연) 을 추가합니다.

다음과 같은 경우 리더십

실행의 독창성이 필요합니다 (예: 1 분에 한 번 청구 애그리 게이터).

변경 사항을 직렬화해야합니다 (구성 레지스터, 분산 잠금 장치)

클러스터 프로토콜은 리더십 복제 (Raft) 를 가정합니다.

다음과 같은 경우에

문제는 demempotence와 키로 순서대로 해결됩니다.
작업 도둑질/대기열을 통해 병렬화 할 수 있습니다.
"리더" 는 유일한 좁은 지점 (와이드 팬인) 이됩니다.

2) 기본 모델: 임대 + 쿼럼 + 시대

용어

임대: 리더는 T 초를받을 자격이 있습니다. 갱신해야합니다.
하트 비트: 주기적 확장/라이브 신호.

에코/용어: 단조롭게 리더십 수가 증가합니다. "오래된" 리더를 인식하도록 도와줍니다

펜싱 토큰: 리소스 소비자 (데이터베이스/스토리지) 가 이전 리더의 운영을 확인하고 거부하는 것과 동일한 모노톤 번호.

불변량

언제든지 하나의 실제 리더 (안전) 를 넘지 않아야합니다.
실패의 경우 진행이 가능합니다. 합리적인 시간에 새로운 것이 선출됩니다.
지도자 운영에는 시대가 동반됩니다. 싱크대는 새로운 시대 만 받아들입니다.

3) 알고리즘 및 프로토콜 개요

3. 1 뗏목 (리더십 복제)

상태: 추종자 → 후보자 → 리더.
타이머: 임의의 선거 시간 초과 (지터), 요청 투표; 리더는 AppendEntries를 심장 박동으로 유지합니다.
보증: 쿼럼, 표준 전제 조건에서 분할 뇌 없음, 논리적 단조로운 로그 북 (용어/지수).

3. 2 Paxos/Single-Decree/Multi-Paxos

합의의 이론적 근거; 실제로 - "선택된 코디네이터" (리더 아날로그) 가있는 변형 (예: Multi-Paxos).
직접 구현하기가 더 어렵습니다. 기성품 구현/라이브러리가 더 자주 사용됩니다.

3. 3 ZAB (ZooKeeper Atomic Broadcast)

ZK 메커니즘: 복구 단계를 이용한 리더십 저널 복제; 리더십과 같은 기본 요소를위한 시대 (zxid) 및 순차적 임시 노드.

3. 4 Bully/Chang-Roberts (반지/군주)

쿼럼이없는 정적 토폴로지에 대한 "훈련" 알고리즘. 부분 네트워크 장애/파티션을 고려하지 마십시오. 판매에는 적용되지 않습니다.

4) 실용적인 플랫폼

4. 1 주 키퍼

EPHEMERAL _ SEQUENTIAL 패턴: 프로세스가 '/leader/lock-XXXX '를 생성하면 최소 숫자가 리더입니다.
세션 노드 손실이 사라집니다. 재선택은 즉각적입니다.
"전임자" 를 기다리는 것을 통한 정의.

4. 2 etcd (래프트)

클러스터 수준 자체의 기본 리더십; 응용 프로그램의 경우-etcd 동시성: 'Session + Mutex/Election'.
임대 ID TTL, keepalive; 신기원을 핵심 값으로 저장할 수 있습니다.

4. 3 영사

'세션' + 'KV 획득': 키를 보유한 사람이 리더입니다. 세션에서 TTL/하트 비트.

4. 쿠 베르네 테스 4 명

조정 API를 임대합니다 ('조정. k8. io/v1 '): рес차원에서' Lease 'c' holderIdentity ',' leaseDurationSecones ',' 갱신 시간 '.
클라이언트 라이브러리 '리더십' (클라이언트 고) 은 캡처/갱신을 구현합니다. 리더 포드에 이상적입니다.

5) "안전한" 리더를 구축하는 방법

5. 1 시대와 펜싱을 유지하십시오

각 리드는 신기원을 증가시킵니다 (예: etcd/ZK 개정 zxid 또는 별도의 카운터).

리더의 모든 부작용 (데이터베이스에 쓰기, 작업 수행) 은 'epoch' 로 전송되고 비교되어야합니다

sql
UPDATE cron_state
SET last_run = now(), last_epoch =:epoch
WHERE name = 'daily-rollup' AND:epoch > last_epoch;

옛 지도자 (분할 뇌 후) 는 거부됩니다.

5. 타이밍 2 개

'leaseDerease' 및 '2-3 × heartbeatInterval + 네트워크 + p99 GC 일시 정지'.
선거 시간 초과-후보자가 충돌하지 않도록 무작위 (지터).
갱신이 손실되면 즉시 중요한 작업을 중단하십시오.

5. 3 정체성

'홀더 = 노드 # pid # startTime # rand'. 업데이트/제거시 동일한 홀더를 확인하십시오.

5. 감시자 4 명

모든 팔로어는 '임대/선거' 변경 사항을 구독하고 상태에 따라 시작/중지합니다.

6) 구현: 조각

6. 1 쿠 베르네 테스 (Go)

go import "k8s. io/client-go/tools/leaderelection"

lec:= leaderelection. LeaderElectionConfig{
Lock: &rl. LeaseLock{
LeaseMeta: metav1. ObjectMeta{Name: "jobs-leader", Namespace: "prod"},
Client:  coordClient,
LockConfig: rl. ResourceLockConfig{Identity: podName},
},
LeaseDuration: 15 time. Second,
RenewDeadline: 10 time. Second,
RetryPeriod:  2 time. Second,
Callbacks: leaderelection. LeaderCallbacks{
OnStartedLeading: func(ctx context. Context) { runLeader(ctx) },
OnStoppedLeading: func() { stopLeader() },
},
}
leaderelection. RunOrDie(context. Background(), lec)

6. 2 etcd (이동)

go cli, _:= clientv3. New(...)
sess, _:= concurrency. NewSession(cli, concurrency. WithTTL(10))
e:= concurrency. NewElection(sess, "/election/rollup")
_ = e. Campaign (ctx, podID )//blocking call epoch: = sess. Lease ()//use as part of fencing defer e. Resign(ctx)

6. 3 ZooKeeper (자바, 큐레이터)

java
LeaderSelector selector = new LeaderSelector(client, "/leaders/rollup", listener);
selector. autoRequeue();
selector. start(); // listener. enterLeadership () performs leader work with try/finally

7) 재선 및 서비스 악화

차트에서 리더 → "물고기 뼈" 의 날카로운 플래핑. 임대 기간/갱신 마감일을 늘리고 GC/CPU 톱을 제거하여 처리합니다.
재선택 기간 동안 브라운 아웃을 활성화하십시오. 배경 작업의 강도를 줄이거 나 확인 된 리더십으로 완전히 동결하십시오.
오랜 작업의 경우 리더 변경 후 체크 포인트 + demempotent dokat을 수행하십시오.

8) 분할 뇌: 외출 방법

정족수와 함께 CP 상점 (etcd/ZK/Consul) 을 사용하십시오. 정족수 없이는 리더를 잡을 수 없습니다.
쿼럼 중재자없이 AP 캐시에서 리더십을 구축하지 마십시오.
CP 모델에서도 자원 수준에서 펜싱을 유지하십시오. 이는 드문 비정상적인 시나리오 (일시 정지, 고착 된 운전자) 에 대한 보험입니다.

9) 관찰 및 운영

메트릭

'leadership _ is _ leader {app}' (게이지 0/1).
'election _ total {Result = won' lost 'regive}'.

(PHP 3 = 3.0.6, PHP 4)

'epoch _ 값' (클러스터 단조).
'flaps _ total' 은 창당 리더 이동 횟수입니다.
ZK/etcd의 경우: 복제 지연, 쿼럼 건강.

경고

빈번한 납 변경 (> 1 시간에 N).
갱신 실패 '갱신 '/높은 p99.
시대 불가능성 (다른 노드에서 두 개의 다른 시대).
X 초 이상의 리더가 없습니다 (비즈니스가 허용하지 않는 경우).

통나무/흔적

링크 이벤트: 'epoch', 'holderID', 'reason' (임대 손실, 세션이 만료 됨), '지속 시간 _ ms'.

10) 테스트 플레이 북 (게임 일)

파티션: 두 영역 사이의 네트워크를 끊으십시오. 정족수 부분에서만 리더십이 허용됩니다.
GC-stop: 인위적으로 5-10 초 동안 리더를 막습니다. 임대를 잃고 작업을 중단해야합니다.
시계 왜곡/드리프트: 정확성이 벽 시계에 의존하지 않도록하십시오 (펜싱/시대가 저장됨).
Kill -9: 갑작스런 리더 충돌 → 새로운 리더리스 기간.
저장 속도 저장: 디스크/래프트 로그 속도 저하-선거 시간 추정, 디버그 타이밍.

11) 반 패턴

펜싱과 쿼럼이없는 Redis의 SET NX PX를 통한 "리더".
'리즈 기간' 은 중요한 작동 기간의 p99 미만입니다.
리더십을 잃은 후 작업을 중단/계속합니다 ("1 분을 마치겠습니다").
선거 타이머의 지터 부족 → 선거 폭풍.
체크 포인트가없는 단일 긴 작업-각 플랩은 처음부터 다시 재생됩니다.
플랩이있는 바닥은 5xx가됩니다.

12) 구현 점검표

  • Quorum 중재자는 etcd/ZK/Consul/K8s Lease입니다.
  • 모든 리더 부작용에 시대/펜싱을 저장하고 전달하십시오.
  • 변형 된 타이밍은 네트워크/GC 마진이있는 '임대 기간', '갱신 마감일', '기간' 입니다.
  • 리더십이 상실되면 내장 감시자 및 올바른 종료.
  • 리더십 작업은 엄청나고 검문소입니다.
  • 메트릭/알림 및 로깅 'epoch/holderID' 가 활성화됩니다.
  • 게임 일 개최: 파티션, GC 스톱, 킬, 시계 왜곡.
  • 정치인들은 문서화되어있다: 누가/무엇을하는지, 누가 그를 대신 할 수 있는지, 신기한 갈등을 해결하는 방법.
[The] Degradation Plan: 리더리스 시스템이하는 일.
  • 성능 테스트: 부하 상태의 플랩은 SLO를 파괴하지 않습니다.

13) FAQ

Q: 쿼럼없이 리더십을 구축 할 수 있습니까?
A: prod에서 아닙니다. CP 구성 요소 (쿼럼) 또는 동등한 보증이있는 클라우드 서비스가 필요합니다.

Q: 임대가있는 이유는 무엇입니까?
A: 임대는 생존 가능성을 제공하지만 분리/일시 중지 후 "오래된 리더" 로부터 보호하지는 않습니다. Epoch/fencing은 구 지도자의 영향을 무효화합니다.

Q: K8의 타이밍 기본값은 무엇입니까?
A: 종종 'LeaseDeraes p99로드와 GC를 일치시킵니다.

Q: 현지에서 리더십을 어떻게 테스트합니까?

A: 3-5 개의 인스턴스를 실행하고, 네트워크 (tc/netem) 를 에뮬레이트하고, 일시 정지 (

Q: 리더를 바꿀 때 긴 작업으로 어떻게해야합니까?
A: Checkpoint + dempotent docat; 리더십이 상실된 경우-자원의 즉각적인 중지 및 방출.

14) 총계

안정적인 리더 선택은 쿼럼 중재자 + 시대의 훈련입니다. 하트 비트로 리더십을 유지하고 펜싱 토큰으로 모든 효과를 극복하고 마진으로 타이밍을 설정하고 리더의 작업을 엄청나게 관찰하고 정기적으로 충돌을 잃습니다. 그런 다음 "하나의 유일한" 공연자는 슬로건이 아니라 일시 정지, 네트워크 변덕 및 인적 오류에 저항하는 보장입니다.

Contact

문의하기

질문이나 지원이 필요하시면 언제든지 연락하십시오.우리는 항상 도울 준비가 되어 있습니다!

통합 시작

Email — 필수. Telegram 또는 WhatsApp — 선택 사항.

이름 선택 사항
Email 선택 사항
제목 선택 사항
메시지 선택 사항
Telegram 선택 사항
@
Telegram을 입력하시면 Email과 함께 Telegram에서도 답변드립니다.
WhatsApp 선택 사항
형식: +국가 코드 + 번호 (예: +82XXXXXXXXX).

버튼을 클릭하면 데이터 처리에 동의하는 것으로 간주됩니다.