LĂŒhike ĂŒlevaade PostgreSQL operaatoritest Kuberneteses, meie valik ja kogemus

LĂŒhike ĂŒlevaade PostgreSQL operaatoritest Kuberneteses, meie valik ja kogemus

Kliendid kĂŒsivad ĂŒha enam: „Soovime nagu Amazon RDS, aga odavamalt“; „Soovime nagu RDS, aga igas infrastruktuuris“. Sellise hallatud lahenduse rakendamiseks Kuberneteses vaatasime ĂŒle kĂ”ige populaarsemate PostgreSQL operaatorite (Stolon, Crunchy Data ja Zalando operaatorid) hetkeolukorra ja tegime oma valiku.

See artikkel on meie saadud kogemus nii teoreetilisest kĂŒljest (lahenduste ĂŒlevaade) kui ka praktilisest kĂŒljest (mida valiti ja kuidas see vĂ€lja kukkus). Kuid kĂ”igepealt leiame vĂ€lja, millised nĂ”uded esitatakse vĂ”imaliku RDS asendaja suhtes...

Mis on RDS?

Kui inimesed rÀÀgivad RDS-ist, siis meie kogemuse jÀrgi mÔistetakse hallatavat (managed) andmebaasi teenust, mis:

  1. on lihtsalt seadistatav;
  2. ilma snapshot'ide toeta, mille abil taastuda (soovitatavalt — toetades PITR);
  3. vÔib luua master-slave topoloogiaid;
  4. on rikkalik laiendite loetelu;
  5. pakub kasutusÔiguste ja halduste auditit.

Kui rÀÀkida ĂŒldiselt, siis lĂ€henemisviisid seatud ĂŒlesande tĂ€itmiseks vĂ”ivad olla ĂŒsna erinevad, kuid Ansible'i tee ei ole meile lĂ€henev. (Sarnasele jĂ€reldusele jĂ”udsid ka meie kolleegid 2GIS-ist pĂ€rast oma katset luua „vahend kiireks tornaadoresistentse Postgresi klastrisse paigaldamiseks“.)

Just operaatorid on levinud lĂ€henemine sarnaste probleemide lahendamiseks Kubernetes ökosĂŒsteemis. RÀÀkisime nende rakendamisest andmebaaside kontekstis, mida kĂ€ivitatakse Kuberneteses, tehnilise direktor „Flantast“ distol, in oma ettekandes.

NB: Kiireks ja lihtsate operaatorite loomiseks soovitame tĂ€helepanu pöörata meie Open Source utiliidile shell-operator. Selle abil on vĂ”imalik seda teha ilma Go teadmisteta ja sĂŒsteemi administraatoritele tuttavamate meetoditega: Bash, Python jne.

PostgreSQL-i jaoks on mÔned populaarsed K8s operaatorid:

  • Stolon;
  • Crunchy Data PostgreSQL Operator;
  • Zalando Postgres Operator.

Vaadakem neid lÀhemalt.

Operaatori valik

Peale nende oluliste vĂ”imaluste, millest juba varem rÀÀgiti, ootasime me — Kubernetes infrastruktuurihalduriteks — operaatoritelt ka jĂ€rgmist:

  • deploeerimist Gitist ja Custom Resources;
  • pod anti-affinity toetust;
  • node affinity vĂ”i node selector seadistamist;
  • tolerations seadistamist;
  • hÀÀlestamisvĂ”imaluste olemasolu;
  • selged tehnoloogiad ja isegi kĂ€sud.

SĂŒviti detaile igast punktist (kĂŒsige kommentaarides, kui teil jÀÀb pĂ€rast artikli lugemist veel kĂŒsimusi), mĂ€rgin ĂŒldiselt, et need parameetrid on vajalikud klastrite sĂ”lmede spetsialiseerimise tĂ€psemaks kirjeldamiseks, et neid tellida konkreetselt rakenduste jaoks. Nii saame saavutada optimaalset tasakaalu jĂ”udluse ja hinna osas.

NĂŒĂŒd — PostgreSQL operaatorite juurde.

1. Stolon

