
Det kommer oftere forespÞrseler fra kunder som sier: «Vi vil ha noe som Amazon RDS, men billigere»; «Vi vil ha noe som RDS, men overalt, i hvilken som helst infrastruktur». For Ä implementere en slik managed-lÞsning pÄ Kubernetes, har vi vurdert den nÄvÊrende tilstanden til de mest populÊre operatÞrene for PostgreSQL (Stolon, operatÞrene fra Crunchy Data og Zalando) og gjort vÄrt valg.
Denne artikkelen er vĂ„r oppsummerte erfaring, bĂ„de fra en teoretisk side (oversikt over lĂžsninger) og fra en praktisk side (hva som ble valgt og hva vi har oppnĂ„dd). Men la oss fĂžrst definere hvilke krav som stilles til en potensiell erstatning for RDS âŠ
Hva er egentlig RDS
NÄr folk snakker om RDS, antar vi, mener de en administrert (managed) databaseservice som:
- er lett Ă„ sette opp;
- har muligheten til Ă„ jobbe med snapshots og gjenopprette fra dem (helst med stĂžtte for );
- lar deg opprette master-slave-topologier;
- har et rikt utvalg av utvidelser;
- tilbyr revisjon og bruker-/tilgangsstyring.
Generelt sett kan tilnÊrmingene til Ä oppnÄ dette mÄlet vÊre ganske forskjellige, men metoden med en hypotetisk Ansible er ikke vÄr favoritt. (Kollegene fra 2GIS kom til en lignende konklusjon etter pÄ Ä lage et «verktÞy for rask distribusjon av et feilfri klynge basert pÄ Postgres».)
Det er nettopp operatĂžrer â en vanlig tilnĂŠrming for Ă„ lĂžse slike oppgaver i Kubernetes-Ăžkosystemet. Mer om dem, spesifikt for databaser som kjĂžrer innenfor Kubernetes, ble allerede beskrevet av teknisk direktĂžr for «Flanta», , i .
NB: For raskt Ä lage enkle operatÞrer anbefaler vi Ä ta en titt pÄ vÄrt open source-verktÞy . Ved Ä bruke det kan man gjÞre dette uten kunnskap om Go, men med mer kjente metoder for systemadministratorer: i Bash, Python osv.
For PostgreSQL finnes det flere populĂŠre K8s-operatĂžrer:
- Stolon;
- Crunchy Data PostgreSQL Operator;
- Zalando Postgres Operator.
La oss se nÊrmere pÄ dem.
Valget av operatĂžr
I tillegg til de viktige funksjonene som allerede er nevnt, forventet vi â som infrastrukturingeniĂžrer innen Kubernetes â ogsĂ„ fĂžlgende fra operatĂžrene:
- deploy fra Git og med ;
- stĂžtte for pod anti-affinity;
- installasjon av node affinity eller node selector;
- installasjon av tolerations;
- muligheter for tuning;
- forstÄelige teknologier og til og med kommandoer.
Utan att gÄ in pÄ detaljer om varje punkt (frÄga i kommentarerna om det finns nÄgra frÄgor kvar efter att ha lÀst hela artikeln), vill jag pÄpeka att dessa parametrar behövs för att ge en mer nyanserad beskrivning av noderna i klustret sÄ att vi kan bestÀlla dem för specifika applikationer. PÄ sÄ sÀtt kan vi uppnÄ en optimal balans mellan prestanda och kostnad.
Nu â till sjĂ€lva PostgreSQL-operatörerna.
1. Stolon
frÄn det italienska företaget Sorint.lab i betraktades som en typ av referens bland operatörerna för DBMS. Detta Àr ett ganska gammalt projekt: dess första offentliga release Àgde rum redan i november 2015(!), och GitHub-repositoriet kan stoltsera med nÀstan 3000 stjÀrnor och 40+ bidragsgivare.
Och verkligen, Stolon Àr ett utmÀrkt exempel pÄ genomtÀnkt arkitektur:

