Postgres-teisipÀev nr 5: «PostgreSQL ja Kubernetes. CI/CD. Testimise automatiseerimine»

Postgres-teisipÀev nr 5: «PostgreSQL ja Kubernetes. CI/CD. Testimise automatiseerimine»

Eelmisel aastal toimus taas otseĂŒlekanne Venemaa PostgreSQL-i kogukonnast #RuPostgres, mille raames rÀÀkis selle kaasasutaja Nikolai Samohvalov Flanti tehnilise direktori Dmitri Stolyaroviga sellest andmebaasisĂŒsteemist Kubernetes'i kontekstis.

Avaldame selle arutelu pÔhiosa stenogrammi ning kogukonna YouTube'i kanalil on avaldatud tÀielik videosalvestus:

MĂ€ngi videot

Andmebaasid ja Kubernetes

НС: TĂ€na ei rÀÀgi me VACUUM-ist ja CHECKPOINT'itest. Soovime rÀÀkida Kubernetes'est. Ma tean, et sul on juba palju aastaid kogemusi. Olen vaadanud sinu videosid ja mĂ”ned neist isegi mitu korda
 Alustame kohe: miks ĂŒldse Postgres vĂ”i MySQL K8s-is?

ДС: Sellele kĂŒsimusele ei ole ĂŒhtegi kindlat vastust. Kuid ĂŒldiselt, see on lihtsus ja mugavus
 potentsiaalsed. KĂ”igile meeldib managed-teenuseid saada.

НС: Kas nagu RDS, vaid enda juures?

ДС: Jah: et oleks nagu RDS, aga igal pool.

НС: "Igal pool" — see on hea mĂ€rkuset. Suurtes ettevĂ”tetes on kĂ”ik eraldi kohtades. Aga miks sel juhul, kui see on suur ettevĂ”te, mitte vĂ”tta valmis lahendust? NĂ€iteks Nutanix’il on oma arengud, teistel ettevĂ”tetel (VMware
) on samuti "RDS, aga enda juures".

ДС: Kuid rÀÀgime me siiski ĂŒksikust rakendusest, mis töötab ainult kindlates tingimustes. Kui jutt on Kubernetes'est, siis siin on tohutu infrastruktuuri mitmekesisus (mis vĂ”ib K8s-is olla). Sisuliselt on see standard pilve API-le...

НС: Ja veel tasuta!

ДС: See pole nii oluline. Tasuta on tĂ€htis ainult vĂ€iksemale turusegmendile. Oluline on midagi muud
 Sa kindlasti mĂ€letad ettekannet "Andmebaasid ja Kubernetes»?

НС: Jah.

ДС: Ma sain aru, et seda vĂ”eti vĂ€ga erinevalt. Osa inimesi arvas, et ma jÀÀn öelda: "Inimesed, lĂ€hme kĂ”igi andmebaasidega Kubernetes'esse!", — ja teised leidsid, et see on kĂ”ik kohutav jalgratas. Kuid ma tahtsin öelda hoopis teistsugust: "Vaadake, mis toimub, milliseid probleeme on ja kuidas neid saab lahendada. Kas minna andmebaasidega Kubernetes'esse? Protsessis? No, ainult kui sa armastad
 tegeleda teatud asjadega. Kuid arenguks – vĂ”in öelda, et soovitan. Arenguks on looduse loomine/erase vĂ”i kustutamine vĂ€ga oluline."

НС: Arengu all pead sa kĂ”iki keskkondi, mis ei ole prod? Staging, QA...

ДС: Kui rÀÀgime perf-seintidest, siis tĂ”enĂ€oliselt mitte, kuna seal on spetsiifilised nĂ”uded. Kui rÀÀgime erandjuhtudest, kus stagingus on vĂ€ga suur andmebaas, siis ka tĂ”enĂ€oliselt mitte... Kui see on staatiline keskkond, mis elab kaua, siis milline on kasu, kui andmebaas asub K8s-is?

НС: Ei mingit. Aga kus me nĂ€eme staatilisi keskkondi? Staatiline keskkond on homme juba aegunud.

ДС: Staging vĂ”ib olla staatiline. Meil on kliente...

НС: Jah, mul on ka. Suur probleem, kui sul on 10 TB andmebaas ja staging — 200 GB...

ДС: Mul on vĂ€ga Ă€ge juhtum! Stagingus on tootmisandmebaas, kuhu tehakse muudatusi. Ja on nupp: „toota tootmisse”. Need muudatused — deltid — sĂŒnkroonitakse (nĂ€ib, et lihtsalt API kaudu) tootmisse. See on vĂ€ga eksootiline variant.

