
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:
- on kergesti seadistatav;
- omab vĂ”imalust töötada snapshots'itega ja taastuda neist (eelmisel juhul â toega );
- kurbab luua master-slave topoloogiaid;
- omab ulatuslikku laiendite nimekirja;
- 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 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: , in .
NB. Kasutades seda, on vĂ”imalik seda teha ilma teadmata Go keelt, kasutades rohkem sĂŒsteemiadministraatoritele tuttavaid viise: Bash, Python jne. PostgreSQL-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-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
Itaalia ettevĂ”tte Sorint.lab poolt 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:

Selle operaatori seadistuse ĂŒksikasjadega saab tutvuda ettekandes vĂ”i . Ă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 , 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ĐŸŃ
, 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:

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 â 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 kaalutakse eelkonfigureeritud Grafana ja Prometheus. Hiljutises mĂ€rgitakse eraldi paranenud integreerimist projektiga , 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 â nende populaarset HA-lahendust PostgreSQL jaoks. EttevĂ”tte lĂ€henemisest rÀÀkis ĂŒks selle autoritest â Aleksei Klyukin â saates , 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 halduseks,
- â varukoopiate jaoks,
- â ĂŒhenduste basena.
Siin on esitatud Zalando operaatori arhitektuur:

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. . Samuti vÔib kasutada .
PÀrast installimist tuleks muretseda See 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 , 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 â . See toob koos operaatoriga, mis vĂ”imaldab luua ja kustutada klustreid ning töötada operaatori poolt loodud varukoopiatena.

PostgreSQL klastrite nimekiri

Varukoopiate haldamine
Teine huvitav omadus on toimetamine . 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:
- nodeSelector'i toe puudumine;
- varukoopiate keelamise vÔimaluse puudumine;
- andmebaaside loomise funktsiooni kasutamine ei anna vaikimisi privileege;
- 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 :
- peate looma salajase;
- edastama selle operaatorile parameetrina
pod_environment_secret_nameCRD-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 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 , 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?

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 vajalikud GRANT, ei rakendata neid alati. On kaks meetodit: syncPreparedDatabases ja syncDatabases. Dokumendihalduses syncPreparedDatabases â ehkki sektsioonis preparedDatabases 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 â , 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 , kus see koguneb nii kasulike patchidega. Mugavuse huvides oleme kokku kogunud ka .
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 , 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 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. 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 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:
- master â algne server;
- replica1 â voogesitusreplikatsioon vanas production-is;
- 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 .
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
