Alegerea liderului
1) De ce aveți nevoie de un lider și când este justificat deloc
Leader - un nod care are dreptul exclusiv de a efectua acțiuni critice: pornirea unei coroane/ETL, coordonarea cioburilor, distribuirea cheilor, schimbarea configurației. Acesta simplifică invarianții („un singur performer”), dar adaugă riscuri (SPOF, realegere, lag).
Utilizați leadership dacă:- au nevoie de unicitate de execuție (de exemplu, un agregator de facturare o dată pe minut);
- Modificările trebuie serializate (registru de configurare, încuietori distribuite)
- protocolul clusterului presupune replicarea conducerii (Raft).
- problema este rezolvată prin idempotență și ordine la cheie;
- poate fi paralelizat prin furt de muncă/cozi;
- „lider” devine singurul punct îngust (fan-in larg).
2) Model de bază: leasing + cvorum + epocă
Termeni și condiții
Lease: Liderul are dreptul la secunde T; trebuie să reînnoiască.
Bătăile inimii: prelungire periodică/semnal live.
Epocă/termen: număr de conducere în creștere monotonă. Ajută la recunoașterea liderilor „vechi”.
Jetonul de scrimă: același număr monoton pe care consumatorul de resurse (bază de date/stocare) îl verifică și respinge operațiunile vechiului lider.
Invarianți
În orice moment, nu mai mult de un lider real (siguranță).
În caz de eșec, progresul este posibil: unul nou (viu) este ales într-un timp rezonabil.
Operațiunile leader sunt însoțite de o eră; sinky accepta doar epoci mai noi.
3) Prezentare generală a algoritmilor și protocoalelor
3. 1 plută (Replicarea Leadership)
Statut: Adept → Candidat → Lider.
Cronometre: timeout electoral aleatoriu (jitter), RequestVote; liderul deține AppendEntries ca bătăi ale inimii.
Garanții: cvorum, fără split-brain în condiții prealabile standard, jurnal de bord cu monotonie logică (termen/index).
3. 2 Paxos/Decret unic/Multi-Paxos
Baza teoretică a consensului; în practică - variații (de exemplu, Multi-Paxos) cu un „coordonator ales” (analog lider).
Mai greu de pus în aplicare direct; implementările/bibliotecile gata făcute sunt folosite mai des.
3. 3 ZAB (ZooKeeper Atomic Broadcast)
Mecanismul ZK: replicarea jurnalului de conducere cu faze de recuperare; epoci (zxid) și noduri efemere secvențiale pentru primitivi, cum ar fi conducerea.
3. 4 Bully/Chang-Roberts (Inele/Monarh)
Algoritmi „training” pentru topologii statice fără cvorum. Nu luați în considerare defecțiunile/partițiile de rețea parțiale - nu se aplică în vânzări.
4) Platforme practice
4. 1 ZooKeeper
EPHEMERAL_SEQUENTIAL model: procesul creează '/leader/lock-XXXX ', numărul minim este liderul.
Pierderea nodului ⇒ sesiune dispare ⇒ re-selecția este instantanee.
Justiţie prin aşteptarea „predecesorului”.
4. 2 etcd (Plută)
Leadership nativ la nivelul clusterului în sine; pentru aplicații - etcd concurență: 'Sesiune + Mutex/Alegeri'.
Lease-ID с TTL, keepalive; Puteți stoca o epocă într-o valoare cheie.
4. 3 Consul
„sesiune” + „KV dobândi”: oricine deține cheia este liderul. TTL/bătăi ale inimii în sesiune.
4. 4 Kubernetes
Leases coordonation API ("coordonare. k8s. io/v1 '): ресурс' Lease 'c' holderIdentity ',' leaseDurationSeconds', 'renewTime'.
Biblioteca client 'leaderelection' (client-go) implementează capturarea/reînnoirea; ideal pentru lider-păstăi.
5) Cum de a construi un lider „sigur”
5. 1 Păstrați epoca și scrima
Fiecare plumb crește epoca (de ex. etcd/ZK revizuire zxid sau contor separat).
Toate efectele secundare ale liderului (scrierea în baza de date, îndeplinirea sarcinilor) trebuie transmise „epocă” și comparate:sql
UPDATE cron_state
SET last_run = now(), last_epoch =:epoch
WHERE name = 'daily-rollup' AND:epoch > last_epoch;
Vechiul lider (după split-creier) va fi respins.
5. 2 Calendare
'leaseDuration' ≥ '2-3 × heartbeatInterval + rețea + pauză p99 GC'.
Timpul electoral - randomiza (jitter), astfel încât candidații să nu se ciocnească.
Dacă reînnoirea este pierdută, opriți imediat operațiunile critice.
5. 3 Identitate
'holderId = nod # pid # startTime # rand'. Când actualizați/eliminați, verificați același suport.
5. 4 Observatori
Toti adeptii se aboneaza la modificarile 'Lease/Election' si incep/opresc conform statutului.
6) Implementări: fragmente
6. 1 Kubernetes (Du-te)
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 (Du-te)
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, Curator)
java
LeaderSelector selector = new LeaderSelector(client, "/leaders/rollup", listener);
selector. autoRequeue();
selector. start(); // listener. enterLeadership () performs leader work with try/finally
7) Realegerea şi degradarea serviciilor
Flapsuri ascuțite ale liderului → „os de pește” în diagrame. Tratat prin creșterea leasingDuration/renewDeadline și eliminarea ferăstraie GC/CPU.
Pentru perioada de re-selecție, activați brownout: reduceți intensitatea sarcinilor de fundal sau înghețați-le complet la o conducere confirmată.
Pentru locuri de muncă lungi, face puncte de control + idempotent dokat după o schimbare de lider.
8) Split-creier: Cum să stai afară
Utilizați magazinele CP (etcd/ZK/Consul) cu cvorum; nu poţi lua un lider fără cvorum.
Nu construi leadership pe un cache AP fără un arbitru cvorum.
Chiar și în modelul CP, păstrați scrima la nivelul resurselor - aceasta este o asigurare împotriva scenariilor anormale rare (pauze, șoferi blocați).
9) Observabilitate și funcționare
Măsurători
'leadership _ is _ leader {app}' (ecartament 0/1).
'election _ total {result = won' lost 'resign'.
'lease _ renew _ latency _ ms {p50, p95, p99}', 'lease _ renew _ fail _ total'.
'epoch _ value' (monotonie cluster).
„flaps _ total” este numărul de ture de lider pe fereastră.
Pentru ZK/etcd: replicare lag, sănătate cvorum.
Alerte
Schimbare frecventă de plumb (> N într-o oră).
Eșecuri de reînnoire „reînnoire ”/p99 ridicat.
infezibilitatea epocii (două epoci diferite la noduri diferite).
Nu există lider mai mult de X secunde (în cazul în care afacerea nu permite).
Jurnale/Trasee
Evenimente link: 'epoch', 'holderId',' reason '(leasing pierdut, sesiune expirată),' duration _ ms'.
10) Cărți de joc de testare (Zilele jocului)
Partiție: rupe rețeaua între 2 zone - conducerea este permisă numai în partea de cvorum.
GC-stop: opriți artificial liderul pentru 5-10 - ar trebui să piardă contractul de închiriere și să nu mai funcționeze.
Înclinare/derivă ceas: Asigurați-vă că corectitudinea nu depinde de ceas de perete (garduri/epocă este salvat).
Kill -9: Accident de lider brusc → noul lider ≤ leasingDuration.
Stocare lentă: încetiniți discurile/jurnalul Raft - estimați timpul alegerilor, temporizările de depanare.
11) Anti-modele
„Leader” prin Redis 'SET NX PX' fără scrimă și cvorum.
„leaseDuration” este mai mică decât p99 din durata critică de funcționare.
Oprirea/continuarea muncii după pierderea conducerii („Voi termina un minut”).
Lipsa de nervozitate în cronometre electorale → furtuna electorală.
O singură lucrare lungă fără puncte de control - fiecare clapetă are ca rezultat o reluare de la zero.
Legătura strânsă de conducere și rutarea traficului (lipicios) fără rezervă - fundurile cu clapa primesc 5xx.
12) Lista de verificare a implementării
- Cvorum arbitru selectat este etcd/ZK/Consul/K8s Leasing.
- Depozitați și treceți epoca/gardul în toate efectele secundare ale liderului.
- Temporizările configurate sunt 'leaseDuration', 'renewDeadline', 'retryPeriod' cu marjă de rețea/GC.
- Observatori încorporați și închiderea corectă atunci când conducerea este pierdută.
- Sarcinile de conducere sunt idempotente și punct de control.
- Metrica/alerte și logarea "epoch/holderId' sunt activate.
- A avut loc zile de joc: partiție, GC-stop, ucide, ceas înclinare.
- Politicienii sunt documentați: cine/ce face liderul, cine îl poate înlocui, cum să rezolve conflictele epocale.
[Planul de degradare]: Ce face un sistem fără lider.
- Testul de performanță: clapetele sub sarcină nu distrug SLO.
13) ÎNTREBĂRI FRECVENTE
Î: Poate fi construit un leadership fără cvorum?
R: În prod, nu. Aveți nevoie de o componentă CP (cvorum) sau un serviciu cloud cu garanții echivalente.
Î: De ce epocă dacă există închiriere?
R: Închirierea oferă supraviețuire, dar nu protejează împotriva „vechiului lider” după separare/pauze. Epoca/scrima invalidează efectele vechiului lider.
Î: Care sunt valorile implicite ale temporizărilor în K8s?
R: Adesea folosit „LeaseDuration≈15s”, „RenewDeadline≈10s”, „RetryPeriod≈2s”. Potriviți sarcina p99 și GC.
Î: Cum testați conducerea la nivel local?
R: Executați 3-5 instanțe, emulați rețeaua (tc/netem), pauză (SIGSTOP), ucideți liderul (SIGKILL), verificați valorile/jurnalele/epocile.
Î: Ce trebuie să faceți cu sarcinile lungi atunci când schimbați liderii?
A: Checkpoint + idempotent docat; în cazul pierderii conducerii - oprirea imediată și eliberarea resurselor.
14) Totaluri
O alegere de încredere a liderului este un arbitru cvorum + disciplina de epoci. Păstrați conducerea ca un contract de închiriere cu o bătaie de inimă, bate toate efectele cu un jeton de scrimă, a stabilit temporizări cu o marjă, face sarcinile liderului idempotent și observabil, pierde în mod regulat accidente. Apoi, „unul și numai unul” interpret nu va fi un slogan, ci o garanție care este rezistent la pauze, capricii de rețea și erori umane.