Lider seçimi
1) Nə üçün lider lazımdır və ümumiyyətlə bəraət aldıqda
Lider kritik hərəkətləri yerinə yetirmək üçün eksklüziv hüququ olan bir qovşaqdır: kronun/ETL-nin işə salınması, şardların koordinasiyası, açarların paylanması, konfiqurasiyanın dəyişdirilməsi. O, invariantları sadələşdirir («bir ifaçı»), lakin riskləri əlavə edir (SPOF, təkrar seçkilər, laq).
Əgər liderlik istifadə edin:- yalnız icra lazımdır (məsələn, dəqiqədə bir dəfə billing aqreqator);
- dəyişikliklərin serilizasiyası tələb olunur (konfiqurasiya reyestri, paylanmış kilidlər);
- klaster protokolu liderlik replikasiyasını (Raft) nəzərdə tutur.
- problemi idempotentlik və açar qaydası həll edir;
- work-stealing/növbələr vasitəsilə paralelləşdirilə bilər;
- «lider» yeganə dar nöqtəyə çevrilir (geniş fan-in).
2) Əsas model: lease + kvorum + epoxa
Terminlər
Lease (icarə): lider T saniyə hüququ alır; yeniləməlidir.
Heartbeat: dövri yeniləmə/siqnal «canlı».
Epoch/term (epoxa, müddət): monoton artan liderlik nömrəsi. Köhnə liderləri tanımağa kömək edir.
Fencing token: resurs istehlakçısını (DB/saxlama) yoxlayan və köhnə liderin əməliyyatlarını rədd edən eyni monoton nömrə.
İnvariantlar
Hər an ən çox bir həqiqi lider (safety).
Uğursuzluq baş verərsə, irəliləyiş mümkündür: ağlabatan zamanda yeni (liveness) seçilir.
Liderin əməliyyatları epoxa ilə müşayiət olunur; Sinki yalnız yeni dövrlər alır.
3) Alqoritmlər və protokolların icmalı
3. 1 Raft (liderlik replikasiyası)
Hallar: Follower → Candidate → Lider.
Zamanlayıcılar: random election timeout (jitter), RequestVote; lider bir heartbeat kimi AppendEntries saxlayır.
Zəmanət: kvorum, standart şərtlər altında split-brain olmaması, məntiqi monotoniyalı jurnal (term/index).
3. 2 Paxos/Single-Decree / Multi-Paxos
Konsensusun nəzəri əsası; praktikada - variasiyalar (e. g., Multi-Paxos) «seçilmiş koordinator» ilə (liderin analoqu).
Birbaşa həyata keçirmək daha çətindir; daha çox hazır tətbiqlər/kitabxanalar istifadə olunur.
3. 3 ZAB (ZooKeeper Atomic Broadcast)
ZK mexanizmi: bərpa mərhələləri ilə jurnalın lider replikasiyası; eralar (zxid) və liderlik kimi primitivlər üçün ardıcıl efemer düyünlər.
3. 4 Bully/Chang-Roberts (üzüklər/monarx)
Kvorum olmadan statik topologiyalar üçün «təlim» alqoritmləri. Qismən şəbəkə uğursuzluqları/bölünmələri nəzərə alınmır - prodda tətbiq etməyin.
4) Praktik platformalar
4. 1 ZooKeeper
Model EPHEMERAL_SEQUENTIAL: proses '/leader/lock-XXXX 'yaradır, minimum nömrə liderdir.
Seans itkisi ⇒ düyün yox olur ⇒ yenidən seçimi ani.
«sələfi» gözləməklə ədalət.
4. 2 etcd (Raft)
Klaster səviyyəsində yerli liderlik; tətbiqlər üçün - etcd concurrency: 'Session + Mutex/Election'.
Lease-ID с TTL, keepalive; dövrü açar mənasında saxlaya bilərsiniz.
4. 3 Consul
'session' + 'KV acquire': açarı tutan liderdir. Sessiyada TTL/ürək döyüntüsü.
4. 4 Kubernetes
Leases coordination API (`coordination. k8s. io/v1`): ресурс `Lease` c `holderIdentity`, `leaseDurationSeconds`, `renewTime`.
'leaderelection' (client-go) müştəri kitabxanası tutma/yeniləmə həyata keçirir; pot lideri üçün idealdır.
5) «təhlükəsiz» lider qurmaq üçün necə
5. 1 Dövrü və fencing saxlayın
Hər bir liderlik epoch artırır (məsələn, etcd/ZK zxid yoxlama və ya ayrıca sayğac).
Liderin bütün yan təsirləri (DB-də qeyd, tapşırıqların icrası) "epoch 'u ötürməli və müqayisə edilməlidir:sql
UPDATE cron_state
SET last_run = now(), last_epoch =:epoch
WHERE name = 'daily-rollup' AND:epoch > last_epoch;
Köhnə lider (sonra split-brain) rədd ediləcək.
5. 2 Tayminqlər
'leaseDuration' ≥ '2-3 × heartbeatInterval + şəbəkə + p99 GC-fasilə'.
Election timeout - namizədlərin toqquşmaması üçün randomize (jitter).
Yeniləmə itirildikdə - kritik əməliyyatları dərhal dayandırın.
5. 3 Kimlik
`holderId = node#pid#startTime#rand`. Yeniləmə/çıxarma zamanı eyni holderi yoxlayın.
5. 4 Müşahidəçilər (watchers)
Bütün izləyicilər 'Lease/Election' dəyişikliklərinə abunədirlər və vəziyyətə uyğun olaraq işə başlayırlar/dayandırırlar.
6) Həyata keçirilmə: fraqmentlər
6. 1 Kubernetes (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)
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) Təkrar seçim və xidmətin deqradasiyası
Liderin kəskin fappinqləri → qrafiklərdə «balıq sümüyü». leaseDuration/renewDeadline artırılması və GC/CPU-pil aradan qaldırılması ilə müalicə olunur.
Yenidən seçim müddətində brownout-u açın: arxa plan tapşırıqlarının intensivliyini azaltın və ya təsdiqlənmiş leadership-ə qədər tamamilə dondurun.
Uzun joblar üçün lider dəyişdikdən sonra çek nöqtələri + idempotent dokat edin.
8) Split-brain: vurmamaq üçün necə
Kvorum ilə CP saxlama (etcd/ZK/Consul) istifadə edin; lider kvorumu olmadan götürmək olmaz.
Heç vaxt hakim kvorum olmadan AP cache üzərində liderlik qurmaq.
Hətta CP modelində fencinqi resurs səviyyəsində saxlayın - bu nadir qeyri-adi ssenarilərə (fasilələr, asılı sürücülər) qarşı sığortadır.
9) Müşahidə və istismar
Metrika
`leadership_is_leader{app}` (gauge 0/1).
`election_total{result=won|lost|resign}`.
`lease_renew_latency_ms{p50,p95,p99}`, `lease_renew_fail_total`.
'epoch _ value'.
'flaps _ total' - pəncərə arxasında liderin növbə sayı.
ZK/etcd üçün: replikasiya gecikməsi, kvorum sağlamlığı.
Alertlər
Liderin tez-tez dəyişməsi (> Saat başına N).
Yeniləmə uğursuzluqları 'renew '/yüksək p99.
Epoch uyğunsuzluğu (müxtəlif düyünlərdə iki fərqli dövr).
X saniyədən artıq lider yoxdur (əgər biznes icazə vermirsə).
Log/Trade
Hadisələri link edin: 'epoch', 'holderId', 'reason' (lost lease, session expired), 'duration _ ms'.
10) Test Playbook (Game Days)
Partition: 2 zona arasında şəbəkəni kəsin - liderliyə yalnız kvorum hissəsində icazə verilir.
GC-stop: süni 5-10s liderini dayandırın - icarəni itirməli və işini dayandırmalıdır.
Clock skew/drift: düzgün wall-clock asılı olmadığından əmin olun (fencing/epoch xilas).
Kill -9: qəfil crash lideri → leaseDuration ≤ üçün yeni lider.
Slow storage: disk/log Raft yavaşlatmaq - seçki vaxtını qiymətləndirmək, zamanlama hata.
11) Anti-nümunələr
Redis 'SET NX PX' vasitəsilə «lider» fencing olmadan və kvorum olmadan.
'leaseDuration' p99 kritik əməliyyat müddəti az.
Liderliyinizi itirdikdən sonra işinizi dayandırın/davam etdirin («bir dəqiqə daha bitirəcəyəm»).
Election-zamanlayıcılarda jitter olmaması → fırtına seçkiləri.
Yoxlama nöqtələri olmadan vahid uzun job - hər flap sıfırdan təkrarlanmasına səbəb olur.
Liderlik və trafik marşrutu (sticky) ilə fallback olmadan sıx əlaqə - flape pod 5xx alır.
12) Giriş çek siyahısı
- Kvorum hakimi seçildi: etcd/ZK/Consul/K8s Lease.
- Liderin bütün yan təsirlərinə epoch/fencing saxlayın və ötürün.
- Tayminqlər: 'leaseDuration', 'renewDeadline', 'retryPeriod' şəbəkə ehtiyatı ilə/GC.
- Daxili watchers və liderlik itirdikdə düzgün dayandırılması.
- Liderlik vəzifələri idempotentdir və yoxlanılır.
- Metriklər/Alertlər və Loging 'epoch/holderId' daxildir.
- Keçirilmiş game days: partition, GC-stop, kill, clock skew.
- Siyasətlər sənədləşdirilmişdir: lider kim/nə edir, kim onu əvəz edə bilər, necə epoch münaqişələri sürətləndirmək.
- Deqradasiya planı: sistem lider olmadan nə edir.
- Performans testi: yük altında flaps SLO-nu məhv etmir.
13) FAQ
Q: Liderlik kvorum olmadan qurula bilərmi?
A: Prod - yox. Ekvivalent zəmanətləri olan bir CP komponenti (kvorum) və ya bulud xidməti lazımdır.
Q: lease varsa niyə epoch?
A: Lease canlılığı təmin edir, lakin ayrıldıqdan/fasilələrdən sonra «köhnə liderdən» qorunmur. Epoch/fencing köhnə liderin təsirlərini etibarsız edir.
Q: K8s tayming defoltları nələrdir?
A: Tez-tez istifadə olunur 'LeaseDuration ≈ 15s', 'RenewDeadline ≈ 10s', 'RetryPeriod ≈ 2s'. P99 yük və GC üçün seçin.
S: Yerli liderliyi necə test etmək olar?
A: 3-5 instans başlayın, şəbəkəni emulasiya edin (tc/netem), fasilələr (SIGSTOP), lideri öldürün (SIGKILL), metrik/log/dövrü yoxlayın.
Q: Lider dəyişərkən uzun vəzifələrlə nə etmək lazımdır?
A: Checkpoint + idempotent dokat; liderliyi itirdikdə - dərhal dayandırın və resursları boşaltın.
14) Nəticələr
Liderin etibarlı seçimi kvorum hakimi + dövrlərin intizamıdır. heartbeat ilə icarə kimi liderliyi saxlayın, fencing tokeninin bütün effektlərini vurun, zamanlayıcıları ehtiyat ilə konfiqurasiya edin, liderin vəzifələrini idempotent və müşahidə edin, müntəzəm olaraq uğursuzluqları itirin. Sonra «bir və yalnız bir» ifaçı şüar deyil, fasilələrə, şəbəkə şıltaqlıqlarına və insan səhvlərinə davamlı bir zəmanət olacaq.