Stolon Itaalia ettevĂ”ttelt Sorint.lab eelnevalt mainitud ettekandes peeti mingisuguseks standardiks andmebaasi operaatorite seas. See on ĂŒsna vana projekt: esimene avalik vĂ€ljaanne toimus juba novembris 2015(!), ja GitHubi hoidla vĂ”ib uhkeldada peaaegu 3000 tĂ€he ja 40+ kaasautorega.

Ja tÔepoolest, Stolon on suurepÀrane nÀide lÀbimÔeldud arhitektuurist:

LĂŒhike ĂŒlevaade PostgreSQL operaatoritest Kuberneteses, meie valik ja kogemus
Selle operaatori seadistamisega saab tutvuda ettekandes vĂ”i projekti dokumentatsioonis. Üldiselt vĂ”ib öelda, et ta suudab teha kĂ”ike, mis on kirjas: failover, lĂ€bipaistva kliendi juurdepÀÀsu proksid, varukoopiad... Lisaks pakuvad proksid ĂŒhte teeninduspunkti — erinevalt kahest teisest lahendusest, mida arutatakse edasi (nendel on kaks teenust andmebaasi juurde pÀÀsemiseks).

Kuid Stolonil pole Custom Resources, mis tĂ€hendab, et seda ei saa deploy'ida nii, et lihtsasti ja kiiresti — „nagu kuumad pirukad“ — luua andmebaasi eksemplare Kuberneteses. Halduse teostab utiliit stolonctl, deploy on lĂ€bi Helm chart'i ja kasutaja mÀÀratud ressursid mÀÀratakse ConfigMap'is.

Ühelt poolt nĂ€ib, et operaator ei olegi tĂ”eline operaator (kuna ta ei kasuta CRD-d). Teiselt poolt on tegemist paindliku sĂŒsteemiga, mis vĂ”imaldab ressursse K8s-s seadistada nii, nagu teile sobib.

KokkuvÔttes ei tundunud meile optimaalne luua eraldi chart iga andmebaasi jaoks. SeetÔttu hakkasime otsima alternatiive.

2. Crunchy Data PostgreSQL Operator

Crunchy Data operaator, noore Ameerika idufirma, nĂ€is loogilise alternatiivina. Selle avalik ajalugu algas esimese vĂ€ljaandega mĂ€rtsis 2017 ja sellest ajast on GitHubi hoidla saanud vĂ€hem kui 1300 tĂ€hte ja 50+ kaasautorit. Viimane vĂ€ljaanne septembrist on testitud koostöös Kubernetes 1.15—1.18, OpenShift 3.11+ ja 4.4+, GKE ja VMware Enterprise PKS 1.3+.

Crunchy Data PostgreSQL Operaatori arhitektuur vastab samuti nÔuetele:

LĂŒhike ĂŒlevaade PostgreSQL operaatoritest Kuberneteses, meie valik ja kogemus

Halduse teostamine toimub utiliidi kaudu pgo, kuid see genereerib omakorda Custom Resources Kubernetes'e jaoks. SeetÔttu rÔÔmustas meid kui potentsiaalseid kasutajaid operaator:

  • on haldamine lĂ€bi CRD;
  • mugav kasutajate haldamine (samuti lĂ€bi CRD);
  • integreerimine teiste komponentidega Crunchy Data Container Suite — spetsiaalne konteinerite piltide kogum PostgreSQL jaoks ja tööriistad selle kasutamiseks (sealhulgas pgBackRest, pgAudit, laiendused contrib-ist jne).

Siiski tÔid jÔupingutused Crunchy Data operaatori kasutusele vÔtmisega esile mitmeid probleeme:

  • Toleratsioonide vĂ”imalust ei olnud — ette nĂ€htud oli vaid nodeSelector.
  • Loodud pod'id olid osa Deployment'ist, kuigi me juurutame stateful rakendust. Erinevalt StatefulSet'ist ei oska Deployment'id luua kettaid.

