Көшбасшыны таңдау
1) Көшбасшы не үшін қажет және ол қашан ақталады
Көшбасшы - сыни әрекеттерді орындауға айрықша құқығы бар торап: крон/ETL іске қосу, шардтарды үйлестіру, кілттерді бөлу, конфигурацияны өзгерту. Ол инварианттарды жеңілдетеді («бір орындаушы»), бірақ тәуекелдерді қосады (SPOF, қайта сайлау, лаг).
Егер:- орындаудың жалғыз болуы қажет (мысалы, биллинг-агрегатор минутына бір рет);
- өзгерістерді серилизациялау талап етіледі (конфигурациялар тізілімі, бөлінген блоктау);
- кластерлік хаттама көшбасшылық репликацияны (Raft) көздейді.
- проблеманы идемпотенттілік және кілт бойынша тәртіп шешеді;
- work-stealing/кезек арқылы араластыруға болады;
- «көшбасшы» жалғыз тар нүктеге айналады (кең фан-ин).
2) Базалық модель: lease + кворум + дәуір
Терминдер
Lease (жалға алу): көшбасшы T секундқа құқық алады; ұзартуға міндетті.
Heartbeat: мерзімді ұзарту/« тірі »сигналы.
Epoch/term (дәуір, мерзім): көшбасшылықтың монотонды өсу нөмірі. Ескі көшбасшыларды анықтауға көмектеседі.
Fencing token: ресурсты тұтынушы (ДҚ/сақтау орны) тексеретін және ескі басшының операцияларын қабылдамайтын сол бір қалыпты нөмір.
Инварианттар
Кез келген сәтте бір ғана нақты көшбасшы (safety).
Жаңылыс кезінде ілгерілеу болуы мүмкін: ақылға қонымды уақыт ішінде жаңа (liveness) таңдалады.
Көшбасшының операциялары дәуірмен қатар жүреді; синктер тек жаңа дәуірлерді ғана қабылдайды.
3) Алгоритмдер мен хаттамаларға шолу
3. 1 Raft (көшбасшылық репликалау)
Күйі: Follower → Candidate → Leader.
Таймерлер: random election timeout (джиттер), RequestVote; көшбасшы AppendEntries-ді heartbeat ретінде ұстайды.
Кепілдіктер: кворум, стандартты алғышарттар кезінде split-brain болмауы, логикалық монотониясы бар журнал (term/index).
3. 2 Paxos/Single-Decree / Multi-Paxos
Консенсустың теориялық негізі; тәжірибеде - вариациялар (е. g., Multi-Paxos) «таңдалған үйлестірушімен» (көшбасшының аналогы).
Тікелей іске асыру үшін қиын; дайын сату/кітапханалар жиі пайдаланылады.
3. 3 ZAB (ZooKeeper Atomic Broadcast)
ZK тетігі: қалпына келтіру фазалары бар журналдың көшбасшылық репликациясы; дәуірлер (zxid) және көшбасшылық сияқты примитивтерге арналған тізбекті эфемерлік тораптар.
3. 4 Bully/Chang-Roberts (сақина/монарх)
Кворумсыз статикалық топологияларға арналған «оқу» алгоритмдері. Желінің ішінара істен шығуы/бөлінуі ескерілмейді - өнімдегі қолданбаңыз.
4) Практикалық платформалар
4. 1 ZooKeeper
EPHEMERAL_SEQUENTIAL үлгісі: процесс '/leader/lock-XXXX 'жасайды, ең кіші нөмір - көшбасшы.
Сессияны жоғалту ⇒ торап жоғалады ⇒ қайта таңдау жылдам.
«Алдындағыны» күту арқылы әділеттілік.
4. 2 etcd (Raft)
Кластер деңгейіндегі ұлттық көшбасшылық; қолданбалар үшін - 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`.
'leaderelection' (client-go) клиенттік кітапханасы басып алуды/ұзартуды іске асырады; табан көшбасшылар үшін тамаша.
5) «Қауіпсіз» көшбасшыны қалай құру керек
5. 1 Дәуірді және fencing сақтаңыз
Әрбір көшбасшылық кезеңді ұлғайтады (мысалы, etcd/ZK zxid ревизиясы немесе жеке санауыш).
Көшбасшының барлық жанама әсерлерін (ДБ-ға жазу, міндеттерді орындау) «epoch» беруге және:sql
UPDATE cron_state
SET last_run = now(), last_epoch =:epoch
WHERE name = 'daily-rollup' AND:epoch > last_epoch;
Ескі басшы (split-brain кейін) қабылданбайды.
5. 2 Таймингтер
'leaseDuration' ≥ '2-3 × heartbeatInterval + желі + p99 GC-үзіліс'.
Election timeout - кандидаттардың қақтығыспауы үшін рандомизация (джиттер).
Ұзартуды жоғалтқан кезде - күрделі операцияларды дереу тоқтату.
5. 3 Сәйкестігі
`holderId = node#pid#startTime#rand`. Жаңарту/алып тастау кезінде сол holderді салыстырып тексеріңіз.
5. 4 Бақылаушылар (watchers)
Барлық ізбасарлар 'Lease/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) Қайта сайлау және сервистің тозуы
Кестедегі көшбасшының → «балық сүйегінің» өткір флаппингі. leaseDuration/renewDeadline ұлғаюымен және GC/CPU-араны жоюмен емделеді.
Қайта таңдау кезінде brownout бағдарламасын қосыңыз: фондық тапсырмалардың қарқындылығын төмендетіңіз немесе оларды расталған leadership дейін толық мұздатыңыз.
Ұзақ джобтар үшін басшы ауысқаннан кейін чек пункттерін + демпотенттік докат жасаңыз.
8) Split-brain: қалай түспеу керек
Кворумы бар CP-сақтау орнын (etcd/ZK/Consul) пайдаланыңыз; көшбасшыны кворумсыз алуға болмайды.
Кворум төрешісінсіз AP-кэште ешқашан көшбасшылық жасамаңыз.
Тіпті CP-модельде фенсингті ресурс деңгейінде ұстаңыз - бұл сирек штаттан тыс сценарийлерден сақтандыру (үзілістер, ілініп тұрған драйверлер).
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 үшін: репликация, кворум денсаулығы.
Алерттар
Көшбасшының жиі ауысуы (> сағат үшін N).
Ұзарту сәтсіздігі 'renew '/жоғары p99.
Сәйкессіздік (әр түрлі тораптардағы екі түрлі дәуір).
X секундтан артық көшбасшы жоқ (егер бизнес рұқсат бермесе).
Логи/трейстер
'epoch', 'holderId', 'reason' (lost lease, session expired), 'duration _ ms' оқиғаларына сілтеме жасаңыз.
10) Тест-плейбуктер (Game Days)
Partition: 2 аймақ арасындағы желіні үзіңіз - көшбасшылыққа кворум бөлігінде ғана рұқсат етіледі.
GC-stop: көшбасшыны 5-10с жасанды түрде тоқтатыңыз - жалдаудан айрылып, жұмысты тоқтату керек.
Clock skew/drift: дұрыстығы wall-clock (fencing/epoch сақтайды) тәуелді еместігіне көз жеткізіңіз.
Kill -9: лидердің кенеттен қисаюы → leaseDuration ≤ үшін жаңа көшбасшы.
Slow storage: Raft дискілерін/журналын баяулатыңыз - сайлау уақытын бағалаңыз, таймингтерді реттеңіз.
11) Қарсы үлгілер
«Көшбасшы» Redis 'SET NX PX' fencing жоқ және кворумсыз.
'leaseDuration' p99 сыни әрекет ұзақтығынан аз.
Көшбасшылықты жоғалтқаннан кейін жұмысты тоқтату/жалғастыру («тағы бір минут аяқтаймын»).
Election-таймерлерде джиттердің болмауы → сайлау дауылы.
Чекпоинтсіз бірыңғай ұзын джоб - әрбір флап нөлден бастап қайталануға әкеледі.
fallback-сіз көшбасшылық пен трафикті бағыттаудың (sticky) тығыз байланысы - флапта 5xx алады.
12) Енгізу чек-парағы
- Кворум төрешісі таңдалды: etcd/ZK/Consul/K8s Lease.
- Көшбасшының барлық жанама әсерлеріне epoch/fencing сақтаймыз және береміз.
- Таймингтер бапталған: 'leaseDuration', 'renewDeadline', 'retryPeriod' желі/GC.
- Watchers орнатылған және көшбасшылықты жоғалтқан кезде жұмысты дұрыс тоқтату.
- Көшбасшылық міндеттер демпотентті және чекпоинцияланады.
- Метриктер/алерттар және 'epoch/holderId' логині қосылған.
- Өткізілген game days: partition, GC-stop, kill, clock skew.
- Саясаткерлер құжатталған: көшбасшы кім/не істейді, оны кім ауыстыра алады, қақтығыстарды қалай күшейту керек.
- Тозу жоспары: жүйе көшбасшысыз не істейді.
- Өнімділік сынағы: жүктемедегі flaps SLO-ны бұзбайды.
13) FAQ
Q: Көшбасшылықты кворумсыз құруға бола ма?
А: Өнімде - жоқ. CP-компонент (кворум) немесе эквивалентті кепілдіктері бар бұлтты сервис қажет.
Q: lease бар болса, неге енді?
A: Lease өміршеңдікті қамтамасыз етеді, бірақ бөлгеннен/үзілістен кейін «ескі көшбасшыдан» қорғамайды. Epoch/fencing ескі көшбасшының әсерлерін жарамсыз етеді.
Q: K8s таймингтердің қандай дефолттары бар?
A: Жиі пайдаланылады 'LeaseDuration ≈ 15s', 'RenewDeadline ≈ 10s', 'RetryPeriod ≈ 2s'. p99 жүктемеңізге және GC-ге таңдаңыз.
Q: Жергілікті көшбасшылықты қалай тестілеуге болады?
A: 3-5 инстанцияларды іске қосыңыз, желіні эмульсиялаңыз (tc/netem), паузалар (SIGSTOP), лидерді өлтіріңіз (SIGKILL), метриканы/логиді/дәуірді тексеріңіз.
Q: Көшбасшыны ауыстырған кезде ұзақ міндеттерді не істеу керек?
А: Чекпоинт + демпотенттік докат; көшбасшылықтан айырылған кезде - ресурстарды дереу тоқтату және босату.
14) Қорытынды
Көшбасшыны сенімді таңдау - бұл кворумды төреші + дәуір тәртібі. Көшбасшылықты heartbeat-пен жалға алу ретінде ұстаңыз, fencing-токеннің барлық әсерлерін жеңіңіз, таймингтерді резервпен теңшеңіз, көшбасшының міндеттерін демпотентті және бақыланатын етіңіз, үнемі ақауларды жоғалтыңыз. Сонда «бір ғана» орындаушы ұран емес, үзілістерге, желілік қынжылдықтар мен адам қателіктеріне төзімді кепіл болады.