PostgreSQL-i operaatorite lĂŒhitutvustus Kuberneteses, meie valik ja kogemus

PostgreSQL-i operaatorite lĂŒhitutvustus Kuberneteses, meie valik ja kogemus

Kliendid kĂŒsivad ĂŒha enam: „Tahame nagu Amazon RDS, aga odavamalt“; „Tahame nagu RDS, kuid igas infrastruktuuris“. Et luua sarnane hallatav lahendus Kuberneteses, vaatasime populaarseimate PostgreSQL operaatorite (Stolon, Crunchy Data ja Zalando operaatorid) praegust seisu ja tegime oma valiku.

See artikkel on meie saadud kogemus nii teoreetilisest (lahenduste ĂŒlevaade) kui ka praktilisest (mis valiti ning mis sellest sai) vaatenurgast. Kuid kĂ”igepealt selgitame vĂ€lja, millised nĂ”udmised esitatakse potentsiaalsele RDS asendusele...

Mis on RDS?

Kui inimesed rÀÀgivad RDS-ist, siis meie kogemuse kohaselt, nad mÔistavad hallatavat (managed) andmebaasiteenust, mis:

  1. on kergesti seadistatav;
  2. omab vĂ”imalust töötada snapshots'itega ja taastuda neist (eelmisel juhul — toega PITR);
  3. kurbab luua master-slave topoloogiaid;
  4. omab ulatuslikku laiendite nimekirja;
  5. pakub kasutajate/auditite ja juurdepÀÀsude haldamist.

Üldiselt vĂ”ivad lĂ€henemised seatud ĂŒlesande tĂ€itmiseks olla ĂŒsna erinevad, kuid tingimuslik Ansible on meile vÔÔras. (Sarnasele jĂ€reldusele jĂ”udsid ka 2GIS-i kolleegid oma katses luua "kiirelt paigaldatava talitlusrikka Postgres-klaastri tööriist".) Omandatud operaatorid on ĂŒldtunnustatud lĂ€henemine sarnaste probleemide lahendamiseks Kubernetes’e ökosĂŒsteemis. Rohkem teavet nende kohta, mida kasutada Kubernetes'e sees töötavates andmebaasides, jagas juba Flanta tehniline direktor

oma esitlustes: distol, in Kiire ja lihtne operaatorite loomine on soovitatav meie avatud lÀhtekoodiga utiliidiga.

NB. Kasutades seda, on vĂ”imalik seda teha ilma teadmata Go keelt, kasutades rohkem sĂŒsteemiadministraatoritele tuttavaid viise: Bash, Python jne. shell-operatorPostgreSQL-i jaoks on olemas mitu populaarset K8s-ooperatoori:

Stolon;

  • Crunchy Data PostgreSQL Operator;
  • Zalando Postgres Operator.
  • Vaatame neid lĂ€hemalt.

Operaatori valik

Peale nende oluliste vĂ”imaluste, mida oli juba eespool mainitud, ootasime – kui Kubernetes'i infrastruktuuri insenerid – operaatoritelt ka jĂ€rgmist:

Gitist paigaldamine ja

  • Kohandatud ressursid pod anti-affiniteedi toe;;
  • ĐżĐŸĐŽĐŽĐ”Ń€Đ¶Đșу pod anti-affinity;
  • node affinity vĂ”i node selector seadistamine;
  • toleratsioonide seadistamine;
  • tuning-vĂ”imaluste olemasolu;
  • arusaadavad tehnoloogiad ja isegi kĂ€sud.

Ilma igasse punkti detailidesse laskumata (kĂŒsige kommentaarides, kui tekivad kĂŒsimused pĂ€rast artikli lugemist), mĂ€rkida, et need parameetrid on vajalikud klastrite sĂ”lmede spetsialiseerumise tĂ€psemaks kirjeldamiseks, et tellida neid konkreetsete rakenduste jaoks. Nii saame saavutada optimaalse tasakaalu jĂ”udluse ja hinna vahel.

NĂŒĂŒd — PostgreSQL operaatorite juurde.

1. Stolon