Viimane puudus toob vĂ€lja lĂ”busaid momente: testkeskkonnas Ă”nnestus kĂ€ivitada 3 koopiat ĂŒhe ketta abil kohalikku salvestust, mistĂ”ttu operaator teatas, et 3 koopiat töötab (kuigi see polnud tĂ”si).

Veel ĂŒheks selle operaatori eripĂ€raks on valmis integratsioon erinevate abisĂŒsteemidega. NĂ€iteks on lihtne paigaldada pgAdmin ja pgBounce, ning dokumentatsioon kaalutakse eelnevalt seadistatud Grafana ja Prometheust. Hiljuti vĂ€lja antud versioonis 4.5.0-beta1 toodud vĂ€lja tĂ€iustatud integratsioon projekti pgMonitor, tĂ€nu millele operaator pakub visuaalset statistikat PgSQL ĂŒle vaate „karbist vĂ€lja“.

Sellegipoolest viis kummaline valik genereeritud Kubernetes'e ressurssidest meid vajadusele leida teine lahendus.

3. Zalando Postgres Operaator

Zalando tooted on meile juba pikka aega tuttavad: meil on kogemus Zalenium'i kasutamisest ja muidugi proovisin me ka Patronit — nende populaarne HA-lahendus PostgreSQL jaoks. EttevĂ”tte lĂ€henemisest Postgres Operaatori rÀÀkis ĂŒks selle autoritest — Alexey Klyukin — saates Postgres-teisipĂ€ev №5, ja see meeldis meile.

See on artiklis kĂ€sitletud noorim lahendus: esimene vĂ€ljaanne toimus 2018. aasta augustis. Siiski, hoolimata vĂ€ikesest ametlikest vĂ€ljaannetest, on projekt teinud suuri edusamme, edestades juba Crunchy Data lahendust, millel on ĂŒle 1300 tĂ€he GitHub'is ja maksimaalne panustajate arv (ĂŒle 70).

Selle operaatori „kapoti all“ on ajaliselt tĂ”estatud lahendused:

Siit on esitatud Zalando operaatori arhitektuur:

LĂŒhike ĂŒlevaade PostgreSQL operaatoritest Kuberneteses, meie valik ja kogemus

Operaatorit hallatakse tÀielikult Custom Resources kaudu, mis loob automaatselt StatefulSet'ist konteineridest, mida saab seejÀrel kohandada, lisades pod'i erinevaid sidecar'e. See on suur eelis vÔrreldes Crunchy Data operaatoriga.

Kuna just Zalando lahendus valiti kolmest kaalutud variandist, on allpool esitatud rohkem teavet selle vÔimaluste kohta koos rakenduse praktikaga.

Zalando Postgres Operaatori praktika

Operaatori juurutamine toimub vÀga lihtsalt: piisab, kui laadida alla uusim versioon GitHub'ist ja rakendada YAML-failid katalogist. manifests. Teise vÔimalusena saab kasutada ka OperatorHub.

PĂ€rast paigaldamist tuleks hoolitseda logide ja varukoopiate salvestusruumide seadistamise eest. See toimub ConfigMap kaudu postgres-operator nimetamiseks, kuhu operaator paigaldati. Kui salvestusruumid on seadistatud, saab juurutada esimese PostgreSQL klastri.

NÀiteks nÀeb meie standardne juurutamine vÀlja jÀrgmine:

apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
 name: staging-db
spec:
 numberOfInstances: 3
 patroni:
   synchronous_mode: true
 postgresql:
   version: "12"
 resources:
   limits:
     cpu: 100m
     memory: 1Gi
   requests:
     cpu: 100m
     memory: 1Gi
 sidecars:
 - env:
   - name: DATA_SOURCE_URI
     value: 127.0.0.1:5432
   - name: DATA_SOURCE_PASS
     valueFrom:
       secretKeyRef:
         key: password
         name: postgres.staging-db.credentials
   - name: DATA_SOURCE_USER
     value: postgres
   image: wrouesnel/postgres_exporter
   name: prometheus-exporter
   resources:
     limits:
       cpu: 500m
       memory: 100Mi
     requests:
       cpu: 100m
       memory: 100Mi
 teamId: staging
 volume:
   size: 2Gi