НС: Olen nĂ€inud startupe Silikoni orus, mis istuvad RDS-is vĂ”i isegi Herokus — need on 2-3 aasta tagused lood — ja nad laadivad dumpi oma sĂŒlearvutisse. Sest andmebaas on alles 80 GB ja sĂŒlearvutis on ruumi. Siis ostavad nad igale ĂŒhele kĂ”vakettaid, et kolme andmebaasi omada, et erinevaid arendusi teha. Nii ka juhtub. Olen nĂ€inud, et tootmist kopeeritakse stagingusse — see sĂ”ltub vĂ€ga palju ettevĂ”ttest. Aga olen nĂ€inud ka, et kardetakse seda, ja et tihti ei ole aega ja kĂ€si piisavalt. Aga enne, kui me selle teema juurde jĂ”uame, tahaksin kuulda Kubernetese kohta. Kas ma mĂ”istan Ă”igesti, et tootmises pole hetkel kellelgi?

ДС: Meil on tootmises mĂ”ned vĂ€ikesed andmebaasid. RÀÀgime kĂŒmnete gigabaitide mahtudest ja mitte-kriitilistest teenustest, mille replikate tegemiseks oli laiskus (ja ei olnud ka sellist vajadust). Ja tingimusel, et Kubernetese all on normaalne salvestus. See andmebaas töötas virtuaalmasinas — tinglikult VMware'is, salvestusseadmest ĂŒle. Me panime selle PV ja nĂŒĂŒd saame seda masinast masinasse liigutada.

НС: Sellise suurusega, kuni 100 GB andmebaasid, headel ketastel ja hea vĂ”rgu korral saab eetrisse panna paarikĂŒmne minutiga, eks? Kiirus 1 GB sekundis — see ei ole enam eksootika.

ДС: Jah, lineaarse operatsiooni jaoks ei ole see probleem.

НС: Selge, tootmise kohta peame vaid mĂ”tlema. Aga kui me kaalume Kuberneteset mitte-prod-keskkondade jaoks - kuidas seda teha? NĂ€en, et Zalando teeb operaatorit, Crunchy arendab, on veel mĂ”ned variandid. Ja on OnGres — see on meie hea sĂ”ber Alvaro Hispaaniast: nad teevad mitte lihtsalt operaatorit, vaid tervet distributsiooni (StackGres), kuhu peale PostgreSQL’i tuleb veel varukoopia ja proxy Envoy...

ДС: Miks on vaja Envoy’d? TĂ€pselt PostgreSQL’i liikluse tasakaalustamiseks?

НС: Jah. Nad nĂ€evad seda nii: kui vĂ”tta Linuxi distributiiv ja tuum, siis tavaline PostgreSQL on tuum, aga nad tahavad teha distributiivi, mis oleks pilvele sĂ”bralik ja saaks Kuberneteses töötada. Nad siduvad komponente (varukoopiad jne) ja hÀÀlestavad, et need töötaksid hĂ€sti.

ДС: TĂ”eliselt Ă€ge! Sisuliselt on see tarkvara, et luua oma hallatud PostgreSQL.

НС: Linuxi distributiivide jaoks on igavene probleem: kuidas teha draivereid, et kogu riistvara oleks toetatud. Neil on idee, et nad töötavad Kuberneteses. Tean, et Zalando operaatoris nĂ€gime hiljuti seotust AWS-iga ja see ei ole just eriti hea. See ei tohiks sĂ”ltuda konkreetsest infrastruktuurist — siis milleks see on?

ДС: Ei tea, milles konkreetselt Zalando seondus, aga Kuberneteses on praegu nii, et salvestus on tehtud niimoodi, et ei saa ĂŒldiselt kettavarukoopiaid teha. Hiljuti viimases versioonis loodi standardile CSI, specifikatsioonide CSI — lisati vĂ”imalus snapshots’teks, aga kus see on rakendatud? Ausalt öeldes, see on ikka veel nii toores... Proovime CSI-d AWS, GCE, Azure, vSphere peal, aga kui hakkad kasutama, siis on kohe nĂ€ha, et see ei ole veel valmis.

НС: SeetĂ”ttu on vahel kohustuslik sĂ”ltuda infrastruktuurist. Arvan, et see on ikka varases arenguetapis — kasvuprobleemid. KĂŒsimus: mida sa soovitaksid algajatele, kes tahavad proovida PgSQL-i K8s-is? Milline operaator, vĂ”ib-olla?