Stolon Itaalia ettevĂ”tte Sorint.lab poolt juba mainitud ettekandes peeti mingisuguseks etaloniks andmebaasi operaatorite seas. See on ĂŒsna vana projekt: esimene avalik vĂ€ljaanne toimus juba 2015. aasta novembris(!), ja GitHubi repole on kogunenud peaaegu 3000 tĂ€hte ning 40+ panustajat.

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

PostgreSQL-i operaatorite lĂŒhitutvustus Kuberneteses, meie valik ja kogemus
Selle operaatori seadistuse ĂŒksikasjadega saab tutvuda ettekandes vĂ”i projekti dokumentatsioonist. Üldiselt vĂ”ib öelda, et see suudab kĂ”ike kirjeldatut: failover, klientide lĂ€bipaistva juurdepÀÀsu proxid, varukoopiad
 Lisaks pakuvad proxid juurdepÀÀsu lĂ€bi ĂŒhe teenuse lĂ”pp-punkti — erinevalt kahest jĂ€rgnevast lahendusest (neil on kaks teenust andmebaasi juurdepÀÀsuks).

Kuid Stolonil ei ole Custom Resources, mistĂ”ttu ei saa seda lihtsalt ja kiiresti nagu „kuuma pirukaga” DB eksemplare Kubernetesesse luua. Halduse teostab utiliit stolonctl, deploy on lĂ€bi Helm-charti, ja kasutaja mÀÀratleb need ConfigMap’is.

Ühelt poolt tundub, et operaator ei ole vĂ€ga operaator (sest ta ei kasuta CRD-d). Teiselt poolt on see paindlik sĂŒsteem, mis vĂ”imaldab seadistada ressursse K8s just nii, nagu soovite.

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

2. Crunchy Data PostgreSQL OperaatĐŸŃ€

Crunchy Data operaator, noore Ameerika idufirma nĂ€ib olevat loogiline alternatiiv. Selle avalik ajalugu algab esimesest versioonist mĂ€rtsis 2017, mille jĂ€rel on GitHubi repo saanud veidi vĂ€hem kui 1300 tĂ€hte ja 50+ kaastöötajat. Viimane vĂ€ljaanne septembris on testitud koos Kubernetes 1.15—1.18, OpenShift 3.11+ ja 4.4+, GKE ning VMware Enterprise PKS 1.3+.

Crunchy Data PostgreSQL operaatori arhitektuur vastab samuti deklareeritud nÔuetele:

PostgreSQL-i operaatorite lĂŒhitutvustus Kuberneteses, meie valik ja kogemus

Halduse tegemine toimub utiliidi kaudu pgo, kuid see genereerib omakorda Custom Resources Kubernetes'ele. Seega rÔÔmustas operaator meid, kui potentsiaalseid kasutajaid:

  • on haldus lĂ€bi CRD;
  • mugav kasutajate haldus (samuti lĂ€bi CRD);
  • integreerimine teiste komponentidega Crunchy Data Container Suite — spetsialiseeritud konteinerite piltide kogum PostgreSQL-i ja selle kasutamiseks mĂ”eldud utiliitide (sealhulgas pgBackRest, pgAudit, laiendused contrib-st jne) jaoks.

Siiski tÔi Crunchy Data operaatorit kasutama asudes esile mitmeid probleeme:

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

Viimane puudus toob kaasa lĂ”busaid hetki: testkeskkonnas Ă”nnestus kĂ€ivitada 3 koopiat ĂŒhe ketta abil kohalik salvestus, mistĂ”ttu operaator teatas, et 3 koopiat töötab (kuigi see polnud tĂ”si).

Veel ĂŒks selle operaatori omadus on selle valmis integreerimine erinevate abisĂŒsteemidega. NĂ€iteks on lihtne paigaldada pgAdmin ja pgBounce, samas dokumentatsioonis kaalutakse eelkonfigureeritud Grafana ja Prometheus. Hiljutises vĂ€ljaandes 4.5.0-beta1 mĂ€rgitakse eraldi paranenud integreerimist projektiga pgMonitor, mille tĂ”ttu operaator pakub PgSQL mÔÔdikute selget visualiseerimist „karbist vĂ€lja”.

Siiski viis kummaline valik genereeritud Kubernetes’i resursse meid vajaduseni leida muu lahendus.

3. Zalando Postgres Operator

Zalando tooted on meile ammu tuntud: meil on kogemusi Zaleniumi kasutamisega ja kindlasti oleme proovinud Patroni — nende populaarset HA-lahendust PostgreSQL jaoks. EttevĂ”tte lĂ€henemisest Postgres Operator rÀÀkis ĂŒks selle autoritest — Aleksei Klyukin — saates Postgres-teisipĂ€ev #5, ja see meeldis meile.

See on noorim lahendus artiklis arutletud: esimene versioon ilmus augustis 2018. aastal. Siiski, hoolimata vĂ€hesest ametlikust vĂ€ljalaskmisest, on projekt teinud suure sammu edasi, ĂŒletades juba populaarsuses Crunchy Data lahendust, millel on ĂŒle 1300 tĂ€he GitHubis ja maksimaalne kontriibutajate arv (ĂŒle 70).

Selle operaatori „all“ kasutatakse ajaga proovile pandud lahendusi:

  • Patroni ja Spilo halduseks,
  • WAL-E — varukoopiate jaoks,
  • PgBouncer — ĂŒhenduste basena.

Siin on esitatud Zalando operaatori arhitektuur:

PostgreSQL-i operaatorite lĂŒhitutvustus Kuberneteses, meie valik ja kogemus

Operaatorit saab tĂ€ielikult hallata Custom Resources kaudu, see loob automaatselt StatefulSet'i konteineritest, mida saab seejĂ€rel kohandada, lisades pod’i erinevaid sidecar’e. KĂ”ik see on suur pluss vĂ”rreldes Crunchy Data operaatoriga.

Kuna me valisime Zalando lahenduse kolme arutletud variandi seast, esitatakse allpool edasi selle vÔimaluste kirjeldus koos rakenduse praktikaga.

Zalando Postgres Operaatori praktika

Operaatori juurutamine toimub vÀga lihtsalt: piisab, kui laadida alla uusim vÀljaanne GitHubist ja rakendada YAML-failid kaustast. manifests. Samuti vÔib kasutada OperatorHub.

PĂ€rast installimist tuleks muretseda logide ja varunduste hoidlate seadistamise ĂŒleSee toimub lĂ€bi ConfigMap postgres-operator nimetuses, kuhu olete operaatori paigaldanud. Kui hoidlad on seadistatud, saab kĂ€itada esimese PostgreSQL klastrit.

NÀiteks meie standardne paigaldus nÀeb 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

Antud manifest paigaldab klastrit, kus on 3 eksemplari koos sidecar'iga postgres_exporter, millest vÔtame rakenduse mÔÔdikud. Nagu nÀete, on kÔik vÀga lihtne ja soovi korral saab luua sÔna otseses mÔttes piiramatu arvu klastreid.

Tasub tĂ€helepanu pöörata ka veebipaneelile haldamiseks — postgres-operator-ui. See toob koos operaatoriga, mis vĂ”imaldab luua ja kustutada klustreid ning töötada operaatori poolt loodud varukoopiatena.

PostgreSQL-i operaatorite lĂŒhitutvustus Kuberneteses, meie valik ja kogemus
PostgreSQL klastrite nimekiri

PostgreSQL-i operaatorite lĂŒhitutvustus Kuberneteses, meie valik ja kogemus
Varukoopiate haldamine

Teine huvitav omadus on toimetamine Teams API. Antud mehhanism genereerib automaatselt rolle PostgreSQLis, lÀhtuvalt saadud kasutajanime nimekirjast. PÀrast seda vÔimaldab API tagastada nimekirja kasutajatest, kellele loodakse automaatselt rollid.

Probleemid ja nende lahendamine

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

  1. nodeSelector'i toe puudumine;
  2. varukoopiate keelamise vÔimaluse puudumine;
  3. andmebaaside loomise funktsiooni kasutamine ei anna vaikimisi privileege;
  4. mÔnikord ei piisa dokumentatsioonist vÔi on see aegunud.

Õnneks saavad paljusid neist lahendada. Alustame lĂ”pust — probleemide osas dokumentatsiooniga.

TĂ”enĂ€oliselt kohtate olukordi, kus pole alati selge, kuidas varukoopia mÀÀrata ja kuidas ĂŒhendada varukoopia anum Operaatori kasutajaliidesega. Sellega seoses rÀÀgitakse dokumentatsioonis ainult ĂŒle, aga reaalne kirjeldus on PR:

  1. peate looma salajase;
  2. edastama selle operaatorile parameetrina pod_environment_secret_name CRD-s kujunduse seadetes vÔi ConfigMapis (sÔltub sellest, kuidas otsustasite operaatori installida).

Kuid nagu selgus, on see hetkel vĂ”imatu. TĂ€pselt sellepĂ€rast oleme kogunud oma versiooni operaatorist mĂ”ningate lisavĂ€liste arendustegevustega. Rohkem sellest — vaadake allpool.

Kui edastada operaatorile varukoopiate parameetrid, nimelt — wal_s3_bucket ja juurdepÀÀsuvĂ”tmed AWS S3-s, siis teeb ta varukoopiaid kĂ”igest: mitte ainult tootmisandmebaasidest, vaid ka staging'ist. See ei rahuldanud meid.

Spilo parameetrite kirjelduses, mis on pĂ”hine Docker-i kattes PgSQL töö kasutamisel operaatori kaudu, selgus, et saab edastada parameetri WAL_S3_BUCKET tĂŒhjana, seelĂ€bi varukoopiaid keelates. Lisaks, suureks rÔÔmuks leidsime ka valmis PR, mille me koheselt oma forki vĂ”tsime. NĂŒĂŒd piisab lihtsalt enableWALArchiving: false PostgreSQL klastrite ressursile lisamisest.

Jah, oli vĂ”imalus teisi teed minna, kĂ€ivitades 2 operaatorit: ĂŒks staging'i jaoks (ilma varukoopiateta) ja teine tootmise jaoks. Kuid nii suutsime hakkama saada ĂŒhega.

Okei, me Ôppisime edastama andmebaasides juurdepÀÀsu S3-le ja varukoopiad hakkasid laokogusse jÔudma. Kuidas saame tööle panna varukoopiate lehed Operator UI-s?

PostgreSQL-i operaatorite lĂŒhitutvustus Kuberneteses, meie valik ja kogemus

Operator UI-s tuleb lisada 3 muutuja:

  • SPILO_S3_BACKUP_BUCKET
  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

PÀrast seda muutub varundamise haldamine vÔimalikuks, mis meie puhul lihtsustab tööprotsesse stagingus, vÔimaldades tÔsta sinna tootmisandmeid ilma tÀiendavate skriptideta.

Veel ĂŒhe plussina toodi vĂ€lja töö Teams API-ga ja laiad vĂ”imalused andmebaaside ja rollide loomisel operaatori vahenditega. Kuid loodud rollid ei sisaldanud vaikimisi Ă”igusi.SeetĂ”ttu ei teadnud lugemisĂ”igustega kasutaja uusi tabeleid lugeda.

Miks nii? Kuigi koodis on has vajalikud GRANT, ei rakendata neid alati. On kaks meetodit: syncPreparedDatabases ja syncDatabases. Dokumendihalduses syncPreparedDatabases — ehkki sektsioonis preparedDatabases has on tingimus defaultRoles ja defaultUsers rollide loomise jaoks, ei rakendata vaikimisi Ă”igusi. Oleme valmis töötama patĆĄiga, et need Ă”igused rakenduksid automaatselt.

Ja viimane punkt meie praegustes tĂ€iustustes — plekk, lisades Node Affinity loodud StatefulSet'i. Meie kliendid eelistavad sageli kulusid vĂ€hendada, kasutades spot-instantse, kuid neid ei tohiks kasutada DBA teenuste jaoks. Selle kĂŒsimuse saaks lahendada ka toleratsioonidega, kuid Node Affinity olemasolu annab suurema kindluse.

Mis saime?

Nende probleemide lahendamise tulemuste pÔhjal forkasime Postgres Operatori Zalando'lt oma reposse, kus see koguneb nii kasulike patchidega. Mugavuse huvides oleme kokku kogunud ka Docker-image.

PR-de nimekiri, mis on forkis vastu vÔetud:

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