See manifest juurutab 3 eksemplari klastrit koos sidecar'iga postgres_exporter, mille kaudu kogume rakenduse mÔÔtmeid. Nagu nÀete, on kÔik vÀga lihtne ja soovi korral saab luua peaaegu piiramatu arvu klastreid.

Tasub tĂ€helepanu pöörata ka administratiivsele veebipaneelile — postgres-operator-ui. See tuleb koos operaatoriga ja vĂ”imaldab luua ja eemaldada klastreid ning töötada varukoopiate kallal, mida operaator loob.

LĂŒhike ĂŒlevaade PostgreSQL operaatoritest Kuberneteses, meie valik ja kogemus
PostgreSQL klastrite nimekiri

LĂŒhike ĂŒlevaade PostgreSQL operaatoritest Kuberneteses, meie valik ja kogemus
Varude haldamine

Teine huvitav omadus on Teams API. See mehhanism loob automaatselt rollid PostgreSQL-is, lÀhtudes saadud kasutajate nimede loendist. PÀrast seda vÔimaldab API esitada kasutajate loendi, kellele luuakse automaatselt rollid.

Probleemid ja nende lahendamine

Kuid operaatori kasutamine tÔi peagi esile mitmeid olulisi puudusi:

  1. nodeSelectori toe puudumine;
  2. varukoopiate keelamise vÔimatuse;
  3. andmebaaside loomise funktsiooni kasutamisel ei anta vaikimisi Ôigusi;
  4. vahel puudub dokumentatsioon vÔi on see aegunud.

Õnneks on paljud neist lahendatavad. Alustame lĂ”pust - probleemidega Microsofti dokumentatsioonile. Ainus tĂ€helepanek — Ubuntu distributsiooni oleme juba alla laadinud ja installime selle jĂ€rgmises etapis. Peaaegu kogu seadistamine seisneb Windowsi Linuxi alamsĂŒsteemi ja Virtuaalmasinate platvormi tĂ€iendavate komponentide lubamises ning seejĂ€rel arvuti seadete muutuste rakendamiseks taaskĂ€ivitamises:.

TĂ”enĂ€oliselt kohtub te sellega, et pole alati selge, kuidas mÀÀrata varukoopi ja kuidas ĂŒhendada varukoopia mahuti Operator UI-ga. Dokumentatsioon kĂ€sitleb seda pinnapealselt, reaalsed kirjeldused on PR:

  1. saladus tuleb teha;
  2. edastada see operaatorile parameetri kaudu pod_environment_secret_name CRD-s operaatori seadistustega vÔi ConfigMapis (olenevalt sellest, kuidas otsustasite operaatorit installida).

Kuid, nagu osutus, on see praegusel hetkel vÔimatu. SeetÔttu oleme kokku pannud oma versiooni operaatorist mÔnede lisanduvate vÀliste rakendustega. Rohkem teavet selle kohta - vt allpool.

Kui edastada operaatorile varukoopia parameetreid, nimelt - wal_s3_bucket ja AWS S3 ligipÀÀsuvÔtmed, siis hakkab see varundama kÔike: mitte ainult produktsioonis olevaid andmebaase, vaid ka stagingut. See ei sobinud meie jaoks.

Spilo parameetrite kirjeldamisel, mis on baasne Docker-i ĂŒmbrus PgSQL kasutamisel operaatori kaudu, selgus, et saab edastada parameetri WAL_S3_BUCKET tĂŒhjaks, seega saab varukoopiad vĂ€lja lĂŒlitada. Veelgi enam, suureks rÔÔmuks leidsime ka valmis PR-i, mille me kohe oma forki lisasime. NĂŒĂŒd on piisav lihtsalt lisada enableWALArchiving: false PostgreSQL klastri ressursile.

Jah, oli vĂ”imalus teha teisiti, kĂ€ivitades 2 operaatorit: ĂŒks stagingu jaoks (ilma varukoopiateta) ja teine - produktsiooni jaoks. Kuid nii suudame hakkama saada ĂŒhega.