ДС: Probleem on selles, et Postgres on meie jaoks 3%. Meil on veel vĂ€ga suur loetelu erinevast tarkvarast Kuberneteses, ei hakka isegi kĂ”ike ĂŒles lugema. NĂ€iteks Elasticsearch. Operaatorite hulk on tohutu: mĂ”ned arenevad aktiivselt, teised mitte. Me oleme endale koostanud nĂ”udmised, mis peaksid operaatoris olema, et me vĂ”taksime seda tĂ”siselt. Just Kuberneteses mĂ”eldud operaator — mitte «operaator, et teha midagi Amazoni tingimustes»... Tegelikult kasutame me piisavalt laialdaselt (= peaaegu kĂ”igil klientidel) ainult ĂŒhte operaatorit — Redis’i jaoks (varsti avaldame ka artikli selle kohta).

НС: Aga MySQL-i jaoks pole ka? Tean, et Percona... kuna nad tegelevad nĂŒĂŒd nii MySQLi, MongoDB kui ka PostgreSQL-iga, peavad nad ju midagi universaalset vĂ€lja töötama: kĂ”igi andmebaaside jaoks, kĂ”igi pilveteenuse pakkujate jaoks.

ДС: Me ei jĂ”udnud vaadata MySQL operaatorite peale. Meie jaoks pole see praegu peamine fookus. MySQL töötab korralikult iseseisvalt. Miks operaator, kui saad lihtsalt andmebaasi kĂ€ivitada
 Sa saad kĂ€ivitada Docker konteineri Postrgesiga, vĂ”i saad selle kĂ€ivitada lihtsalt.

НС: Sellest oli ka kĂŒsimus. Üldse ilma operaatorita?

ДС: Jah, meil on 100% PostgreSQL kĂ€ivitunud ilma operaatorita. Praegu nii. Me kasutame operaatorit aktiivselt Prometheuse ja Redis'e jaoks. Meil on plaanis leida operaator Elasticsearch'i jaoks — see on kĂ”ige pĂ”letavam teema, kuna soovime seda 100% juhtudel Kubernetesesse paigaldada. Nii nagu soovime, et MongoDB oleks ka alati Kuberneteses. Siin tekivad kindlad soovid — on tunne, et nendes olukordades on midagi teha. PostgreSQL'i osas me isegi ei vaadanud. Loomulikult teame erinevate variantide olemasolust, aga tegelikult on meil iseseisev lahendus.

Andmebaas testimiseks Kuberneteses

НС: Liigume testimise teema juurde. Kuidas rakendada muudatusi andmebaasis — DevOps'i perspektiivist. On mikroteenused, palju andmebaase, pidevalt kuskil midagi muutub. Kuidas tagada normaalne CI/CD, et andmebaasi poolest oleks kĂ”ik korras. Mis on sinu lĂ€henemine?

ДС: Ühte vastust ei saa olla. On mitu parameetrit. Esiteks, kui suur on andmebaas, mida soovime rakendada. Sa ise mainisid, et ettevĂ”ttes on erinevad lĂ€henemised, kuidas prod-andmebaasi koopia olla dev- ja stage'is.

НС: GDPR-i tingimustes, ma arvan, nad on jĂ€rjest ettevaatlikumad... VĂ”in öelda, et Euroopas on juba alustanud trahvimist.

ДС: Aga sageli saab kirjutada tarkvara, mis teeb kopia tootmisest ja obfuskeerib selle. Tulemuseks on tootmisandmed (snapshood, dump, binaarne koopia...), kuid need on anonĂŒĂŒmseks muutunud. Selle asemel vĂ”ivad olla ka genereerimise skriptid: need vĂ”ivad olla fikstuuri vĂ”i lihtsalt skript, mis genereerib suure andmebaasi. Probleem on aga: kui palju aega kulub pĂ”hifoto loomisele? Ja kui palju aega kulub selle suure keskkonna peal paigutamiseks?

Oleme jĂ”udnud skeemile: kui kliendil on fikstuuri andmekogum (minimaalne versioon andmebaasist), siis kasutame neid vaikimisi. Kui asi puudutab ĂŒlevaatekeskkondi, kui oleme loonud haru, meie rakenduse eksemplar kĂ€ivitub — me paneme sinna vĂ€ikese andmebaasi. Aga see tuli hĂ€sti vĂ€lja ning variant, kui me production’ist öösel kord pĂ€evas varundame ja selle alusel loome Docker-konteineri PostgreSQL ja MySQL-iga nende laaditud andmete pĂ”hjal. Kui sellest kujundist tuleb 50 korda andmebaas vĂ€lja arendada, siis seda on piisavalt lihtne ja kiire teha.

НС: Lihtsa kopeerimisega?

