Tre kontrollplan-VM-ar kjennest som tre sjansar til å overleve ei dårleg natt. Det er dei ikkje, og avstanden mellom dei to truene er det som gjer eit ryddig tre-node-design om til ei klynge som sluttar å ta imot skrivingar når éin bygning mistar straumen. Ei VPN-samband mellom stadene gjer maskinene tilgjengelege for kvarandre og skjuler problemet i staden for å løyse det. Stemmer blir talde per etcd-medlem, og to av desse medlemmene kan framleis sitje bak éin svitsj, éin UPS og éin uplink.

Tre kontrollplannodar, eitt feildomene

Du køyrer kubectl get nodes, ser tre kontrollplanoppføringar og registrerer klynga som høgt tilgjengeleg. Talet skildrar planleggbar kapasitet, ikkje overlevingsevne. I kubeadm utan ekstern etcd er kvar kontrollplannode også vert for eit medlem, så tre nodar gjev deg faktisk tre veljarar. Om desse veljarane feilar uavhengig, er eit eige spørsmål som nodelista ikkje kan svare på.

To VM-ar på éin hypervisor, to rack på éi straumforsyning, to uplinkar frå éin ISP: kvart par er eitt domene med to vertsnamn. Skriv ned plasseringa og merk kva kvar veljar deler — hypervisor, PDU, svitsj øvst i racket, lagringsarray, NAT-eining, VPN-konsentrator. Fjern deretter kvart delte objekt på papiret og tel stemmene som er att på nytt. Ei klynge som mistar to veljarar på grunn av éin feila vert, har heile tida vore ei klynge med éin veljar; ingen hadde stilt ho spørsmålet enno.

Kva ein todelt løysing på to stader kan og ikkje kan overleve

Når tre veljarar blir plasserte to og éin på tvers av to stader, held den største sida quorum når den andre staden forsvinn, og sida med éin veljar aldri. Den asymmetrien er aritmetikk, ikkje tuning. Kvar majoritetsbasert etcd-klynge fordelt på nøyaktig to uavhengige stader feilar testen "mist kva som helst stad og hald fram med å committe", fordi begge sider samtidig måtte halde meir enn halvparten av stemmene.

Tabellen nedanfor er den snøggaste måten å sjå kva feil du faktisk har kjøpt. Les kvar rad slik: om heile denne rada forsvinn i natt, kan dei overlevande framleis committe ei skriving?

What disappearsVoters leftWrites still commit
Site B, holding voter 32 of 3Yes
Site A, holding voters 1 and 21 of 3No
One hypervisor carrying any two voters1 of 3No
The inter-site VPN only2 of 3 on one sideOnly on the majority side

Kvifor tunnelen aldri legg til ei stemme

Ein VPN er transport, ikkje eit medlem. Han kan gjere ein ekstern veljar tilgjengeleg, og han kan gjere ein partisjon om til noko som liknar ein langsam timeout, og det er heile bidraget hans til quorum. Det han legg til, er kostnad, fordi kvar commit må krysse sambandet, og etcd betaler den rundturen på skrivingar som rører raft-loggen. Ein sti som flimrar, gjer replikering om til nye forsøk og val.

Partisjonar er staden der folk ventar magi, så ver presis om dei. Om sambandet fell medan den gamle leiaren sit på sida med éin veljar, kan den sida ikkje committe, og leiaren går av når val-timeouten renn ut, medan sida med to veljarar vel ein erstattar. etcd-rettleiinga om feilmodusar skildrar åtferda rett fram: halde fram tenesta på majoritetssida, inga anna skrivbar klynge på den isolerte sida.

Avgjer kva avbrot du kjøper

To pluss éin er eit legitimt design når stad A er den primære, og du godtek at tapet av han betyr tap av kontrollplanskrivingar til nokon handlar. Det som gjer det til ein mangel, er å la den avgjerda vere implisitt. Skriv henne i runbooken: kva stad kontrollplanet ditt overlever, og kva ein operatør gjer når den andre staden går ned klokka 03:00.

Om kravet i staden er "kva som helst stad kan feile", må plasseringa halde fleirtal på kvar stad, og tre veljarar over to stader kan ikkje gjere det. Du legg anten til eit verkeleg uavhengig tredje domene — ein liten region hos ein annan leverandør fungerer om stien dit er stabil — eller deler i to klynger med eigen etcd og godtek driftskostnaden ved den delinga. Ingen snøggveg med eit vitne unngår dette: etcd har ikkje eit lettvekts arbiter-medlem, så ein tredje veljar er eit fullt medlem med eigne krav til disk, minne og nettverk. Å teikne ein boks merkt vitne på diagrammet skaper ikkje eit vitne.

Quorum er ikkje det same som teneste

etcd-quorum held API-serveren i stand til å ta imot skrivingar, og det er alt det held. Helsesjekkar for lastbalanseraren, ingress, CNI-tilgjenge gjennom tunnelen, volumtilknytingssoner og applikasjonsreplikering treng kvar sin eigen svar. Ei klynge kan ha eit reint fleirtal og likevel ikkje tilby noko nyttig til brukarane.

Stadfest deretter medlemskapen du trur du har, fordi diagram driv:

kubectl -n kube-system get pods -l component=etcd -o wide
kubectl get endpoints kube-apiserver -n default
etcdctl member list -w table

Samanlikn medlemslista med plasseringsteikninga. Om to medlemmer løyser til same vert eller same rack, er teikninga feil og ikkje klynga, og å endre storleik rundt ein feil topologi kjøper berre ein dyrare versjon av det same avbrotet.

Før du godkjenner eit design med tre veljarar, svar på fire spørsmål: kor mange veljarar mistar straumen saman, kva stadstap etterlèt framleis eit fleirtal, kvar sit leiaren når tunnelen fell, og kva kan den overlevande staden framleis gjere. Eit "ikkje sikker" på nokon av dei betyr at klynga enno ikkje er høgt tilgjengeleg. Det er tre maskiner som har vore heldige.

Relaterte artiklar