Olgu, me Ôppisime andmebaasidesse S3 ligipÀÀsu edastama ja varukoopiad hakkasid salvestama. Kuidas saada töötama varukoopia lehed Operator UI-s?

LĂŒhike ĂŒlevaade PostgreSQL operaatoritest Kuberneteses, meie valik ja kogemus

Operator UI-s tuleb lisada 3 muutujat:

  • SPILO_S3_BACKUP_BUCKET
  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

PÀrast seda muutuvad varukoopiate haldamine vÔimalikuks, mis meie puhul lihtsustab tööd staginguga, vÔimaldades edastada sealt tootmiselt lÔike ilma tÀiendavate skriptideta.

Veel ĂŒhe plussina nimetati Teams API-d ja laias ulatuses vĂ”imalusi andmebaaside ja rollide loomisel operaatori kaudu. Kuid loodud rollidel ei olnud vaikimisi Ă”igusi. Vastavalt sellele ei saanud lugemisĂ”igustega kasutaja uusi tabeleid lugeda.

Miks nii? Kuigi koodis on on vajalikud GRANT, neid ei rakendata alati. On kaks meetodit: syncPreparedDatabases ja syncDatabases. Failis syncPreparedDatabases — kuigi jaotises preparedDatabases on on tingimus defaultRoles ja defaultUsers rollide loomiseks, — vaikimisi Ă”igusi ei rakendata. Meie töötame praegu plaastri kallal, et need Ă”igused automaatselt rakenduks.

Ja viimane punkt meie jaoks olulistes tĂ€iustustes — patĆĄ, mis lisab Node Affinity loodavasse StatefulSet'i. Meie kliendid eelistavad sageli kulusid vĂ€hendada, kasutades spot-instanse, ja neid ei tohiks kindlasti kasutada andmebaasiteenuste jaoks. Selle kĂŒsimuse saaks lahendada ka toleratsioonide abil, kuid Node Affinity olemasolu annab suurema kindluse.

Mis saime?

Nende probleemide lahendamise tulemusena harisime Zalando Postgres Operator'i oma enda hoidlate, kus see kogutakse nende kasulike plaastritega. Ja mugavuse huvides kogusime ka Docker-ima.

PR nimekiri, mis on forkis vastu vÔetud:

Oleks suurepÀrane, kui kogukond toetaks neid PR-e, et need jÔuaksid jÀrgmise operaatori versiooniga (1.6) upstream'i.

Boonus! Edukuse lugu produktsiooni migratsioonist

Kui kasutate Patronit, saate operaatorile migreerida elava produktsiooni minimaalsete seiskumistega.

Spilo vÔimaldab luua standby-kliustreid S3-hoidlate kaudu Wal-E, kui binaarne logi PgSQL salvestatakse esmalt S3-s, seejÀrel kopeeritakse replikaga. Aga mis teha, kui te ei kasutate Wal-E vanas infrastruktuuris? Selle probleemi lahendus on juba ettepanekud Habr's.

Abiks on PostgreSQL-i loogiline replikatsioon. Kuid Àrme lasku detailidesse, kuidas luua publikatsioone ja tellimusi, sest
 meie plaan ebaÔnnestus.

Asjaolu on see, et andmebaasis oli mitu koormatud tabelit miljonite ridadega, mis pidevalt tĂ€iendati ja kustutati. Lihtne tellimine jot copy_data, kui uus replik kopeerib kogu sisu meistrilt, ei jĂ”udnud lihtsalt meistrist mööda. Sisu kopeerimine töötas nĂ€dal aega, kuid ei jĂ”udnud meistrile jĂ€rgi. LĂ”ppkokkuvĂ”ttes aitas probleemi lahendada artikkel kolleeg Avitost: andmeid saab ĂŒle kanda, kasutades pg_dump. Kirjeldan meie (veidi tĂ€iustatud) varianti sellest algoritmist.

Idee on, et saab luua vĂ€lja lĂŒlitatud tellimuse, mis on seotud konkreetse replikeerimise slotiga ja seejĂ€rel parandada tehingu numbri. Kasutusel olid replikad tootmise jaoks. See on oluline, kuna replikad aitavad luua ĂŒhtse dump'i ja jĂ€tkata muudatuste saamist peastersest.

