Kafka klastri sobiva suuruse määramine Kubernetesis
Märge. tõlge: Selles artiklis jagab Banzai Cloud näidet selle kohta, kuidas selle kohandatud tööriistu saab kasutada Kafka kasutamise hõlbustamiseks Kubernetesis. Järgmised juhised illustreerivad, kuidas saate määrata oma infrastruktuuri optimaalse suuruse ja konfigureerida Kafka ennast vajaliku läbilaskevõime saavutamiseks.
Apache Kafka on hajutatud voogedastusplatvorm usaldusväärsete, skaleeritavate ja suure jõudlusega reaalajas voogedastussüsteemide loomiseks. Selle muljetavaldavaid võimalusi saab Kubernetese abil laiendada. Selleks oleme välja töötanud Avatud lähtekoodiga Kafka operaator ja tööriist nimega Supertuubid. Need võimaldavad teil kasutada Kafkat Kubernetesis ja kasutada selle erinevaid funktsioone, nagu maakleri konfiguratsiooni peenhäälestus, mõõdikupõhine skaleerimine koos tasakaalustamisega, riiuliteadlikkus, "pehme" (graatsiline) värskenduste levitamine jne.
Proovige oma klastris Supertubesid:
curl https://getsupertubes.sh | sh и supertubes install -a --no-democluster --kubeconfig <path-to-eks-cluster-kubeconfig-file>
Või võtke ühendust dokumentatsioon. Samuti saab lugeda mõningatest Kafka võimalustest, millega töö automatiseeritakse Supertubesi ja Kafka operaatori abil. Oleme neist blogis juba kirjutanud:
Kui otsustate Kubernetesis Kafka klastri juurutada, seisate tõenäoliselt silmitsi väljakutsega määrata kindlaks aluseks oleva infrastruktuuri optimaalne suurus ja vajadus täpsustada oma Kafka konfiguratsiooni, et see vastaks läbilaskevõime nõuetele. Iga maakleri maksimaalse jõudluse määrab aluseks olevate infrastruktuuri komponentide, nagu mälu, protsessor, ketta kiirus, võrgu ribalaius jne, jõudlus.
Ideaalis peaks maakleri konfiguratsioon olema selline, et kõiki infrastruktuuri elemente kasutatakse maksimaalselt ära. Päriselus on see seadistus aga üsna keeruline. On tõenäolisem, et kasutajad konfigureerivad maaklereid, et maksimeerida ühe või kahe komponendi (ketas, mälu või protsessor) kasutamist. Üldiselt näitab maakler maksimaalset jõudlust siis, kui tema konfiguratsioon võimaldab kõige aeglasemat komponenti täies mahus kasutada. Nii saame ligikaudse ettekujutuse, millise koormusega üks maakler hakkama saab.
Teoreetiliselt saame hinnata ka antud koormuse käsitlemiseks vajalike maaklerite arvu. Praktikas on aga erinevatel tasanditel nii palju konfiguratsioonivõimalusi, et konkreetse konfiguratsiooni võimalikku jõudlust on väga raske (kui mitte võimatu) hinnata. Teisisõnu on teatud jõudluse põhjal konfiguratsiooni kavandamine väga keeruline.
Supertubesi kasutajate puhul kasutame tavaliselt järgmist lähenemist: alustame mõne konfiguratsiooniga (infrastruktuur + seaded), seejärel mõõdame selle jõudlust, kohandame maakleri sätteid ja kordame protsessi uuesti. See juhtub seni, kuni taristu kõige aeglasem komponent on täielikult ära kasutatud.
Nii saame selgema ettekujutuse sellest, kui palju maaklereid klaster vajab teatud koormusega toimetulemiseks (maaklerite arv sõltub ka muudest teguritest, nagu näiteks sõnumikoopiate minimaalne arv vastupidavuse tagamiseks, partitsioonide arv juhid jne). Lisaks saame ülevaate sellest, millised infrastruktuuri komponendid vajavad vertikaalset skaleerimist.
See artikkel räägib sammudest, mida teeme, et saada algkonfiguratsioonides kõige aeglasematest komponentidest maksimumi ja mõõta Kafka klastri läbilaskevõimet. Väga vastupidav konfiguratsioon nõuab vähemalt kolme töötavat maaklerit (min.insync.replicas=3), jaotatud kolme erineva juurdepääsetavuse tsooni vahel. Kubernetese infrastruktuuri konfigureerimiseks, skaleerimiseks ja jälgimiseks kasutame hübriidpilvede jaoks oma konteinerihaldusplatvormi - Torujuhe. See toetab kohapealset (paljas metall, VMware) ja viit tüüpi pilvi (Alibaba, AWS, Azure, Google, Oracle), aga ka nende mis tahes kombinatsioone.
Mõtteid Kafka klastri infrastruktuuri ja konfiguratsiooni kohta
Allolevate näidete jaoks valisime pilveteenuse pakkujaks AWS-i ja Kubernetese distributsiooniks EKS-i. Sarnast konfiguratsiooni saab rakendada kasutades PKE - Kubernetese levitamine Banzai Cloudist, sertifitseeritud CNCF-i poolt.
ketas
Amazon pakub erinevaid EBS-i helitugevuse tüübid. Keskmiselt gp2 и io1 Suure läbilaskevõime tagamiseks on siiski olemas SSD-draivid gp2 kulutab kogunenud krediiti (I/O krediiti), seega eelistasime tüüpi io1, mis pakub püsivat suurt läbilaskevõimet.
Eksemplari tüübid
Kafka jõudlus sõltub suuresti operatsioonisüsteemi lehe vahemälust, seega vajame maaklerite (JVM) ja lehe vahemälu jaoks piisavalt mäluga juhtumeid. Näide c5.2xsuur - hea algus, kuna sellel on 16 GB mälu ja optimeeritud töötama EBS-iga. Selle puuduseks on see, et see suudab pakkuda maksimaalset jõudlust mitte rohkem kui 30 minutit iga 24 tunni järel. Kui teie töökoormus nõuab tippjõudlust pikema aja jooksul, võiksite kaaluda muid eksemplaritüüpe. Täpselt nii me tegimegi, peatudes c5.4xsuur. See tagab maksimaalse läbilaskevõime 593,75 Mb/s. EBS-i mahu maksimaalne läbilaskevõime io1 eksemplarist kõrgem c5.4xsuur, seega on taristu kõige aeglasem element tõenäoliselt selle eksemplari tüüpi I/O läbilaskevõime (mida peaksid kinnitama ka meie koormustestid).
Сеть
Võrgu läbilaskevõime peab olema VM-i eksemplari ja ketta jõudlusega võrreldes piisavalt suur, vastasel juhul muutub võrk kitsaskohaks. Meie puhul võrguliides c5.4xsuur toetab kiirust kuni 10 Gb/s, mis on oluliselt suurem kui VM-i eksemplari I/O läbilaskevõime.
Maakleri juurutamine
Maaklerid tuleks juurutada (Kubernetesis ajastatud) spetsiaalsetesse sõlmedesse, et vältida konkureerimist teiste protsessidega protsessori, mälu, võrgu ja kettaressursside pärast.
Java versioon
Loogiline valik on Java 11, kuna see ühildub Dockeriga selles mõttes, et JVM määrab õigesti konteineri jaoks saadaolevad protsessorid ja mälu, milles maakler töötab. Teades, et protsessori piirangud on olulised, määrab JVM sisemiselt ja läbipaistvalt GC-lõimede ja JIT-lõimede arvu. Kasutasime Kafka pilti banzaicloud/kafka:2.13-2.4.0, mis sisaldab Java 2.4.0-l Kafka versiooni 2.13 (Scala 11).
Kui soovite Kubernetes Java/JVM-i kohta lisateavet saada, vaadake meie järgmisi postitusi:
Maakleri mälu konfigureerimisel on kaks peamist aspekti: JVM-i ja Kubernetese podi sätted. Podi jaoks seatud mälupiirang peab olema suurem kui maksimaalne kuhja suurus, et JVM-is oleks ruumi Java metaruumi jaoks, mis asub tema enda mälus, ja operatsioonisüsteemi lehe vahemälu jaoks, mida Kafka aktiivselt kasutab. Testides käivitasime parameetritega Kafka maaklerid -Xmx4G -Xms2G, ja podi mälupiirang oli 10 Gi. Pange tähele, et JVM-i mäluseadeid saab automaatselt hankida kasutades -XX:MaxRAMPercentage и -X:MinRAMPercentage, mis põhineb podi mälupiirangul.
Maakleri protsessori seaded
Üldiselt saate jõudlust parandada, suurendades paralleelsust, suurendades Kafka kasutatavate lõimede arvu. Mida rohkem protsessoreid on Kafka jaoks saadaval, seda parem. Meie testis alustasime 6 protsessori limiidiga ja tõstsime järk-järgult (iteratsioonide kaudu) nende arvu 15-ni. Lisaks seadsime num.network.threads=12 maakleri seadetes, et suurendada võrgust andmeid vastuvõtvate ja neid saatvate lõimede arvu. Avastades kohe, et jälgijamaaklerid ei saa piisavalt kiiresti koopiaid kätte, tõstatasid nad num.replica.fetchers 4-le, et suurendada kiirust, millega jälgijamaaklerid juhtide sõnumeid kordasid.
Laadimise genereerimise tööriist
Peaksite tagama, et valitud koormusgeneraatori võimsus ei saaks tühjaks enne, kui Kafka klaster (mida võrreldakse) saavutab maksimaalse koormuse. Teisisõnu on vaja läbi viia koormuse genereerimise tööriista võimaluste esialgne hindamine ning valida selle jaoks ka piisava arvu protsessorite ja mäluga eksemplaritüübid. Sel juhul toodab meie tööriist rohkem koormust, kui Kafka klaster suudab taluda. Pärast paljusid katseid otsustasime kolme eksemplari kasuks c5.4xsuur, millest igaühel töötas generaator.
Võrdlusuuringud
Toimivuse mõõtmine on iteratiivne protsess, mis hõlmab järgmisi etappe.
infrastruktuuri loomine (EKS-klaster, Kafka klaster, koormuse genereerimise tööriist, samuti Prometheus ja Grafana);
koormuse genereerimine teatud perioodiks, et filtreerida kogutud tulemusnäitajate juhuslikud kõrvalekalded;
maakleri infrastruktuuri ja konfiguratsiooni kohandamine vaadeldud tulemusnäitajate põhjal;
korrates protsessi, kuni saavutatakse Kafka klastri läbilaskevõime nõutav tase. Samal ajal peab see olema järjepidevalt reprodutseeritav ja näitama läbilaskevõime minimaalseid erinevusi.
Järgmises jaotises kirjeldatakse testklastri võrdlusuuringu käigus tehtud toiminguid.
Töövahendid
Põhikonfiguratsiooni kiireks juurutamiseks, koormuste genereerimiseks ja jõudluse mõõtmiseks kasutati järgmisi tööriistu.
Banzai pilvetoru EKS klastri korraldamise eest Amazonist c Prometheus (Kafka ja infrastruktuuri mõõdikute kogumiseks) ja grafana (nende mõõdikute visualiseerimiseks). Kasutasime ära integreeritud в Torujuhe teenused, mis pakuvad liitjälgimist, tsentraliseeritud logide kogumist, haavatavuse skannimist, avariitaastet, ettevõtte tasemel turvalisust ja palju muud.
Supertubes CLI lihtsaim viis Kafka klastri seadistamiseks Kubernetesis. Loomaaiapidaja, Kafka operaator, Envoy ja paljud teised komponendid on installitud ja õigesti konfigureeritud, et käitada Kubernetes tootmisvalmis Kafka klastrit.
Valmistage ette EKS-klaster spetsiaalsete töötajate sõlmedega c5.4xsuur Kafka vahendajatega kaunade erinevates saadavustsoonides, samuti spetsiaalsetes sõlmedes koormusgeneraatori ja seireinfrastruktuuri jaoks.
Iga teema puhul on replikatsioonitegur 3 – minimaalne soovitatav väärtus väga kättesaadavate tootmissüsteemide jaoks.
Laadimise genereerimise tööriist
Käivitasime kolm koormusgeneraatori eksemplari (igaüks neist kirjutas eraldi teemas). Koormusgeneraatorite jaoks peate määrama sõlmede afiinsuse nii, et need oleksid ajastatud ainult neile eraldatud sõlmedele:
Koormusgeneraator genereerib 512 baidi pikkuseid sõnumeid ja avaldab need Kafkale 500 sõnumist koosnevate partiidena.
Argumendi kasutamine -required-acks=all Avaldamine loetakse õnnestunuks, kui Kafka maaklerid on vastu võtnud ja kinnitanud kõik sõnumi sünkroonitud koopiad. See tähendab, et võrdlusaluses ei mõõtnud me mitte ainult juhtide sõnumite vastuvõtmise kiirust, vaid ka nende järgijate sõnumeid kopeerivaid kiirusi. Selle testi eesmärk ei ole hinnata tarbija lugemiskiirust (tarbijad) hiljuti saadud sõnumid, mis on endiselt OS-i lehe vahemällu jäänud, ja selle võrdlus kettale salvestatud sõnumite lugemiskiirusega.
Koormusgeneraator töötab paralleelselt 20 töötajat (-workers=20). Iga töötaja sisaldab 5 tootjat, kes jagavad töötaja sidet Kafka klastriga. Selle tulemusena on igal generaatoril 100 tootjat ja nad kõik saadavad sõnumeid Kafka klastrisse.
Klastri tervise jälgimine
Kafka klastri koormustestimise ajal jälgisime ka selle seisukorda tagamaks, et poleks podi taaskäivitamist, sünkroonimata koopiaid ja maksimaalset läbilaskevõimet minimaalsete kõikumistega.
Koormusgeneraator kirjutab standardstatistikat avaldatud teadete arvu ja veamäära kohta. Veamäär peaks jääma samaks 0,00%.
Püsikiirusehoidja, mille juurutab kafka-operator, pakub armatuurlauda, kus saame jälgida ka klastri olekut. Selle paneeli vaatamiseks tehke järgmist.
supertubes cluster cruisecontrol show -n kafka --kubeconfig <path-to-eks-cluster-kubeconfig-file>
ISR tase ("sünkroonitud" koopiate arv) kokkutõmbumine ja paisumine on 0.
Mõõtmistulemused
3 maaklerit, sõnumi suurus - 512 baiti
Kolme maakleri vahel ühtlaselt jaotatud vaheseinad suutsime jõudlust saavutada ~500 Mb/s (umbes 990 tuhat sõnumit sekundis):
JVM-i virtuaalmasina mälutarbimine ei ületanud 2 GB:
Ketta läbilaskevõime saavutas maksimaalse I/O-sõlme läbilaskevõime kõigil kolmel eksemplaril, millel maaklerid töötasid:
Sõlmede mälukasutuse andmetest järeldub, et süsteemi puhverdamiseks ja vahemällu salvestamiseks kulus ~10-15 GB:
3 maaklerit, sõnumi suurus - 100 baiti
Kui sõnumi suurus väheneb, väheneb läbilaskevõime ligikaudu 15-20%: iga sõnumi töötlemisele kuluv aeg mõjutab seda. Lisaks on protsessori koormus peaaegu kahekordistunud.
Kuna maaklerisõlmedel on endiselt kasutamata südamikke, saab jõudlust parandada, muutes Kafka konfiguratsiooni. See pole lihtne ülesanne, seega on läbilaskevõime suurendamiseks parem töötada suuremate sõnumitega.
4 maaklerit, sõnumi suurus - 512 baiti
Kafka klastri jõudlust saate hõlpsalt suurendada, lisades lihtsalt uusi maaklereid ja säilitades vaheseinte tasakaalu (see tagab koormuse ühtlase jaotumise maaklerite vahel). Meie puhul suurenes klastri läbilaskevõime pärast maakleri lisamist ~580 Mb/s (~1,1 miljonit sõnumit sekundis). Kasv osutus oodatust väiksemaks: see on peamiselt seletatav vaheseinte tasakaalustamatusega (kõik maaklerid ei tööta oma võimete tipul).
JVM-masina mälutarbimine jäi alla 2 GB:
Draividega maaklerite tööd mõjutas vaheseinte tasakaalustamatus:
Järeldused
Eespool kirjeldatud iteratiivset lähenemist saab laiendada, et see hõlmaks keerukamaid stsenaariume, mis hõlmavad sadu tarbijaid, ümberjaotamist, jooksvaid värskendusi, moodulite taaskäivitamist jne. Kõik see võimaldab hinnata Kafka klastri võimekuse piire erinevates tingimustes, tuvastada kitsaskohti selle toimimises ja leida võimalusi nende vastu võitlemiseks.
Kujundasime Supertubesid klastri kiireks ja hõlpsaks juurutamiseks, selle konfigureerimiseks, maaklerite ja teemade lisamiseks/eemaldamiseks, hoiatustele reageerimiseks ja üldiselt Kafka nõuetekohaseks Kuberneteses töötamiseks. Meie eesmärk on aidata teil keskenduda põhiülesandele ("genereerida" ja "tarbida" Kafka sõnumeid) ning jätta kogu raske töö Supertubesi ja Kafka operaatori kanda.
Kui olete huvitatud Banzai pilvetehnoloogiatest ja avatud lähtekoodiga projektidest, tellige ettevõte aadressil GitHub, LinkedIn või puperdama.