dbit.one© 2026
000
booting_
Loading experience0%
dbit.one

Master qulaydi: maʼlumotlaringiz bilan aslida nima boʻladi

Qisqasi: «bizda uch tugunli klaster bor» — bu tizimning xossasi emas, konfiguratsiya tavsifi. Xossa kimdir tekshirgandan keyin paydo boʻladi: tarmoq boʻlinganda ikki tugun bir vaqtda oʻzini bosh deb hisoblamasligini va mijozga tasdiqlangan yozuv qulagan lider bilan birga yoʻqolmasligini. Buni serverni qoʻlda oʻchirib emas, simulyatsiya bilan tekshiriladi.

9 daqiqa o‘qish

Qisqacha

  • «Replikalar bor» va «tasdiqlangan maʼlumot yoʻqolmaydi» — turli daʼvolar. Ikkinchisi konfiguratsiya haqida emas, bajarilishlar haqida.
  • «Masterni oʻchiramiz» degan qoʻlbola tekshiruv nihoyatda katta fazodan bitta jadvalni oʻynaydi va takrorlanmaydi.
  • Determinlashgan simulyatsiya boʻlinishlar, qulashlar va xabarlar tartibini siddan oladi: topilgan nosozlik manzilga ega boʻladi.
  • Testning oʻzini ham tekshirish kerak. Xatolar muzeyi algoritmning bitta qoidasini oʻchiradi va xarnessdan uni sid bilan tutishni talab qiladi.

Sizga nima sotildi va siz nima sotib oldingiz

«Nosozlikka chidamli klaster», «replikatsiya», «avtomatik oʻtish» — bularning hammasi tizim qanday yigʻilganini tasvirlaydi. Pulga tegishli savol boshqacha yangraydi: agar hozir mijozga yozuvni tasdiqlagan tugun qulasa, yangi lider koʻtarilgach oʻsha yozuv tizimda qoladimi?

«Bizda uchta replika bor» bilan «tasdiqlangan narsa yoʻqolmaydi» oʻrtasida konsensus algoritmi turadi — Raft, Paxos, ZAB. U ikki savolga javob beradi: hozir kim bosh va nimani qayd etilgan deb hisoblash kerak. Undagi xato xatoga oʻxshamaydi. Tizim ishlaydi, javob beradi, metrikalar yashil — faqat millionta bajarilishdan birida mijozga «saqlandi» deyilgan, yozuv esa yoʻq.

Tasdiqlangan yozuvni yoʻqotishning toʻrt yoʻli

Toʻrttasi ham ekzotika emas. Har birining Raft maqolasida oʻz boʻlimi bor, boʻlimlar esa shunchaki yozilmaydi: demak, ravshan koʻrinadigan variantni kimdir allaqachon prodakshnga chiqargan.

Nima yuz berdi
Bu nimaga olib keladi
Ovoz qayta ishga tushishdan omon qolmadi
bir termda ikki lider, tarixning ikki shoxi, biri oʻchiriladi
Eskirgan logli tugun saylovda gʻolib chiqdi
tasdiqlangan yozuv yangi liderda yoʻq — u yoʻqoladi
Lider meros qolgan yozuvni replikalar soni bilan qayd etdi
qayd etilgan deb hisoblangan narsa keyingi lider almashuvida qayta yoziladi
Mijozga javob kvorumdan oldin ketdi
mijozda «saqlandi», klasterda — hech narsa

Uchinchi qator eng makkori: u belgilangan tartibda toʻrtta lider almashuvini talab qiladi va nosozliklarni tahlil qilishda deyarli hech qachon uchramaydi. Maqolada bu Figure 8, va algoritmda alohida qoida faqat shuning uchun bor.

Nega oddiy testlar buni tutmaydi

  • Integratsion test baxtli yoʻlni yuritadi: hamma tirik, tarmoq soz, xabarlar bir marta va tartib bilan keladi. Aynan shu yoʻlda konsensus algoritmi kerak ham emas.
  • Xaos-injiniring konteynerlarni tasodifiy paytda oʻchiradi — lekin nima qilganini yozib olmaydi. Bir marta yiqildi va uni qaytarib boʻlmaydi.
  • Qaytarib boʻlmaydigan nosozlik tuzatilmaydi: u infratuzilmaga yoziladi. Bu beqaror testdagi mexanizmning oʻzi, faqat xato narxi boshqacha.
  • Vaqt kam. Haqiqiy klasterda kamdan-kam uchraydigan jadvalni tutish uchun haqiqiy soniyalar kerak, kerakli jadvallar esa minglab.