ДС: Andmed salvestatakse otse Docker-pildis. St meil on valmis pilt, olgu see 100 GB. TĂ€nu Docker'i kihtidele saame seda pilti kiiresti vajalikul hulgal arendada. Meetod on primitiivne, kuid töötab hĂ€sti.

НС: Edasi, kui testite, siis see muutub otse Docker’is, eks? Copy-on-write Docker’is — viskame vĂ€lja ja alustame uuesti, kĂ”ik on korras. SuurepĂ€rane! Ja te kasutate seda juba aktiivselt?

ДС: Juba pikka aega.

НС: Me tegeleme vĂ€ga sarnaste asjadega. Ainult et me ei kasuta Docker’i copy-on-write’i, vaid midagi muud.

ДС: See ei ole generiline. Kuid Docker’i versioon töötab igal pool.

НС: Idee on kĂŒll nii. Kuid meil on seal ka moodulid, saab teha erinevaid mooduleid ja töötada erinevate failisĂŒsteemidega. Siin on ĂŒks punkt. Me vaatame Postgres’i poolelt kogu sellele teisele moodi. NĂŒĂŒd vaatasin Docker’i poolelt ja nĂ€gin, et teil on kĂ”ik toimib. Kuid kui andmebaas on vĂ€ga suur, nĂ€iteks 1 TB, siis see juba vĂ”tab aega: nii öised operatsioonid kui ka kĂ”ik Docker’isse surumine
 Aga kui 5 TB suruda Docker’isse
 VĂ”i on kĂ”ik korras?

ДС: Mis vahet seal on: need on ju blob'id, lihtsalt bitid ja baitid.

НС: Vahe on selline: teete seda dump'i ja restore'iga?

ДС: Üldse ei pea. Selle pildi genereerimise meetodid vĂ”ivad olla erinevad.

НС: MĂ”ne kliendi jaoks oleme teinud nii, et selle asemel, et regulaarselt genereerida baaspilti, hoiame me seda pidevalt vĂ€rskena. See on sisuliselt koopiana, kuid andmeid ei saadud otse meistrilt, vaid arhiivi kaudu. Binaarset arhiivi, kuhu WAL'id kantakse iga pĂ€ev, seal tehakse ka varukoopiad
 Need WAL'id jĂ”uavad seejĂ€rel — vĂ€ikese viivitusega (pĂ€ris 1-2 sekundit) — baaspildini. Sellest kloonime me igasuguseid viise — praegu on meil vaikimisi ZFS.

ДС: Kuid ZFS-i puhul olete piiratud ĂŒhe sĂ”lmega.

НС: Jah. Kuid ZFS-il on ka maagiline send: selle abil saab saata snapshots ja isegi (ma ei ole seda veel vĂ€ga testinud, kuid
) saab edasi saata deltat kahe vahel PGDATA. Tegelikult on meil veel ĂŒks tööriist, mida me ei ole selliste ĂŒlesannete jaoks eriti vaadanud. PostgreSQL-is on pg_rewind, töötades nagu „nutikas” rsync, jĂ€ttes vahele palju, mida pole vaja vaadata, sest seal pole tĂ”eliselt midagi muutunud. Saame kahe serveri vahel kiiresti sĂŒnkroonida ja tagasi kerida tĂ€pselt samamoodi.

Nii et me pĂŒĂŒame selle, DBA-poolsest, vaatenurgast luua tööriista, mis vĂ”imaldab teha seda, millest sa rÀÀkisid: meil on ĂŒks andmebaas, kuid me tahame 50 korda midagi testida, peaagu samaaegselt.

ДС: 50 korda tĂ€hendab, et peate tellima 50 Spot instantsi.

НС: Ei, teeme kĂ”ik ĂŒhel masinal.

ДС: Aga kuidas te juurutate 50 korda, kui see ĂŒks andmebaas on, ĂŒtleme, terabaidi suurune? TĂ”enĂ€oliselt vajab see umbes 256 GB RAM-i?

НС: Jah, mĂ€lu vajatakse mĂ”nikord palju — see on normaalne. Kuid selline nĂ€ide elust. Tootmismasinal on 96 tuuma ja 600 GB. Samas andmebaasi jaoks kasutatakse 32 tuuma (isegi 16 tuuma nĂŒĂŒd mĂ”nikord) ja mĂ€lu 100-120 GB.

ДС: Kas sinna mahub 50 koopiat?

НС: Kuid koopiat on vaid ĂŒks, edasi töötab copy-on-write (ZFS-i)
 RÀÀgin lĂ€hemalt.

Meil on nĂ€iteks 10 TB andmebaas. Disk selle jaoks tehtud, ZFS veel tihendas selle suurust 30-40 protsendi vĂ”rra. Kuna me ei tee koormustestimist, ei ole meil tĂ€pset reageerimisaega oluline: olgu see kuni 2 korda aeglasem — see on okei.