Med denna operatör kan man gĂ„ djupare i rapporten eller . Sammanfattningsvis kan man sĂ€ga att den kan göra allt som beskrivs: failover, proxy för transparent Ă„tkomst för kunder, backup⊠Dessutom tillhandahĂ„ller proxy Ă„tkomst via en enda tjĂ€nstpunkt â till skillnad frĂ„n de tvĂ„ andra lösningarna som beskrivs nedan (de har tvĂ„ tjĂ€nster för Ă„tkomst till databasen).
Men Stolon , vilket gör att den inte kan distribueras sĂ„ enkelt och snabbt â "som varma bakverk" â för att skapa DBMS-instanser i Kubernetes. Hantering görs via verktyget stolonctl, distribution via Helm-diagrammet, och anvĂ€ndardefinitioner anges i ConfigMap.
à ena sidan verkar det som om operatören inte riktigt Àr en operatör (eftersom den inte anvÀnder CRD). Men Ä andra sidan Àr detta ett flexibelt system som gör att man kan konfigurera resurser i K8s som man vill.
Sammanfattningsvis, personligen verkade det för oss inte optimalt att ha ett separat diagram för varje databas. DÀrför började vi söka alternativ.
2. Crunchy Data PostgreSQL Operator
, en ung amerikansk startup, verkade vara ett logiskt alternativ. Dess offentliga historia börjar med den första releasen i mars 2017, och sedan dess har GitHub-repositoriet fĂ„tt lite mindre Ă€n 1300 stjĂ€rnor och 50+ bidragsgivare. Den senaste releasen frĂ„n september har testats för arbete med Kubernetes 1.15â1.18, OpenShift 3.11+ och 4.4+, GKE och VMware Enterprise PKS 1.3+.
Arkitekturen av Crunchy Data PostgreSQL Operator uppfyller ocksÄ de angivna kraven:

Administrasjon skjer via et verktĂžy pgo, men det genererer i sin tur Custom Resources for Kubernetes. SĂ„ operatĂžren gledet oss som potensielle brukere:
- det finnes administrasjon via CRD;
- brukervennlig administrasjon (ogsÄ via CRD);
- integrasjon med andre komponenter â en spesialisert samling av containerbilder for PostgreSQL og verktĂžy for Ă„ jobbe med det (inkludert pgBackRest, pgAudit, utvidelser fra contrib osv.).
Men forsÞk pÄ Ä begynne Ä bruke operatÞren fra Crunchy Data avdekket flere problemer:
- Det var ikke mulig Ă„ bruke tolerations â bare nodeSelector var tilgjengelig.
- De opprettede podene var en del av Deployment, til tross for at vi distribuerte en stateful-applikasjon. I motsetning til StatefulSet kan ikke Deployment opprette disker.
Den siste ulempen fÞrte til morsomme situasjoner: pÄ testmiljÞet klarte vi Ä starte 3 replikater med én disk local storage, noe som resulterte i at operatÞren rapporterte at 3 replikater kjÞrte (selv om det ikke var tilfelle).
En annen funksjon ved denne operatÞren er dens ferdige integrasjon med ulike stÞttesystemer. For eksempel er det enkelt Ä installere pgAdmin og pgBounce, og i vurderes forhÄndsinnstilte Grafana og Prometheus. I den nylige blir det spesielt nevnt at integrasjonen med prosjektet , noe som gjÞr at operatÞren tilbyr visuell fremstilling av PgSQL-metrikker "out of the box".
Likevel fÞrte det merkelige valget av genererte Kubernetes-ressurser til at vi mÄtte finne en annen lÞsning.
3. Zalando Postgres Operator
Zalando-produkter er godt kjent for oss: vi har erfaring med Zalenium og selvfĂžlgelig har vi prĂžvd â deres populĂŠre HA-lĂžsning for PostgreSQL. Om selskapets tilnĂŠrming til Ă„ lage fortalte en av forfatterne, Alexey Klyukin, i sendingen , og vi likte det.
Dette er den nyeste lÞsningen blant de som vurderes i artikkelen: den fÞrste utgivelsen fant sted i august 2018. Men til tross for det relativt lille antallet offisielle utgivelser, har prosjektet gjort store fremskritt og allerede overgÄtt lÞsningen fra Crunchy Data med 1300+ stjerner pÄ GitHub og det hÞyeste antallet bidragsytere (70+).
«Under panseret» bruker denne operatÞren lÞsninger som er tidstestet:
- Patroni og for administrasjon,
- â for sikkerhetskopiering,
- â som en tilkoblingspool.
Slik er operatorarkitekturen fra Zalando presentert:

Operatoren administreres helt via Custom Resources, og oppretter automatisk en StatefulSet fra containere, som deretter kan tilpasses ved Ă„ legge til ulike sidecar-er i pod-en. Dette er et betydelig pluss sammenlignet med operatĂžren fra Crunchy Data.
Siden det var lĂžsningen fra Zalando vi valgte blant tre vurderte alternativer, vil videre beskrivelse av dens funksjoner bli presentert nedenfor, sammen med praksisen for anvendelse.
Praksis med Postgres Operator fra Zalando
Deployeringen av operatÞren skjer veldig enkelt: det er nok Ä laste ned den aktuelle utgaven fra GitHub og anvende YAML-filene fra direktorien . Som et alternativ kan man ogsÄ bruke .
Etter installasjonen bÞr man ta seg tid til Ä konfigurere . Dette gjÞres via ConfigMap postgres-operator i navnerommet hvor du installerte operatÞren. NÄr lagringsplassene er konfigurert, kan du deployere den fÞrste PostgreSQL-klusteret.
For eksempel ser vÄr standarddeployering slik ut:
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
Denne manifestet deployerer et kluster med tre eksemplarer med sidecar i form av , som vi henter applikasjonsmetrikker fra. Som du ser, er det veldig enkelt, og om Ăžnskelig kan man bruke bokstavelig talt et ubegrenset antall kluster.
Det er ogsĂ„ verdt Ă„ merke seg webpanelet for administrasjon â . Det leveres sammen med operatĂžren og lar deg opprette og slette kluster, samt arbeide med sikkerhetskopier som operatĂžren lager.

Liste over PostgreSQL-kluster

Administrering av sikkerhetskopier
En annen interessant funksjon er stÞtten for . Denne mekanismen oppretter automatisk roller i PostgreSQL, basert pÄ den mottatte listen av brukernavn. Deretter lar API-et deg returnere listen over brukere, for hvilke roller blir opprettet automatisk.
Problemer og lĂžsninger
Imidlertid avdekket bruken av operatĂžren snart flere betydelige ulemper:
- mangel pÄ stÞtte for nodeSelector;
- umulighet Ă„ deaktivere sikkerhetskopier;
- nÄr man bruker funksjonen for Ä opprette databaser, fÄr man ikke standardrettigheter;
- det mangler periodisk dokumentasjon, eller den er utdaterte.
Heldigvis kan mange av dem lĂžses. La oss begynne med slutten â problemer med dokumentasjon.
Det er sannsynlig at du vil oppleve at det ikke alltid er klart hvordan man spesifiserer sikkerhetskopiering og hvordan man kobler bakoverbĂžtte til Operator UI. Dette er nevnt kort i dokumentasjonen, mens en virkelig beskrivelse finnes i :
- du mÄ lage et hemmelig;
- overfĂžre det til operatĂžren som parameter
pod_environment_secret_namei CRD med innstillingene til operatĂžren eller i ConfigMap (avhengig av hvordan du har valgt Ă„ installere operatĂžren).
Imidlertid, som det viste seg, er dette for Ăžyeblikket umulig. Det er derfor vi samlet med noen ekstra tredjepartsarbeider. Mer om den â se nedenfor.
Hvis du overfĂžrer parametere til operatĂžren for sikkerhetskopiering, nemlig â wal_s3_bucket og tilgangsnĂžkler i AWS S3, vil den sikkerhetskopiere alt: ikke bare databaser i produksjon, men ogsĂ„ staging. Dette var ikke akseptabelt for oss.
I beskrivelsen av parametrene til Spilo, som er den grunnleggende Docker-innpakningen for PgSQL nÄr man bruker operatÞren, viste det seg: man kan overfÞre parameteren WAL_S3_BUCKET som tom, og dermed deaktivere sikkerhetskopier. Dessuten, til stor glede, ble det funnet en , som vi straks aksepterte i vÄrt fork. NÄ er det nok Ä legge til enableWALArchiving: false i ressursen til PostgreSQL-klyngen.
Ja, det var mulig Ă„ gjĂžre det annerledes, ved Ă„ kjĂžre 2 operatĂžrer: en for staging (uten sikkerhetskopier), og den andre â for produksjon. Men slik klarte vi oss med Ă©n.
Ok, vi lÊrte Ä gi databasene tilgang til S3, og sikkerhetskopiene begynte Ä komme inn i lagringen. Hvordan fÄr man sidene for sikkerhetskopier til Ä fungere i Operator UI?