Serverlar javoni oʻrniga simulyatsiya

Birinchi qadam — tugunni kiritish-chiqarishsiz holat mashinasi qilish. U na soatga, na soketga, na diskka tegadi: tick taymerlarini suradi, receive xabar beradi, propose buyruq beradi, u qilmoqchi boʻlgan hamma narsani esa takeMessages va takeApplied tashqariga olib chiqadi. etcd dagi raft xuddi shunday shaklda va xuddi shu sababdan: ichida setTimeout chaqirib, soketga yozadigan implementatsiyani faqat ishga tushirib va umid qilib sinash mumkin.

Ikkinchi qadam — klaster butunlay simulyatsiya ichida yashaydi. Har bir tik, kechikish, yoʻqolgan paket, dublikat, tartib oʻzgarishi va tugun qulashi — siddan tortilgan qaror. Raftning isbotlari aynan shunday dunyoni nazarda tutadi: xabarlar yoʻqoladi, kechikadi, takrorlanadi va tartibsiz keladi, tugunlar qulab qayta koʻtariladi. Bundan kamrogʻini kiritish algoritm moʻljallanmagan tarmoqni sinash demakdir.

ts
import { check } from 'unflake';
import { runScenario, SafetyMonitor, checkLinearizable, operationsFrom, HOSTILE } from 'bulwark';

await check('raft xavfsiz qoladi', async (sim) => {
  const { cluster } = await runScenario(sim, {
    size: 5,
    clients: 3,
    faults: HOSTILE,
    chaos: true, // qulashlar, qayta ishga tushishlar, tarmoq boʻlinishlari
  });

  const disagreement = SafetyMonitor.replicasAgree(cluster);
  if (disagreement) sim.fail(disagreement);

  const report = checkLinearizable(operationsFrom(cluster.history));
  if (report.status === 'not-linearizable') sim.fail(report.reason);
}, { runs: 200 });
Bitta yurish: besh tugun, uch mijoz, boʻlinishlar va qulashlar — hammasi siddan

Aynan nima tekshiriladi

Raft maqolasidagi beshta xavfsizlik xossasi har bir holat oʻtishidan keyin — tikdan keyin, yetkazilgan xabardan keyin — tekshiriladi, soniyada bir marta soʻrab emas. Shunda buzilish uni keltirib chiqargan oʻtishga bogʻlanadi, test nihoyat qarashga qaror qilgan joyga emas.

Xossa
U nimani taqiqlaydi
Election Safety
bitta termda bittadan ortiq lider boʻlishini
Leader Append-Only
liderning oʻz logini qoʻshish oʻrniga qayta yozishini
Log Matching
indeks va term mos kelganda loglarning farq qilishini
Leader Completeness
qayd etilgan yozuvning keyingi liderda yoʻqligini
State Machine Safety
ikki replikaning bitta indeksda turli buyruq qoʻllashini

Alohida — mijoz operatsiyalari tarixining linearizatsiyasi: har bir operatsiya chaqiruv bilan javob orasidagi qandaydir nuqtada bir onda bajarilgandek koʻrinishi, hammasi birgalikda esa real vaqtga mos yagona tartibda turishi shart. Tizim beshta xossani ham bajarib, mijozga baribir imkonsiz narsani koʻrsatishi mumkin: qayta yuborilgan buyruqni ikki marta qoʻllash. Konsensus butun, mijoz esa boʻlmaydigan narsani koʻrgan — aynan shuning uchun toʻlov tizimlarida operatsiyalar idempotentligi kerak.

Linearizatsiya masalasi NP-toʻliq, shuning uchun qidiruvning byudjeti bor. Byudjet tugaganda halol javob — inconclusive, «hammasi yaxshi» emas. «Topilmadi» bilan «mavjud emas» orasidagi farq bu yerda ham jadvallar tanlanmasidagi kabi.

Tekshiruvni tekshirish: xatolar muzeyi

Doim yashil turadigan testlar toʻplami xatolarni tutayotgan ham boʻlishi mumkin, umuman qaramayotgan ham — rangdan buni ajratib boʻlmaydi. Shuning uchun ishlaydigan implementatsiya olinadi, unda algoritmning aynan bitta qoidasi oʻchiriladi, xarnessdan esa buni sid bilan va buzilgan xossa nomi bilan tutish talab qilinadi.

text
no up-to-date check      → Leader Completeness: n2 became leader in term 4 without
                           committed entry r6 at index 8 (term 1)              (run 2)
no prevLog check         → Log Matching: index 1 term 1 holds noop:n1:1 elsewhere
                           but r2 on n4                                        (run 1)
keeps conflicting entry  → State Machine Safety: index 8: n5 applied noop:n5:6,
                           n2 applied r7                                       (run 4)
no leader no-op          → replicas disagree: n1={"a":"p1.2","b":"p0.2"}
                           but n4={"a":"p1.2","b":"p1.3"}                       (run 25)
ignores a newer term     → client 2 gave up on cas                             (run 1)
Figure 8                 → Leader Completeness: n5 became leader in term 4 without
                           committed entry entry-A at index 1 (term 1)         (run 1)
unpersisted vote         → Election Safety: n2 and n3 are both leader in term 1
Yettita eksponat: nima oʻchirilgan va nima uni tutgan

Muhimi yettitasining ham tutilgani emas, balki ularning turlicha tutilgani. Uchtasi xavfsizlik xossasini bevosita buzadi. Bittasi beshta xossani ham butun qoldirib, klasterni jimgina yaqinlashuvdan mahrum qiladi. Bittasi xavfsizlikka umuman zarar yetkazmaydi — faqat oldinga siljishga. Buni «test qizardi»ga keltirish eng mazmunli qismini uloqtirish demakdir.

Oxirgi ikki eksponat tasodifiy emas, yoʻnaltirilgan. Figure 8 belgilangan boʻlinishlar bilan belgilangan tartibda toʻrtta lider almashuvini talab qiladi; ovoz diskka yetib ulgurmaydigan oyna bir tik kengligida. Bunga tasodifan duch kelishga umid qilish — reja emas.

Xarness implementatsiyaning oʻzida topgan xato

Bu — butun apparat shu uchun qurilgan holat. Beshta xossa ham har qanday jadvalda ushlanib turdi — xaos-yurish esa baribir yigirma beshinchi sidda yiqildi: ikki replikada turli qiymat. Loglar mos edi. Hech kim qulamagan. Maqoladagi birorta qoida buzilmagan.

Sabab — §5.4.2 aynan yozilganidek ishlagani. Lider oldingi termdan meros qolgan yozuvni replikalarni sanab qayd eta olmaydi: u oʻz termining yozuvini qayd etishi kerak, u esa oldingilarini ergashtirib ketadi. Ammo mijozlar lider almashuvidan keyin darhol jim boʻlsa, bunday yozuv hech qachon kelmaydi — meros yozuvlar esa abadiy qayd etilmagan qoladi. Ularni oldingi lider davrida qoʻllab ulgurgan replikalar qayd signalini kutmagan replikalardan doimiy ravishda oldinda turadi.

Davo maqolada §8 da bir jumla bilan berilgan: yangi lider darhol oʻz termining boʻsh yozuvini qoʻshadi. Endi u implementatsiyada bor, uning yoʻqligi esa — muzeyning toʻrtinchi eksponati.

Bu usul nimani uddalay olmaydi

  • Oʻtish — isbot emas. Yuzlab sid — nihoyatda katta fazodan yuzlab jadval. Juda yaxshi fazzing, ammo teorema emas; Raftning TLA+ spetsifikatsiyalari simulyatsiya isbotlay olmaydigan narsani isbotlaydi.
  • Nosozlik modeli chekli. Yoʻqolish, kechikish, takrorlanish, tartib oʻzgarishi, boʻlinish va diskni saqlab qulash — ha. Disk buzilishi, qisman yozuv, soatlar farqi va vizantiya xatti-harakati — yoʻq.
  • Bu maʼlumotlar bazasi emas. Klaster tarkibini oʻzgartirish, log kompaksiyasi va snapshotlar yoʻq — aynan ular toʻgʻri algoritmni ekspluatatsiyaga yaroqli tizimga aylantiradi va har birining oʻz xavfsizlik dalili bor.
  • Tekshiruvchi taslim boʻlishi mumkin. Linearizatsiya NP-toʻliq, byudjet chekli, inconclusive — real natija va shundayligicha xabar qilinadi.

Sizga nosozlikka chidamlilik vaʼda qilinganda nimani soʻrash kerak

Pudratchi, jamoa yoki vendorga beshta savol
  • Nosozlik testingiz aslida nimani tasdiqlaydi: klaster koʻtarilganinimi yoki mijozga tasdiqlangan yozuvlar joyidaligini?
  • Oxirgi topilgan nosozlik yurish identifikatori boʻyicha qaytariladimi yoki «bir marta shunday koʻrgandik» koʻrinishida mavjudmi?
  • Tizim yozuv kvorum tomonidan qabul qilinishidan oldin mijozga javob beradimi?
  • Testning umuman xato tuta olishini tekshiradigan sinov bormi — masalan, ataylab oʻchirilgan qoida bilan yurish?
  • Kvorumga erishib boʻlmaydigan paytda mijoz soʻroviga nima boʻladi: tushunarli xatolikmi yoki jim kutishmi?