Anname vĂ”imaluse programmeerijatele, QA-le, DBA-le jne. teha testimist 1-2 lĂ”imes. NĂ€iteks saavad nad kĂ€ivitada mingi migreerimise. See ei vaja kohe 10 tuuma — talle piisab ĂŒhest Postgres'i taustast, 1 tuumast. Migratsioon kĂ€ivitub — vĂ”ib-olla, autovacuum kĂ€ivitub veel, siis kasutatakse teist tuuma. Meil on eraldatud 16-32 tuuma, nii et 10 inimest saavad samal ajal töötada, probleeme pole.

Kuna fĂŒĂŒsiliselt PGDATA on sama, selgub, et petame tegelikult Postgres’t. KĂŒsimus on selles: kĂ€ivitatakse nĂ€iteks 10 Postgres’i samal ajal. Milline probleem tavaliselt on? Seavad shared_buffers, oletame, 25% suuruseks. Seega on see 200 GB. Rohkem kui kolm sellist juba ei kĂ€ivita, sest mĂ€lu lĂ”peb.

Aga mÔnes hetkes mÔistsime, et see ei ole vajalik: seame shared_buffers 2 GB peale. PostgreSQL-il on effective_cache_size, ja tegelikult mÔjutab ainult see plaane. Seega seadistame selle 0,5 TB-ks. Ja isegi ei ole oluline, et neid tegelikult ei ole: ta koostab plaane, nagu need oleksid olemas.

