Առաջնորդի ընտրությունը
1) Ինչո՞ ւ առաջնորդի կարիք կա, և երբ այն ընդհանուր առմամբ արդարացված է։
Առաջնորդը այն հանգույցն է, որն ունի բացառիկ իրավունք կրիտիկական գործողություններ կատարելու, կրոնի/ETL գործարկումը, շարքերի համակարգումը, կոդավորման բաշխումը, կազմաձևի փոփոխությունը։ Այն պարզեցնում է invariants («մեկ կատարող»), բայց ավելացնում է ռիսկերը (SPOF, պերե ընտրությունները, լագը)։
Օգտագործեք առաջնորդությունը, եթե
մենք պետք է կատարվենք (օրինակ, մեկ րոպեում մեկ անգամ բիլինգ ագրեգատորը);
անհրաժեշտ է փոփոխությունների սերիլիզացում (ներարկումներ, բաշխված արգելափակումներ);
կլաստերի արձանագրությունը ենթադրում է առաջնորդական կրկնօրինակում (Raft)։
Խուսափեք, եթե
խնդիրը լուծում է գաղափարախոսությունը և կարգուկանոնը։
կարող եք ներկել work-stealing/հերթով;
«առաջնորդը» դառնում է միակ նեղ կետը (լայն ֆան-in)։
2) Ռուսական մոդել 'leant + kvorum + դարաշրջան
Տերմինները
Least (վարձույթ), առաջնորդը ստանում է T վայրկյան իրավունք։ պետք է երկարացնել։
Heartbeat: պարբերական երկարացում/ազդանշան «կենդանի»։
Epoch/term (դարաշրջան, ժամանակահատվածը) 'միապաղաղ աճող ղեկավարության համարը։ Օգնում է ճանաչել «հին» առաջնորդներին։
Fencing token: նույն մոնոտոնային համարը, որը ստուգում է ռեսուրսի սպառողը (BD/պահեստ) և մերժում է հին առաջնորդի վիրահատությունը։
Invariants
Ցանկացած պահի ոչ ավելի քան մեկ իրական առաջնորդ (safety)։
Խնայողությունների դեպքում հնարավոր է առաջընթաց 'խելացի ժամանակի ընթացքում նոր (liveness)։
Առաջնորդի վիրահատությունները ուղեկցվում են դարաշրջանով։ կապույտները միայն նոր դարաշրջաններ են ընդունում։
3) Ալգորիթմների և ալգորիթմների ակնարկ
3. 1 Raft (առաջնորդական կրկնօրինակումը)
Վիճակը 'Follower no Candidate to Leader։
Թայմեր ՝ randium electime timeout (ջիտթեր), RequestVote; առաջնորդը պահում է AppendEntries որպես heartbeat։
Երաշխիքներ 'kvorum, split-brain բացակայություն ստանդարտ նախադրյալների ժամանակ, ամսագիր տրամաբանական մոնոտոնիայի հետ (term/index)։
3. 2 Paxos/Single-Decree / Multi-Paxos
Տեսական հիմքը։ գործնականում 'տատանումներ (e. g., Multi-Paxos) «ընտրված կոորդինատով» (առաջնորդի անալոգը)։
Ավելի բարդ է ուղիղ իրականացման համար։ ավելի հաճախ օգտագործվում են պատրաստի իրականացումներ/գրադարաններ։
3. 3 ZAB (ZooKeeper Atomic Broadcast)
ZK մեխանիզմը 'ամսագրի առաջնորդական կրկնօրինակումը վերականգնման փուլերով։ դարաշրջան (zxid) և հաջորդական էֆեմերական կոմպոզիցիաներ պրիմիտիվների համար, ինչպիսիք են առաջնորդությունը։
3. 4 Bully/Chang-Roberts (օղակներ/միապետներ)
«Կրթական» ալգորիթմներ ստատիկ տեղաբանության համար առանց կվորումի։ Հաշվի չառնեք ցանցի մասնակի ձախողումները/բաժանումը, մի օգտագործեք երկարության մեջ։
4) Գործնական հարթակներ
4. 1 ZooKeeper
Pattern EPHEMERAL _ SEQUENTIAL: Գործընթացը ստեղծում է '/leader/wwww.k-XXX ", նվազագույն համարը առաջնորդը։
Ռուսական հանգույցի նստաշրջանի կորուստը անհետանում է ռուսական փետուրային ընտրությունը ակնթարթորեն։
Արդարությունը «նախորդի» ակնկալիքի միջոցով։
4. 2 etcd (Raft)
National առաջնորդությունը հենց մրցույթի մակարդակում։ ծրագրերի համար 'etcd concurrency: «Session + Mutex/Election»։
Lease-ID с TTL, keepalive; դուք կարող եք պահել դարաշրջանը բանալին։
4. 3 Consul
"session '+" KV acquire ", ով պահում է բանալին, և առաջնորդը։ TTL/սրտաբաց նստաշրջանում։
4. 4 Kubernetes
Leases coordination API (`coordination. k8s. io/v1`): ресурс `Lease` c `holderIdentity`, `leaseDurationSeconds`, `renewTime`.
Հաճախորդների գրադարան 'leaderel.ru (client-go) իրականացնում է գրավումը/երկարացումը; իդեալական է ենթաօրենսդրական առաջնորդի համար։
5) Ինչպե՞ ս կառուցել «անվտանգ» առաջնորդ
5. 1 Պահպանեք դարաշրջանը և fencing
Յուրաքանչյուր առաջնորդություն ավելացնում է epoch (օրինակ, etcd/ZK zxid կամ առանձին հաշվիչ)։
Առաջնորդի բոլոր կողմնակի ազդեցությունները (ձայնագրությունը BD-ում, առաջադրանքների կատարումը) պարտավոր են փոխանցել «epoch» և համեմատել
sql
UPDATE cron_state
SET last_run = now(), last_epoch =:epoch
WHERE name = 'daily-rollup' AND:epoch > last_epoch;
Հին առաջնորդը (split-brain-ից հետո) կընդունի։
5. 2 Թայմինգներ
«Leance Duration '07' 2-3 www.hartbeate Interval + ցանցը + p99 GC դադար»։
Eltime timeout-ը ռանդոմալիզացիա է (ջիտտեր), որպեսզի թեկնածուները չմոռանան։
Երկարաձգումը կորցնելիս անմիջապես դադարեցնել կրիտիկական վիրահատությունները։
5. 3 Ինքնություն
`holderId = node#pid#startTime#rand`. Նորարարության/հեռացման ժամանակ նույն հոլդերը։
5. 4 Դիտորդներ (watchers)
Բոլոր հետևորդները ստորագրված են «Least/Election» փոփոխությունների վրա և սկսում են/դադարում են աշխատանքը համաձայն վիճակի։
6) Իրականացումներ ՝ բեկորներ
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) Պերե ընտրությունները և միգրանտների քայքայումը
Առաջնորդի կտրուկ ֆլամպինգները նկարագրում են «ձկները» գրաֆիկներում։ Այն բուժվում է Duration/renewDeadics-ի ավելացումով և GC/CPU-pil-ի վերացումով։
Պեր ընտրության ժամանակահատվածի համար միացրեք brownout 'նվազեցրեք ֆոնային խնդիրների ինտենսիվությունը կամ ամբողջովին սառեցրեք դրանք մինչև հաստատված leadership։
Երկար ջոբների համար պատրաստեք chekpoints + idempotent բժիշկ առաջնորդի փոփոխությունից հետո։
8) Split-brain: Ինչպես չմտնել
Օգտագործեք CP-105 (etcd/ZK/Consul) քվորումի հետ։ առանց կվորումի առաջնորդը չի կարող վերցնել։
Երբեք մի կառուցեք առաջնորդություն AP-cashe-ում առանց kvorum-ի։
Նույնիսկ CP-մոդելում պահեք fencing-ը ռեսուրսի մակարդակում, սա ապահովագրություն է հազվագյուտ ոչ վտանգավոր դեղամիջոցներից (դադարներ, որոնք բարձրացնում են վարորդները)։
9) Դիտողությունն ու շահագործումը
Մետրիկները
`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» -ը պատուհանի ետևում առաջնորդի հերթափոխն է։
ZK/etcd-ի համար 'վերարտադրության լագը, քվորումի առողջությունը։
Alerta
Առաջնորդի հաճախակի փոփոխությունը (> N մեկ ժամում)։
Երկարաձգման ձախողումները 'renew '/բարձր p99։
Epoch (երկու տարբեր դարաշրջաններ տարբեր հանգույցներում)։
Չկա առաջնորդ ավելի երկար X վայրկյանում (եթե բիզնեսը թույլ չի տալիս)։
Logs/treiss/
Լինկուլի իրադարձությունները '«epoch», «holium Id», «reason» (lost leason, session expired), «duration _ 108»։
10) Թեստային պլեյբուկները (Game Days)
Partium: Կոտրեք ցանցը երկու գոտիների միջև 'առաջնորդությունը միայն կվորումի հատվածում։
GC-stop: Արհեստականորեն կանգնեցրեք առաջնորդը 5-10s-ում, պետք է կորցնի վարձը և դադարեցնի աշխատանքը։
Clock skew/drift: համոզել, որ ճկունությունը կախված չէ wall-clock-ից (fencing/epoch փրկում է)։
Kill -9: առաջնորդի հանկարծակի քրեշը նոր առաջնորդը կներկայացնի ռուսական Duration-ի համար։
Slow storage: դանդաղեցրեք սկավառակները/log Raft - գնահատեք ընտրությունների ժամանակը, կարգաբերեք թայմինգները։
11) Anti-patterna
"Առաջնորդը" Redis 'XXNX PX "-ի միջոցով առանց ֆենչինգի և առանց քվորումի։
«Least Duration» -ը ավելի քիչ է, քան p99 կրիտիկական վիրահատության տևողությունը։
Կանգառ/շարունակություն առաջնորդության կորստից հետո («ևս մեկ րոպե dodele»)։
Ջիթերի բացակայությունը Elect-Timers-ում կանխատեսվում է ընտրությունների փոթորիկ։
Մեկ երկար ջոբա առանց chekpoints, յուրաքանչյուր ֆայլ հանգեցնում է զրոյից։
Առաջնորդության և ուղղորդման սերտ կապը առանց fallback-ի ստանում է 5xx։
12) Ներդրման չեկի ցուցակ
- Ընտրվել է քրոմը 'etcd/ZK/Consul/K8s Least։
- Մենք կառուցում ենք և փոխանցում epoch/fencing բոլոր կողմնակի ազդեցություններին։
- Timings: «Least Duration», «renewDead.ru», «retryPeriod», ցանցում/GC պահուստով։
- Ներկառուցված watchers և աշխատանքի ճիշտ կանգառը առաջնորդության կորստի ժամանակ։
- Idempotent-ի և chekpointation-ի առաջնորդական խնդիրները։
- Metriki/alerta և տրամաբանությունը «epoch/holium Id» ներառված են։
- game days: part.ru, GC-stop, kill, clock skew։
- Քաղաքական գործիչները փաստագրված են. Ո՞ վ/ինչ է անում առաջնորդը, ով կարող է փոխարինել այն, թե ինչպես կտրել epoch հակամարտությունները։
- Քայքայման պլանը 'ինչ է անում համակարգը առանց առաջնորդի։
- Արտադրողականության փորձարկումը 'flaps բեռի տակ SLO-ն չէ։
13) FAQ
Q 'Կարո՞ ղ է առաջնորդությունը կառուցել առանց կվորումի։
Ա 'Վաճառքում' ոչ։ Անհրաժեշտ է CP բաղադրիչ (kvorum) կամ ամպային ծառայություն, որը համարժեք է։
Q: Ինչու՞ է epoch-ը, եթե կա ձախ։
A: Least-ը կենդանի է ապահովում, բայց չի պաշտպանում «հին առաջնորդից» բաժանվելուց/դադարից հետո։ Epoch/fencing-ը դարձնում է հին առաջնորդի ազդեցությունը իրավաբանական։
Q 'Ի՞ նչ թաիմինգի դեֆոլտներ K8s-ում։
A 'Հաճախ օգտագործում են «Least Duration 2415s», «ReneWDeadance 2410s», «RetryPeriod 242s»։ Վերցրեք ձեր p99 բեռի և GC-ի տակ։
Q 'Ինչպե՞ ս փորձարկել առաջնորդությունը տեղական։
A 'SIGKILL, emulation ցանցը (tc/netem), դադարները (SIGSTOP), սպանեք առաջնորդին (SIGKILL), ստուգեք մետրիկները/լոգները/դարաշրջանները։
Q 'Ի՞ նչ անել երկար խնդիրների հետ առաջնորդի փոփոխության ժամանակ։
A: Chekpoint + idempotent բժիշկ; առաջնորդությունը կորցնելիս 'չարտոնված կանգառ և ռեսուրսների ազատումը։
14) Արդյունքները
Առաջնորդի հուսալի ընտրությունը դարաշրջանի կվորումի մրցավարն է։ Առաջնորդություն պահեք որպես heartbeat, bate բոլոր fencing-tocent էֆեկտները, տեղադրեք պահուստային թայմինգները, առաջնորդի առաջադրանքները դարձրեք համընդհանուր և դիտորդական, պարբերաբար կորցրեք ձախողումները։ Այդ ժամանակ «մեկ և միայն մեկ» կատարողը չի լինի կարգախոսը, այլ սարդերի, ցանցային քմահաճույքների և մարդկային սխալների դեմ։