Oxirgi savol eng amaliysi: koʻpincha konsensusning oʻzi emas, uning atrofidagi chegara yoʻqoladi — idempotentlik kalitisiz takror soʻrov, qayddan oldin yuborilgan «ok», toʻlovni dublikat qiladigan retray. Buni moliyaviy tizimlar va bulutli infratuzilma boʻyicha ishlarimizda koʻrib chiqamiz, texnik tahlillarning toʻliq roʻyxati esa «Injiniring» ruknida.

Ko‘p so‘raladigan savollar

Biz oʻz Raftimizni yozmaymiz, tayyor baza olamiz. Bu baribir bizga tegishlimi?

Ha, ikki joyda. Birinchisi — tanlash va sozlash: «qutidan chiqqan HA» ning narxi bor va u kvorum hamda kechikish bilan toʻlanadi, standart sozlamalar esa maʼlumot yoʻqotishga chidamlilik talabingizga kamdan-kam mos keladi. Ikkinchisi — atrofdagi oʻz kodingiz: mijozga qachon javob berasiz, qanday takrorlaysiz, soʻrovlarda idempotentlik kaliti bormi. Yoʻqotishlarning koʻpi algoritm ichida emas, oʻsha yerda sodir boʻladi.

Bu Jepsen dan nimasi bilan farq qiladi?

Jepsen haqiqiy klasterga tashqaridan hujum qiladi va kuzatilgan tarixni linearizatsiyaga tekshiradi — bu tayyor tizimlar uchun. Simulyatsiya ichkaridan va determinlashgan holda ishlaydi: bir xil sid bir xil yurishni beradi, virtual vaqt esa yuzlab jadvalni arzon qiladi. Ular bir-birini toʻldiradi: biri haqiqiy tarmoqda nima boʻlishini topadi, ikkinchisi — kamdan-kam nima boʻlishini.

Necha yurish yetarli?

Ikki yuz — asosli standart qiymat, chunki simulyatsiyadagi vaqt virtual va bitta yurish millisekundlarga tushadi. Ammo miqdor xilma-xillikni almashtirmaydi: Figure 8 kabi yoʻnaltirilgan stsenariylar tasodifan chiqmaydi, ularni qoʻlda qurish kerak.

Sizning oʻz Raftingizni yozganingiz mijozga nima beradi?

Raftning oʻzi emas — uni koʻplar yozgan. Usul beradi: implementatsiya va xarness bir-birini fosh qiladi, bu esa konsensus algoritmi yoʻq, lekin poygalar, takrorlar va yoʻqolgan tasdiqlar bor oddiy loyihalarga koʻchadi. Kod ochiq: bulwark, MIT, havola manbalarda.

Manbalar

Maqoladagi da’volarni tekshirish mumkin: quyida qayta hikoya emas, birlamchi manbalar.

  1. 01Ongaro, Ousterhout. In Search of an Understandable Consensus AlgorithmMaqolaning kengaytirilgan versiyasi: xossalar bilan Figure 3, §5.4.2 va §8
  2. 02etcd raftKiritish-chiqarishsiz tugun — xuddi shu shakl va xuddi shu sabab
  3. 03FoundationDB: TestingToʻgʻriligi determinlashgan simulyatsiyaga tayanadigan maʼlumotlar bazasi
  4. 04JepsenHaqiqiy taqsimlangan tizimlarni tashqaridan linearizatsiyaga tekshirish
  5. 05bulwarkMaqoladagi implementatsiya va xarness: MIT, ichida xatolar muzeyi
Muallif
Doniyor Botirov
dbit.one asoschisi · maqola muallifi

Bu maqola, boshqalaridan farqli oʻlaroq, ism bilan imzolangan: uning ortida mijoz yoʻq. Gap ketayotgan kod toʻliq ochiq va oʻsha ismda chop etilgan — uni oʻqish, ishga tushirish va maqoladagi daʼvolarni soʻzga ishonmasdan tekshirish mumkin.

Tegishli xizmatlar

Keyingi o‘qish

Loyihangiz bo‘yicha savollar bormi?

Vazifangizni tasvirlang — 24 soat ichida baho, muddat va reja bilan qaytamiz.

[email protected]