I Operator UI mÄ du legge til 3 variabler:
-
SPILO_S3_BACKUP_BUCKET -
AWS_ACCESS_KEY_ID -
AWS_SECRET_ACCESS_KEY
Etter dette blir hÄndteringen av sikkerhetskopier tilgjengelig, noe som i vÄrt tilfelle forenkler arbeidet med staging, ved Ä tillate levering av utsnitt fra produksjon uten ekstra skript.
Som en annen fordel ble det nevnt at arbeidet med Teams API og de brede mulighetene for opprettelse av databaser og roller ved hjelp av operatĂžren. Imidlertid hadde de opprettede rollene ikke standardrettigheter.Dermed kunne en bruger med lĂŠserettigheder ikke lĂŠse de nye tabeller.
Hvorfor er det sĂ„dan? Selvom det i koden er nĂždvendigt, GRANT, de anvendes langt fra altid. Der er 2 metoder: syncPreparedDatabases og syncDatabases. I syncPreparedDatabases â selvom der i sektionen preparedDatabases er en betingelse defaultRoles og defaultUsers til oprettelse af roller, anvendes standardrettighederne ikke automatisk. Vi er i gang med at forberede en patch, sĂ„ disse rettigheder anvendes automatisk.
Og det sidste punkt i de forbedringer, der er relevante for os â , der tilfĂžjer Node Affinity til den oprettede StatefulSet. Vore kunder foretrĂŠkker ofte at reducere omkostningerne ved at bruge spot-instanser, og pĂ„ dem bĂžr man ikke placere databaser. Dette problem kunne ogsĂ„ lĂžses gennem tolerations, men tilstedevĂŠrelsen af Node Affinity giver stĂžrre sikkerhed.
Hvad kom der ud af det?
Som resultat af lÞsningen pÄ de nÊvnte problemer har vi forgrenet Postgres Operator fra Zalando til , hvor det samles med sÄ nyttige patches. For mere bekvemmelighed har vi ogsÄ samlet .
En liste over PR'er, der er accepteret i forgreningen:
- ;
- ;
- ;
- .
Det ville vÊre fantastisk, hvis fÊllesskabet stÞttede disse PR'er, sÄ de kom ind i upstream med den nÊste version af operatoren (1.6).
Bonus! Succeshistorie om migrering af produktion
Hvis du bruger Patroni, kan man migrere aktiv produktion til operatĂžren med minimal nedetid.
Spilo gÞr det muligt at lave standby-klynger via S3-lagring med , hvor den binÊre log PgSQL fÞrst gemmes i S3 og derefter hentes af replikationen. Men hvad skal man gÞre, hvis du ikke bruger Wal-E i en gammel infrastruktur? LÞsningen pÄ dette problem er allerede pÄ Habr.
Logisk replikation af PostgreSQL kommer til hjĂŠlp. Men lad os ikke dykke ned i detaljer om, hvordan man opretter publikationer og abonnementer, fordi... vores plan mislykkedes.
Problemet er, at der var flere belastede tabeller i databasen med millioner af rÊkker, som desuden konstant blev tilfÞjet og slettet. med copy_data, hvor en ny replik kopierer alt indhold fra master, kunne simpelthen ikke fÞlge med masteren. IndholdsoverfÞrslen fungerede i en uge, men nÄede aldrig masteren. Som fÞlge heraf hjalp kollegerne fra Avito: man kan overfÞre data ved at bruge pg_dump. Jeg vil beskrive vores (lidt forbedrede) version af denne algoritme.
Ideen er at man kan oprette en deaktiveret abonnement knyttet til en bestemt replikationsslot og derefter korrigere transaktionsnummeret. Der var replikaer til rÄdighed for production. Dette er vigtigt, da replikaen vil hjÊlpe med at skabe en konsistent dump og fortsÊtte med at modtage Êndringer fra masteren.
I de efterfĂžlgende kommandoer, der beskriver migreringsprocessen, vil fĂžlgende betegnelser blive brugt for vĂŠrtterne:
- master â kilde server;
- replica1 â stream-replika pĂ„ den gamle production;
- replica2 â ny logisk replika.
Migreringsplan
1. Opretter et abonnement pÄ alle tabeller i skemaet offentlig database dbname:
psql -h master -d dbname -c "CREATE PUBLICATION dbname FOR ALL TABLES;"
2. Opretter en replikationsslot pÄ masteren:
psql -h master -c "select pg_create_logical_replication_slot('repl', 'pgoutput');"
3. Stopper replikationen pÄ den gamle replika:
psql -h replica1 -c "select pg_wal_replay_pause();"
4. Henter transaktionsnummeret fra masteren:
psql -h master -c "select replay_lsn from pg_stat_replication where client_addr = 'replica1';"
5. Tag dump fra den gamle replika. Vi vil gÞre dette i flere trÄde, hvilket hjÊlper med at fremskynde processen:
pg_dump -h replica1 --no-publications --no-subscriptions -O -C -F d -j 8 -f dump/ dbname
6. Laster dumpen op pÄ den nye server:
pg_restore -h replica2 -F d -j 8 -d dbname dump/
7. Efter indlÊsning af dump kan replikationen startes pÄ stream-replikaen:
psql -h replica1 -c "select pg_wal_replay_resume();"
7. Opretter abonnement pÄ den nye logiske replika:
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. Henter oid af abonnementet:
psql -h replica2 -d dbname -c "select oid, * from pg_subscription;"
9. Antag, at der blev modtaget oid=1000. Anvender transaktionsnummeret pÄ abonnementet:
psql -h replica2 -d dbname -c "select pg_replication_origin_advance('pg_1000', 'AA/AAAAAAAA');"
10. Starter replikationen:
psql -h replica2 -d dbname -c "alter subscription oldprod enable;"
11. Kontrollerer status for abonnementet, replikationen bĂžr fungere:
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. NÄr replikationen er startet og databaserne er synkroniseret, kan der foretages et skift.
13. Efter at have deaktiveret replikationen skal sekvenserne korrigeres. Dette er godt beskrevet .
Takket vĂŠre denne plan blev skiftet gennemfĂžrt med minimale forsinkelser.
Konklusjon
Kubernetes-operatÞrar gjer det enklare Ä utfÞre ulike oppgÄver ved Ä redusere dei til Ä opprette K8s-ressursar. Men etter Ä ha oppnÄdd bemerkelsesverdig automatisering med dei, bÞr ein hugse at dette kan bringe med seg ein del uventa utfordringar, sÄ det er viktig Ä velje operatÞrar med omhu.
Etter Ä ha vurdert dei tre mest populÊre Kubernetes-operatÞrane for PostgreSQL, valde vi prosjektet frÄ Zalando. Og vi mÄtte overvinne visse vanskar, men resultatet var verkeleg tilfredsstillande, sÄ vi planlegg Ä utvide denne erfaringa til fleire andre PgSQL-installasjonar. Hvis du har erfaring med tilsvarande lÞysingar, vil vi gjerne sjÄ detaljar i kommentarane!
P.S.
Also read in our blog:
- «»;
- «»;
- «».
Kilde: habr.com