Seega, kui me testime mingit migratsiooni, saame koguda kĂ”ik plaanid — me nĂ€eme, kuidas see toimub tootmises. Sekundid vĂ”ivad olla teised (aeglasemad), kuid andmed, mida me reaalselt loeme, ja plaanid (millised JOIN'id ja sarnased) on samad nagu tootmises. Ja samal ajal saame kĂ€ivitada palju selliseid kontrolle ĂŒhel masinal.

ДС: Kas sa ei arva, et siin on mĂ”ned probleemid? Esiteks — see lahendus töötab ainult PostgreSQL'is. Selline lĂ€henemine on vĂ€ga spetsiifiline, mitte ĂŒldine. Teiseks — Kubernetes (ja kĂ”ik, kuhu tĂ€napĂ€eval piloodid lĂ€hevad) eeldab palju sĂ”lmi, ja need sĂ”lmed on efemeersed. Ent sinu puhul on see stateful, pĂŒsiv sĂ”lm. Need asjad tekitavad minus vastuolusid.

НС: Esiteks — olen nĂ”us, see on puhtalt PostgreSQL'i lugu. Arvan, et kui meil on mingi otse IO ja vahemĂ€lu praktiliselt kogu mĂ€lule, siis see lĂ€henemine ei sobi — plaanid oleksid teised. Aga me töötame praegu ainult PostgreSQL'iga, teistest ei mĂ”tle.

Kubernetese kohta. Sa ise rÀÀgid, et meie andmebaas on pĂŒsiv. Kui instants kukub, on peamine sĂ€ilitada ketas. Meie platvorm on samuti Kubernetesis, kuid PostgreSQL'i komponent on eraldi (kuigi ka see kunagi sinna tuleb). SeetĂ”ttu on asi nii: instants kukkus, kuid meie sĂ€ilitasime selle PV ja lihtsalt ĂŒhendasime uue instantsi nagu poleks midagi juhtunud.

ДС: Minu vaatenurgast loome me pod'e Kubernetesis. K8s on elastne: sĂ”lmed tellitakse vajadusel. Ülesanne on lihtsalt luua pod ja öelda, et talle on vajalik X ressursse, ja edasi tegeleb K8s ise. Kuid ladustuse tugi Kubernetesis on endiselt ebastabiilne: 1.16, in 1.17 (see versioon ilmus nĂ€dalat tagasi) need funktsioonid on alles beetaversioonis.

Aasta jooksul — see muutub enam-vĂ€hem stabiilseks vĂ”i vĂ€hemalt nii vĂ€idetakse. Siis snapshotide ja resize'i vĂ”imalus lahendab teie probleemi tĂ€ielikult. Sest teil on andmebaas. Jah, see ei pruugi olla vĂ€ga kiire, kuid kiirus sĂ”ltub sellest, mis on 'kapoti all', seetĂ”ttu oskavad mĂ”ned teostused kopeerimist ja copy-on-write'i diskisĂŒsteemi tasemel.

НС: Siin peab ka olema, et kĂ”ik mootorid (Amazon, Google
) oleksid suutnud hakata seda versiooni toetama — see vĂ”tab samuti aega.

ДС: Seni me neid ei kasuta. Me kasutame oma.

Kohalik arendus Kubernetese all

НС: Kas oled kunagi kokku puutunud sooviga, et ĂŒhe masina peal tĂ”sta kĂ”ik pod'id ja teha vĂ€ikest testimist. Et kiirelt saada kontseptsiooni tĂ”estust, vaadata, kuidas rakendus Kuberneteses töötab, eraldamata selleks hulk masinaid. On olemas Minikube, eks?

ДС: Tundub, et see juhtum — ĂŒhel sĂ”lmel kĂ€ivitamine — on puhtalt kohalike arenduste jaoks. VĂ”i mingid sellised ilmingud. On Minikube, on k3s, KIND. Me liigume suunas, et hakkame Kuberneteset Dockeris kasutama. Oleme nĂŒĂŒd hakanud sellega testimiseks töötama.

НС: Ma arvasin varem, et see on katse panna kĂ”ik pod'id ĂŒhte Docker'i pilti. Kuid selgus, et see on midagi hoopis muud. Seal on endiselt eraldi konteinerid, eraldi pod'id — lihtsalt Docker'is.

ДС: Jah. Seal on pĂ€ris naljakas imitatsioon, aga idee on selline... Meil on deployment'i utiliit — werf. Taha, et teeksime seal reĆŸiimi — ĂŒtleme, werf up: "TĂ”sta mulle kohalik Kubernetes ĂŒles". Ja seejĂ€rel kĂ€ivitada seal tingimuslik werf follow. Siis saab arendaja IDE's redigeerida, ja sĂŒsteemis töötab protsess, mis nĂ€eb muudatusi ja ehitab pildid uuesti ning deponeerib need kohalikku K8s-i. Nii soovime proovida lahendada kohaliku arenduse probleemi.

Snapshotid ja andmebaasi kloonimine K8s-i tingimustes

НС: Kui rÀÀkida copy-on-write’st. Olen mĂ€rkand, et ka pilvedel on snapshotid. Need töötavad erinevalt. NĂ€iteks GCP: Sul on USA idas rikka terabaidi instants. Teed perioodiliselt snapshot'e. TĂ”stad snapshot'ist koopia ketast lÀÀne rannikule — paar minuti pĂ€rast on kĂ”ik valmis, töötab vĂ€ga kiiresti, ainult vahemĂ€lu tuleb mĂ€lu tĂ€ita. Kuid need kloonid (snapshot'id) — on selleks, et „provision’ida“ uus maht. See on Ă€ge, kui on vaja palju instantsse luua.

Aga testide jaoks tundub, et snapshotid, millest sa rÀÀgid Docker'is vĂ”i millest mina rÀÀgin ZFS-is, btrfs-is ja isegi LVM-is
 — need vĂ”imaldavad tĂ”esti ĂŒhel masinal anda uued andmed. Pilves pead sa nende eest maksma ja pead ootama mitte sekundeid, vaid minuteid (ja juhul, kui lazy load’i, vĂ”ib-olla isegi tunde).

Selle asemel saad sekundi-kahega need andmed, jookse test lĂ€bi ja viska need minema. Need snapshotid lahendavad erinevaid ĂŒlesandeid. Esimesel juhul — et skaleerida ja saada uusi replikaate, teisel — testideks.

ДС: Ma ei nĂ”ustu. HĂ€sti toimiva mahutite kloonimise tegemine on pilve ĂŒlesanne. Ma ei ole nende teostust vaadanud, aga tean, kuidas me seda riistvaral teeme. Meil on Ceph, milles vĂ”ib igale fĂŒĂŒsilisele mahutile (RBD) öelda clone ja saada mĂ”ne kĂŒmne millisekundi jooksul teine maht sama iseloomuga, IOPSjne. Tuleb mĂ”ista, et seal sees on keeruline copy-on-write. Miks pilv ei ĂŒritada samasugust lahendust teha? Olen kindel, et nad ĂŒritavad seda kuidagi saavutada.

НС: Kuid neil lĂ€hevad ikkagi sekundid, kĂŒmned sekundid, et instants ĂŒles tĂ”sta, Docker sinna tuua jne.

ДС: Miks peab tingimata ĂŒles tĂ”stma terve instantsi? Meil on ju instants 32 tuuma, 16... ja sellesse mahub teatud arv — nĂ€iteks neli. Kui tellime viienda, siis tĂ”useb instants ja siis kustutatakse see.

НС: Jah, huvitav, Kuberneteses on lugu teistsugune. Meie andmebaas ei ole K8s-is ja meil on ĂŒks instants. Kuid mitme terabaidi andmebaasi kloonimiseks kulub mitte rohkem kui kaks sekundit.

ДС: See on Ă€ge. Aga minu algne mĂ”te on see, et see ei ole ĂŒldine lahendus. Jah, see on kaunis, kuid sobib ainult Postgres’ile ja ainult ĂŒhes sĂ”lmest.

НС: See sobib mitte ainult Postgres’ile: need plaanid, nagu ma kirjeldasin, töötavad nii ainult seal. Kuid kui plaanide pĂ€rast ei muretse, vaid vajame lihtsalt kĂ”iki andmeid funktsionaalseks testimiseks, siis sobib see iga andmebaassi jaoks.

ДС: Palju aastaid tagasi tegime sarnast LVM-snapĆĄottidega. See on klassika. Sellist lĂ€henemist kasutati vĂ€ga aktiivselt. Lihtsalt stateful sĂ”lmed — see on valu. Sest neid ei tohi kukutada, neist tuleb alati meeles pidada...

НС: Kas sa ei nĂ€e siin mingit hĂŒbriidi vĂ”imalust? Oletame, et stateful on mingi pod, see töötab mitme inimese peal (palju testijaid). Meil on ĂŒks maht, aga tĂ€nu failisĂŒsteemile on kloonid — kohalikes. Kui pod kukub, jÀÀb kettale jĂ€rgi — pod tĂ”useb ĂŒles, loeb kĂ”igi kloonide teavet, tĂ”stab kĂ”ik tagasi ja ĂŒtleb: „Siin on teie kloonid nende portides, töötage nendega edasi.”

ДС: Tehniliselt tĂ€hendab see, et Kuberneteses on see ĂŒks pod, mille sees kĂ€itame mitut Postgres’i.

НС: Jah. Tal on piir: oletame, et samal ajal töötavad temaga mitte rohkem kui 10 inimest. Kui on vaja 20 — kĂ€ivitame teise sellise podi. TĂ€iesti on vĂ”imalik, et kloonime selle, saades teise tĂ€is mahu, millel on samad 10 „Ôhukest” klooni. Kas sa ei nĂ€e sellist vĂ”imalust?

ДС: Siin tuleb lisada turvakĂŒsimused. TĂŒĂŒporganisatsiooni puhul eeldatakse, et sellel pod’il on suured priviliegid (capabilities), kuna see vĂ”ib faili sĂŒsteemis teha mittestandardseid toiminguid... Aga siiski, ma usun, et keskpikas perspektiivis parandatakse Kubernetes storage'i, pilvedes tehakse kĂ”ik volĂŒĂŒmide ajalugu korda – kĂ”ik töötab lihtsalt. Olemas on resize, kloonimine... On maht - ĂŒtleme: „Loo uus selle pĂ”hjal” - ja poolteise sekundi pĂ€rast saame, mida vajame.

НС: Ma ei usu, et paljude terabaitide puhul on poolteist sekundit vĂ”imalik. Cephis teed ise, aga rÀÀgid pilvedest. Mine pilve, tee EC2-s kloon EBS mahust paljude terabaitide ulatuses ja vaata, milliseks jĂ”udluseks see muutub. See ei kesta paar sekundit. Mind huvitab, millal nad sellise tasemeni jĂ”uavad. Ma saan aru, millisest sa rÀÀgid, aga luban endal mitte nĂ”ustuda.

ДС: Okei, aga ma ĂŒtlesin, et keskpikas perspektiivis, mitte lĂŒhikese. Paari aasta jooksul.

Zalando PostgreSQL operaatori kohta

Selle kohtumise keskpaiku liitus temaga ka Aleksei Kljukin, endine arendaja Zalando’st, kes rÀÀkis PostgreSQL operaatori ajaloost:

Hea, et see teema ĂŒldse ĂŒles kerkis: nii Postgres kui Kubernetes. Kui me alustasime selle loomist Zalando's 2017. aastal, oli see teema, mille eest kĂ”ik soovisid tegeleda, kuid keegi ei teinud. KĂ”igil hakkas Kubernetes tekkima, aga kui kĂŒsiti, kuidas andmebaasidega olla, siis isegi sellised inimesed nagu Kelsey Hightower, kes propageerisid K8s-i, ĂŒtlesid umbes jĂ€rgmist:

„Minge haldusteenustele ja kasutage neid, Ă€rge kĂ€itage DB-d Kuberneteses. Muul juhul otsustab teie K8s nĂ€iteks teha uuenduse, sulgeb kĂ”ik sĂ”lmed ja teie andmed lĂ€hevad kaugele- kaugele.”

Me otsustasime teha operaatori, mis vastupidiselt sellele nĂ”uandele kĂ€ivitab PostgreSQL andmebaasi Kuberneteses. Ja meil oli hea alus - Patronit. See on automaatne failover PostgreSQL jaoks, mis on Ă”igesti tehtud, st kasutades etcd, consul vĂ”i ZooKeeper’t klastrite info hoidmiseks. Selline salvestus, mis jagab kĂ”igile, kes kĂŒsivad, nĂ€iteks, kes on praegu juht, sama teavet - sĂ”ltumata sellest, et meil on kĂ”ik jaotatud - et split brain’i ei tekiks. Pluss, meil oli Docker-ima selle jaoks.

Tegelikult tekkis vajadus auto failover'i jĂ€rele ettevĂ”ttel pĂ€rast sisemise riistvara andmekeskusest pilve ĂŒleminekut. Pilv pĂ”hines enda PaaS (Platform-as-a-Service) lahendusel. See oli avatud allikaga, kuid selle ĂŒlesseadmisega tuli kĂ”vasti vaeva nĂ€ha. Selle nimi oli STUPS.

Alguses ei olnud mingeid Kubernetes'e. Tegelikult, kui oma lahendust ĂŒles seati, oli K8s juba olemas, kuid see oli nii toores, et produktsiooniks ei sobinud. See oli minu arvates 2015. vĂ”i 2016. aasta. 2017. aastaks oli Kubernetes enam-vĂ€hem kĂŒps — tekkis vajadus migratsiooni jĂ€rele sinna.

Ja meil oli juba Docker-konteiner. Oli PaaS, mis kasutas Dockerit. Miks mitte proovida K8s? Miks mitte kirjutada oma operaator? Murat Kabilov, kes tuli meie juurde Avitost, alustas seda projekti isikliku algatuse pĂ”hjal — "mĂ€ngimiseks" — ja projekt "lendas".

Aga tegelikult tahtsin ma rÀÀkida AWS-ist. Miks seal oli ajalooliselt kood, mis oli seotud AWS-iga


Kui te kĂ€ivate oma midagi Kubernetes'es, peate mĂ”istma, et K8s on töö kĂ€igus. See areneb pidevalt, tĂ€iustatakse ja perioodiliselt isegi puruneb. Tuleb hoolikalt jĂ€lgida kĂ”iki muudatusi Kubernetes'es, olla valmis sĂŒvenema ja vĂ€lja selgitama, kuidas see detailides töötab — vĂ”ib-olla rohkem, kui sooviksite. See on pĂ”himĂ”tteliselt igal platvormil, millel te oma andmebaase kĂ€itate


Nii et kui me tegime operaatorit, oli meil Postgres, mis töötas vĂ€lise mahuga (antud juhul — EBS, kuna me tegutsesime AWS-is). Andmebaas kasvas, ja mingil hetkel tuli teha resize: nĂ€iteks, algne EBS suurus — 100 Tb, andmebaas jĂ”udis selleni, nĂŒĂŒd tahame EBS-i 200 Tb. Kuidas? Oletame, et vĂ”ib teha dump/restore uuele instantsile, kuid see on aeglane ja aeglane.

Seega soovisime sellist resize'i, mis suurendaks EBS-i osa ja seejĂ€rel ĂŒtleb failisĂŒsteemile, et kasutada uut ruumi. Ja me tegime seda, kuid sel ajal ei olnud Kubernetes'es ĂŒhtegi API-d resize'i operatsiooni jaoks. Kuna me tegutsesime AWS-is, kirjutasime oma API koodi.

Keegi ei takista sama teha teiste platvormide jaoks. Operaatoril ei ole sĂ”ltuvust, et seda saab kĂ€itada ainult AWS-is, vĂ”i et see ei tööta mujal. ÜhesĂ”naga, see on avatud allikaga projekt: kui kellegil on soov kiirendada uue API kasutuselevĂ”ttu — olete teretulnud. On GitHub, pull-requests — Zalando meeskond pĂŒĂŒab neile ĂŒsna kiiresti vastata ja operaatorit edendada. Nii palju kui ma tean, projekt osales Google Summer of Code'i ja mĂ”nedes teistes sarnastes algatustes. Zalando töötab selle kallal vĂ€ga aktiivselt.

P.S. Boonus!

Kui teid huvitab PostgreSQL ja Kubernetes, siis juhtime tÀhelepanu, et eelmisel nÀdalal toimus jÀrgmine Postgres-teisipÀev, kus Nikolai suhtles Alexander Kukushkiniga Zalando's. Video temast on saadaval siin.

P.P.S.

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster