
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:
- on lihtsalt seadistatav;
- ilma snapshot'ide toeta, mille abil taastuda (soovitatavalt â toetades );
- vÔib luua master-slave topoloogiaid;
- on rikkalik laiendite loetelu;
- 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 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â , in .
NB: Kiireks ja lihtsate operaatorite loomiseks soovitame tĂ€helepanu pöörata meie Open Source utiliidile . 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 ;
- 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
Itaalia ettevĂ”ttelt Sorint.lab 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:

Selle operaatori seadistamisega saab tutvuda ettekandes vĂ”i . Ă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 , 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
, 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:

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 â 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 kaalutakse eelnevalt seadistatud Grafana ja Prometheust. Hiljuti toodud vĂ€lja tĂ€iustatud integratsioon projekti , 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 â nende populaarne HA-lahendus PostgreSQL jaoks. EttevĂ”tte lĂ€henemisest rÀÀkis ĂŒks selle autoritest â Alexey Klyukin â saates , 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:
- Patroni ja halduseks,
- varukoopiate jaoks,
- ĂŒhenduste basena.
Siit on esitatud Zalando operaatori arhitektuur:

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. . Teise vÔimalusena saab kasutada ka .
PĂ€rast paigaldamist tuleks hoolitseda . 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 , 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 â . See tuleb koos operaatoriga ja vĂ”imaldab luua ja eemaldada klastreid ning töötada varukoopiate kallal, mida operaator loob.

PostgreSQL klastrite nimekiri

Varude haldamine
Teine huvitav omadus on . 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:
- nodeSelectori toe puudumine;
- varukoopiate keelamise vÔimatuse;
- andmebaaside loomise funktsiooni kasutamisel ei anta vaikimisi Ôigusi;
- 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 :
- saladus tuleb teha;
- edastada see operaatorile parameetri kaudu
pod_environment_secret_nameCRD-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 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 , 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?

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 vajalikud GRANT, neid ei rakendata alati. On kaks meetodit: syncPreparedDatabases ja syncDatabases. Failis syncPreparedDatabases â kuigi jaotises preparedDatabases 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 â , 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 , kus see kogutakse nende kasulike plaastritega. Ja mugavuse huvides kogusime ka .
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 , 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 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. 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 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:
- master â algserver;
- replica1 â voogereplikatsioon vanal tootmisserveril;
- 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 .
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