Edasistes mÀrkustes, mis kirjeldavad migreerimise protsessi, kasutatakse jÀrgmisi tÀhistusi hostide jaoks:

  1. master — algserver;
  2. replica1 — voogereplikatsioon vanal tootmisserveril;
  3. replica2 — uus loogiline replikatsioon.

Migreerimise plaan

1. Loome peasterses tellimuse kÔigi tabelite jaoks skeemis public andmebaasi dbname:

psql -h master -d dbname -c "CREATE PUBLICATION dbname FOR ALL TABLES;"

2. Loome replikeerimise slot peasterses:

psql -h master -c "select pg_create_logical_replication_slot('repl', 'pgoutput');"

3. Peatame replikatsiooni vanal replikal:

psql -h replica1 -c "select pg_wal_replay_pause();"

4. Saame tehingu numbri peastersest:

psql -h master -c "select replay_lsn from pg_stat_replication where client_addr = 'replica1';"

5. Teeme dump'i vanalt replikalt. Teeme seda mitmes voos, mis aitab protsessi kiirendada:

pg_dump -h replica1 --no-publications --no-subscriptions -O -C -F d -j 8 -f dump/ dbname

6. Laeme dump'i uuele serverile:

pg_restore -h replica2 -F d -j 8 -d dbname dump/

7. PÀrast dump'i laadimist on vÔimalik alustada replikatsiooni voogereplika peal:

psql -h replica1 -c "select pg_wal_replay_resume();"

7. Loome tellimuse uuel loogilisel replikal:

psql -h replica2 -c "create subscription oldprod connection 'host=replica1 port=5432 user=postgres password=secret dbname=dbname' publication dbname with (enabled = false, create_slot = false, copy_data = false, slot_name='repl');"

8. Saame oid tellimuse:

psql -h replica2 -d dbname -c "select oid, * from pg_subscription;"

9. Oletame, et saime oid=1000. Rakendame tehingu numbri tellimusele:

psql -h replica2 -d dbname -c "select pg_replication_origin_advance('pg_1000', 'AA/AAAAAAAA');"

10. Alustame replikatsiooni:

psql -h replica2 -d dbname -c "alter subscription oldprod enable;"

11. Kontrollime tellimuse staatust, replikatsioon peab töötama:

psql -h replica2 -d dbname -c "select * from pg_replication_origin_status;"
psql -h master -d dbname -c "select slot_name, restart_lsn, confirmed_flush_lsn from pg_replication_slots;"

12. PĂ€rast seda, kui replikatsioon on kĂ€ivitatud ja andmebaasid on sĂŒnkroonitud, on vĂ”imalik tĂ€ita lĂŒlitust.

13. PÀrast replikatsiooni peatamist tuleb parandada jÀrjestusi. Seda on hÀsti kirjeldatud artiklis wiki.postgresql.org.

Selle plaani tĂ”ttu Ă”nnestus lĂŒlitus viia lĂ€bi minimaalsete viivitustega.

KokkuvÔte

Kubernetesi operaatorid vĂ”imaldavad erinevaid toiminguid lihtsustada, vĂ€hendades need K8s-resursside loomisele. Kuid hoolimata suurepĂ€rasest automatiseerimisest, mida nende abil saavutatakse, tuleb meeles pidada, et see vĂ”ib tuua kaasa ka mitmeid ootamatuid nĂŒansse, seega valige operaatorid mĂ”istlikult.

Uurides kolme populaarseimat Kubernetesi operaatorit PostgreSQL jaoks, valisime Zalando projekti. Selle kasutamine tÔi kaasa teatud raskusi, kuid tulemus oli tÔeliselt rahuldustpakkuv, nii et plaanime laiendada seda kogemust ka mÔnele muule PgSQL installatsioonile. Kui teil on sarnaste lahenduste kasutamise kogemusi, ootame teid kommentaarides neid detailselt jagama!

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