Boonus! Edulugu productioni migratsioonist

Kui kasutate Patronit, saate operaatoreid migratsiooni kaudu elava productioniga minimaalse seisaku kestuse.

Spilo vÔimaldab luua standby klastreid lÀbi S3 salvestuste Wal-E, kus PgSQL binaarlog kÔigepealt salvestatakse S3-sse ja seejÀrel laaditakse vÀlja koopiana. Aga mis siis, kui teil on ei kasutatakse Wal-E vanas infrastruktuuris? Selle probleemi lahendus on juba oli pakutud Habr's.

Siin tuleb appi PostgreSQL loogiline replikaat. Kuid me ei hakka detailidesse laskuma, kuidas vÀljaandeid ja tellimusi luua, sest... meie plaan ebaÔnnestus.

Asi on selles, et andmebaasis oli mitu koormatud tabelit, milles oli miljoneid ridu, mis pidevalt tĂ€ienesid ja kustutati. Lihtne tellimus koos copy_data, kui uus replika kopeerib kogu sisu originaalist, lihtsalt ei jĂ”udnud originaali jĂ€rgi. Sisu kopeerimine töötas nĂ€dal aega, kuid ei jĂ”udnud kunagi originaali jĂ€rele. LĂ”puks aitas probleemi lahendada artikkel kolleegid Avitost: andmeid saab ĂŒle kanda, kasutades pg_dump. Kirjeldan meie (veidi kohandatud) versiooni sellest algoritmist.

Idee on see, et saab teha vĂ€lja lĂŒlitatud tellimuse, mis on seotud konkreetse replikatsiooni ajavahemikuga, ja seejĂ€rel parandada tehingu numbrit. Oli olemas replikaad, et töödelda tootmisprotsessi. See on oluline, sest replika aitab luua jĂ€rjekindlat dump'i ja jĂ€tkata muudatuste saamist originaalist.

JÀrgnevatel kÀskudel, mis kirjeldavad migreerimisprotsessi, kasutatakse hostide tÀhistamiseks jÀrgmisi mÀrke:

  1. master — algne server;
  2. replica1 — voogesitusreplikatsioon vanas production-is;
  3. replica2 — uus loogiline replikatsioon.

Migratsiooniplaan

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

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

2. Loome replikaatsiooni slot'i masteris:

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

3. Peatame replikaatsiooni vanas replikas:

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

4. Saame masterist tehingu numbri:

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

5. Teeme vana replikast dump'i. Teeme seda mitmes voos, et kiirendada protsessi:

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 saab voogreplikatsiooni kÀivitada voogesitusreplikas:

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 oleme saanud oid=1000. Rakendame tehingu numbri tellimusele:

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

10. KĂ€ivitame replikeerimise:

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

11. Kontrollime tellimuse olekut, replikeerimine 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 replikeerimise kĂ€ivitamist ja andmebaaside sĂŒnkroniseerimist saab teostada vahetuse.

13. PĂ€rast replikeerimise katkestamist on vaja parandada jĂ€rjestused. Selle kohta on hea ĂŒlevaade artiklis wiki.postgresql.org.

TÀnu sellisele plaanile lÀks vahetus lÀbi vÔimalikult vÀikeste viivitustega.

KokkuvÔte

Kubernetes'i operaatorid lihtsustavad erinevaid toiminguid, muutes need K8s-resursside loomiseks. Kuid pĂ€rast hĂ€mmastava automatiseerimise saavutamist tuleks meeles pidada, et see vĂ”ib tuua kaasa ka mitmeid ootamatuid nĂŒansse, seega valige operaatorid teadlikult.

Vaadates kolme populaarseimat Kubernetes- operaatorit PostgreSQL-ile, otsustasime Zalando projekti kasuks. Sellest hoolimata tuli ĂŒletada teatavad raskused, kuid tulemus oli tĂ”eliselt rÔÔmustav, seega plaanime seda kogemust laiendada ka mĂ”nedele muudele PgSQL-installeerimistele. Kui teil on kogemusi sarnaste lahendustega, oleksime tĂ€nulikud, kui jagaksite ĂŒksikasju kommentaarides!

P.S.

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster