{"id":95322,"date":"2020-09-28T07:42:39","date_gmt":"2020-09-28T05:42:39","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt"},"modified":"2020-09-28T07:42:39","modified_gmt":"2020-09-28T05:42:39","slug":"kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","status":"publish","type":"post","link":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","title":{"rendered":"En kort oversikt over PostgreSQL-operat\u00f8rer for Kubernetes, v\u00e5rt valg og erfaring","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"En kort oversikt over PostgreSQL-operat\u00f8rer for Kubernetes, v\u00e5rt valg og erfaring\" src=\"\/wp-content\/uploads\/2020\/09\/23b2db49941fa5bd5000358c8ffb991b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet kommer oftere foresp\u00f8rseler fra kunder som sier: \u00abVi vil ha noe som Amazon RDS, men billigere\u00bb; \u00abVi vil ha noe som RDS, men overalt, i hvilken som helst infrastruktur\u00bb. For \u00e5 implementere en slik managed-l\u00f8sning p\u00e5 Kubernetes, har vi vurdert den n\u00e5v\u00e6rende tilstanden til de mest popul\u00e6re operat\u00f8rene for PostgreSQL (Stolon, operat\u00f8rene fra Crunchy Data og Zalando) og gjort v\u00e5rt valg.<\/p>\n<p>Denne artikkelen er v\u00e5r oppsummerte erfaring, b\u00e5de fra en teoretisk side (oversikt over l\u00f8sninger) og fra en praktisk side (hva som ble valgt og hva vi har oppn\u00e5dd). Men la oss f\u00f8rst definere hvilke krav som stilles til en potensiell erstatning for RDS \u2026<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Hva er egentlig RDS<\/h2>\n<p>\nN\u00e5r folk snakker om RDS, antar vi, mener de en administrert (managed) databaseservice som:<\/p>\n<ol>\n<li>er lett \u00e5 sette opp;<\/li>\n<li>har muligheten til \u00e5 jobbe med snapshots og gjenopprette fra dem (helst med st\u00f8tte for <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Point-in-time_recovery\">PITR<\/a><\/noindex>);<\/li>\n<li>lar deg opprette master-slave-topologier;<\/li>\n<li>har et rikt utvalg av utvidelser;<\/li>\n<li>tilbyr revisjon og bruker-\/tilgangsstyring.<\/li>\n<\/ol>\n<p>\nGenerelt sett kan tiln\u00e6rmingene til \u00e5 oppn\u00e5 dette m\u00e5let v\u00e6re ganske forskjellige, men metoden med en hypotetisk Ansible er ikke v\u00e5r favoritt. (Kollegene fra 2GIS kom til en lignende konklusjon etter <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/509926\/\">deres fors\u00f8k<\/a><\/noindex> p\u00e5 \u00e5 lage et \u00abverkt\u00f8y for rask distribusjon av et feilfri klynge basert p\u00e5 Postgres\u00bb.)<\/p>\n<p>Det er nettopp operat\u00f8rer \u2013 en vanlig tiln\u00e6rming for \u00e5 l\u00f8se slike oppgaver i Kubernetes-\u00f8kosystemet. Mer om dem, spesifikt for databaser som kj\u00f8rer innenfor Kubernetes, ble allerede beskrevet av teknisk direkt\u00f8r for \u00abFlanta\u00bb, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/distol\/\" class=\"user_link\">distol<\/a><\/noindex>, i <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">i en av sine presentasjoner<\/a><\/noindex>.<\/p>\n<p><i><strong>NB<\/strong><\/i><i>: For raskt \u00e5 lage enkle operat\u00f8rer anbefaler vi \u00e5 ta en titt p\u00e5 v\u00e5rt open source-verkt\u00f8y <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/shell-operator\"><i>shell-operator<\/i><\/a><\/noindex><i>. Ved \u00e5 bruke det kan man gj\u00f8re dette uten kunnskap om Go, men med mer kjente metoder for systemadministratorer: i Bash, Python osv.<\/i><\/p>\n<p>For PostgreSQL finnes det flere popul\u00e6re K8s-operat\u00f8rer:<\/p>\n<ul>\n<li>Stolon;<\/li>\n<li>Crunchy Data PostgreSQL Operator;<\/li>\n<li>Zalando Postgres Operator.<\/li>\n<\/ul>\n<p>\nLa oss se n\u00e6rmere p\u00e5 dem.<\/p>\n<h2>Valget av operat\u00f8r<\/h2>\n<p>\nI tillegg til de viktige funksjonene som allerede er nevnt, forventet vi \u2013 som infrastrukturingeni\u00f8rer innen Kubernetes \u2013 ogs\u00e5 f\u00f8lgende fra operat\u00f8rene:<\/p>\n<ul>\n<li> deploy fra Git og med <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/extend-kubernetes\/operator\/#deploying-operators\">Custom Resources<\/a><\/noindex>;<\/li>\n<li> st\u00f8tte for pod anti-affinity;<\/li>\n<li> installasjon av node affinity eller node selector;<\/li>\n<li> installasjon av tolerations;<\/li>\n<li> muligheter for tuning;<\/li>\n<li> forst\u00e5elige teknologier og til og med kommandoer.<\/li>\n<\/ul>\n<p>\nUtan att g\u00e5 in p\u00e5 detaljer om varje punkt (fr\u00e5ga i kommentarerna om det finns n\u00e5gra fr\u00e5gor kvar efter att ha l\u00e4st hela artikeln), vill jag p\u00e5peka att dessa parametrar beh\u00f6vs f\u00f6r att ge en mer nyanserad beskrivning av noderna i klustret s\u00e5 att vi kan best\u00e4lla dem f\u00f6r specifika applikationer. P\u00e5 s\u00e5 s\u00e4tt kan vi uppn\u00e5 en optimal balans mellan prestanda och kostnad.<\/p>\n<p>Nu \u2014 till sj\u00e4lva PostgreSQL-operat\u00f6rerna.<\/p>\n<h3>1. Stolon<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\">Stolon<\/a><\/noindex> fr\u00e5n det italienska f\u00f6retaget Sorint.lab i <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">den redan n\u00e4mnda rapporten<\/a><\/noindex> betraktades som en typ av referens bland operat\u00f6rerna f\u00f6r DBMS. Detta \u00e4r ett ganska gammalt projekt: dess f\u00f6rsta offentliga release \u00e4gde rum redan i november 2015(!), och GitHub-repositoriet kan stoltsera med n\u00e4stan 3000 stj\u00e4rnor och 40+ bidragsgivare.<\/p>\n<p>Och verkligen, Stolon \u00e4r ett utm\u00e4rkt exempel p\u00e5 genomt\u00e4nkt arkitektur:<\/p>\n<p><img decoding=\"async\" alt=\"En kort oversikt over PostgreSQL-operat\u00f8rer for Kubernetes, v\u00e5rt valg og erfaring\" src=\"\/wp-content\/uploads\/2020\/09\/a34625c130bfd29c5645cf2417042de2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMed denna operat\u00f6r kan man g\u00e5 djupare i rapporten eller <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\/blob\/master\/doc\/architecture.md\">projektets dokumentation<\/a><\/noindex>. Sammanfattningsvis kan man s\u00e4ga att den kan g\u00f6ra allt som beskrivs: failover, proxy f\u00f6r transparent \u00e5tkomst f\u00f6r kunder, backup\u2026 Dessutom tillhandah\u00e5ller proxy \u00e5tkomst via en enda tj\u00e4nstpunkt \u2014 till skillnad fr\u00e5n de tv\u00e5 andra l\u00f6sningarna som beskrivs nedan (de har tv\u00e5 tj\u00e4nster f\u00f6r \u00e5tkomst till databasen).<\/p>\n<p>Men Stolon <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\/issues\/463#issuecomment-379666733\">har inga Custom Resources<\/a><\/noindex>, vilket g\u00f6r att den inte kan distribueras s\u00e5 enkelt och snabbt \u2014 \"som varma bakverk\" \u2014 f\u00f6r att skapa DBMS-instanser i Kubernetes. Hantering g\u00f6rs via verktyget <code>stolonctl<\/code>, distribution via Helm-diagrammet, och anv\u00e4ndardefinitioner anges i ConfigMap.<\/p>\n<p>\u00c5 ena sidan verkar det som om operat\u00f6ren inte riktigt \u00e4r en operat\u00f6r (eftersom den inte anv\u00e4nder CRD). Men \u00e5 andra sidan \u00e4r detta ett flexibelt system som g\u00f6r att man kan konfigurera resurser i K8s som man vill.<\/p>\n<p>Sammanfattningsvis, personligen verkade det f\u00f6r oss inte optimalt att ha ett separat diagram f\u00f6r varje databas. D\u00e4rf\u00f6r b\u00f6rjade vi s\u00f6ka alternativ.<\/p>\n<h3>2. Crunchy Data PostgreSQL Operator<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/postgres-operator\">Operat\u00f6ren fr\u00e5n Crunchy Data<\/a><\/noindex>, en ung amerikansk startup, verkade vara ett logiskt alternativ. Dess offentliga historia b\u00f6rjar med den f\u00f6rsta releasen i mars 2017, och sedan dess har GitHub-repositoriet f\u00e5tt lite mindre \u00e4n 1300 stj\u00e4rnor och 50+ bidragsgivare. Den senaste releasen fr\u00e5n september har testats f\u00f6r arbete med Kubernetes 1.15\u20141.18, OpenShift 3.11+ och 4.4+, GKE och VMware Enterprise PKS 1.3+.<\/p>\n<p>Arkitekturen av Crunchy Data PostgreSQL Operator uppfyller ocks\u00e5 de angivna kraven:<\/p>\n<p><img decoding=\"async\" alt=\"En kort oversikt over PostgreSQL-operat\u00f8rer for Kubernetes, v\u00e5rt valg og erfaring\" src=\"\/wp-content\/uploads\/2020\/09\/343cd0494abae42fcf5b47c5bb4eb310.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAdministrasjon skjer via et verkt\u00f8y <code>pgo<\/code>, men det genererer i sin tur Custom Resources for Kubernetes. S\u00e5 operat\u00f8ren gledet oss som potensielle brukere:<\/p>\n<ul>\n<li> det finnes administrasjon via CRD;<\/li>\n<li> brukervennlig administrasjon (ogs\u00e5 via CRD);<\/li>\n<li> integrasjon med andre komponenter <noindex><a rel=\"nofollow\" href=\"https:\/\/access.crunchydata.com\/documentation\/crunchy-postgres-containers\/4.3.1\/\">Crunchy Data Container Suite<\/a><\/noindex> \u2014 en spesialisert samling av containerbilder for PostgreSQL og verkt\u00f8y for \u00e5 jobbe med det (inkludert pgBackRest, pgAudit, utvidelser fra contrib osv.).<\/li>\n<\/ul>\n<p>\nMen fors\u00f8k p\u00e5 \u00e5 begynne \u00e5 bruke operat\u00f8ren fra Crunchy Data avdekket flere problemer:<\/p>\n<ul>\n<li>Det var ikke mulig \u00e5 bruke tolerations \u2014 bare nodeSelector var tilgjengelig.<\/li>\n<li>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.<\/li>\n<\/ul>\n<p>\nDen siste ulempen f\u00f8rte til morsomme situasjoner: p\u00e5 testmilj\u00f8et klarte vi \u00e5 starte 3 replikater med \u00e9n disk <i>local storage<\/i>, noe som resulterte i at operat\u00f8ren rapporterte at 3 replikater kj\u00f8rte (selv om det ikke var tilfelle).<\/p>\n<p>En annen funksjon ved denne operat\u00f8ren er dens ferdige integrasjon med ulike st\u00f8ttesystemer. For eksempel er det enkelt \u00e5 installere pgAdmin og pgBounce, og i <noindex><a rel=\"nofollow\" href=\"https:\/\/access.crunchydata.com\/documentation\/postgres-operator\/4.4.0\/installation\/other\/ansible\/installing-metrics\/\">dokumentasjonen<\/a><\/noindex> vurderes forh\u00e5ndsinnstilte Grafana og Prometheus. I den nylige <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/postgres-operator\/releases\/tag\/v4.5.0-beta.1\">utgivelsen 4.5.0-beta1<\/a><\/noindex> blir det spesielt nevnt at integrasjonen med prosjektet <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/pgmonitor\">pgMonitor<\/a><\/noindex>, noe som gj\u00f8r at operat\u00f8ren tilbyr visuell fremstilling av PgSQL-metrikker \"out of the box\".<\/p>\n<p>Likevel f\u00f8rte det merkelige valget av genererte Kubernetes-ressurser til at vi m\u00e5tte finne en annen l\u00f8sning.<\/p>\n<h3>3. Zalando Postgres Operator<\/h3>\n<p>\nZalando-produkter er godt kjent for oss: vi har erfaring med Zalenium og selvf\u00f8lgelig har vi pr\u00f8vd <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/patroni\">Patroni<\/a><\/noindex> \u2014 deres popul\u00e6re HA-l\u00f8sning for PostgreSQL. Om selskapets tiln\u00e6rming til \u00e5 lage <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\">Postgres Operator<\/a><\/noindex> fortalte en av forfatterne, Alexey Klyukin, i sendingen <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/479438\/\">Postgres tirsdag nr. 5<\/a><\/noindex>, og vi likte det.<\/p>\n<p>Dette er den nyeste l\u00f8sningen blant de som vurderes i artikkelen: den f\u00f8rste utgivelsen fant sted i august 2018. Men til tross for det relativt lille antallet offisielle utgivelser, har prosjektet gjort store fremskritt og allerede overg\u00e5tt l\u00f8sningen fra Crunchy Data med 1300+ stjerner p\u00e5 GitHub og det h\u00f8yeste antallet bidragsytere (70+).<\/p>\n<p>\u00abUnder panseret\u00bb bruker denne operat\u00f8ren l\u00f8sninger som er tidstestet:<\/p>\n<ul>\n<li> Patroni og <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/spilo\">Spilo<\/a><\/noindex> for administrasjon,<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wal-e\/wal-e\">WAL-E<\/a><\/noindex> \u2014 for sikkerhetskopiering,<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgbouncer\/pgbouncer\">PgBouncer<\/a><\/noindex> \u2014 som en tilkoblingspool.<\/li>\n<\/ul>\n<p>\nSlik er operatorarkitekturen fra Zalando presentert:<\/p>\n<p><img decoding=\"async\" alt=\"En kort oversikt over PostgreSQL-operat\u00f8rer for Kubernetes, v\u00e5rt valg og erfaring\" src=\"\/wp-content\/uploads\/2020\/09\/c66f10c1a818592ecaacd2db4ce5ace5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOperat\u00f8ren styres helt gjennom Custom Resources, og oppretter automatisk en StatefulSet av containere som deretter kan tilpasses ved \u00e5 legge til forskjellige sidecar-er i pod'en. Alt dette er et betydelig pluss sammenlignet med operat\u00f8ren fra Crunchy Data.<\/p>\n<p>Siden det var l\u00f8sningen fra Zalando vi valgte blant tre vurderte alternativer, vil videre beskrivelse av dens funksjoner bli presentert nedenfor, sammen med praksisen for anvendelse.<\/p>\n<h2>Praksis med Postgres Operator fra Zalando<\/h2>\n<p>\nDeployeringen av operat\u00f8ren skjer veldig enkelt: det er nok \u00e5 laste ned den aktuelle utgaven fra GitHub og anvende YAML-filene fra direktorien <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/tree\/master\/manifests\">manifester<\/a><\/noindex>. Som et alternativ kan man ogs\u00e5 bruke <noindex><a rel=\"nofollow\" href=\"https:\/\/operatorhub.io\/operator\/postgres-operator\">OperatorHub<\/a><\/noindex>.<\/p>\n<p>Etter installasjonen b\u00f8r man ta seg tid til \u00e5 konfigurere <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/reference\/operator_parameters.md#aws-or-gcp-interaction\">lagringsplasser for logger og sikkerhetskopier<\/a><\/noindex>. Dette gj\u00f8res via ConfigMap <code>postgres-operator<\/code> i navnerommet hvor du installerte operat\u00f8ren. N\u00e5r lagringsplassene er konfigurert, kan du deployere den f\u00f8rste PostgreSQL-klusteret.<\/p>\n<p>For eksempel ser v\u00e5r standarddeployering slik ut:<\/p>\n<pre><code class=\"plaintext\">apiVersion: acid.zalan.do\/v1\nkind: postgresql\nmetadata:\n name: staging-db\nspec:\n numberOfInstances: 3\n patroni:\n   synchronous_mode: true\n postgresql:\n   version: \"12\"\n resources:\n   limits:\n     cpu: 100m\n     memory: 1Gi\n   requests:\n     cpu: 100m\n     memory: 1Gi\n sidecars:\n - env:\n   - name: DATA_SOURCE_URI\n     value: 127.0.0.1:5432\n   - name: DATA_SOURCE_PASS\n     valueFrom:\n       secretKeyRef:\n         key: password\n         name: postgres.staging-db.credentials\n   - name: DATA_SOURCE_USER\n     value: postgres\n   image: wrouesnel\/postgres_exporter\n   name: prometheus-exporter\n   resources:\n     limits:\n       cpu: 500m\n       memory: 100Mi\n     requests:\n       cpu: 100m\n       memory: 100Mi\n teamId: staging\n volume:\n   size: 2Gi\n<\/code><\/pre>\n<p>\nDenne manifestet deployerer et kluster med tre eksemplarer med sidecar i form av <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wrouesnel\/postgres_exporter\">postgres_exporter<\/a><\/noindex>, som vi henter applikasjonsmetrikker fra. Som du ser, er det veldig enkelt, og om \u00f8nskelig kan man bruke bokstavelig talt et ubegrenset antall kluster.<\/p>\n<p>Det er ogs\u00e5 verdt \u00e5 merke seg <b>webpanelet for administrasjon<\/b> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/operator-ui.md\">postgres-operator-ui<\/a><\/noindex>. Det leveres sammen med operat\u00f8ren og lar deg opprette og slette kluster, samt arbeide med sikkerhetskopier som operat\u00f8ren lager.<\/p>\n<p><img decoding=\"async\" alt=\"En kort oversikt over PostgreSQL-operat\u00f8rer for Kubernetes, v\u00e5rt valg og erfaring\" src=\"\/wp-content\/uploads\/2020\/09\/2e9ae033a9817d101c843ce061aafdb5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Liste over PostgreSQL-kluster<\/i><\/p>\n<p><img decoding=\"async\" alt=\"En kort oversikt over PostgreSQL-operat\u00f8rer for Kubernetes, v\u00e5rt valg og erfaring\" src=\"\/wp-content\/uploads\/2020\/09\/74a65f7f301da14a0cb7bea6d5ef84ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Administrering av sikkerhetskopier<\/i><\/p>\n<p>En annen interessant funksjon er st\u00f8tten for <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/user.md#teams-api-roles\">Teams API<\/a><\/noindex>. Denne mekanismen oppretter automatisk <b>roller i PostgreSQL<\/b>, basert p\u00e5 den mottatte listen av brukernavn. Deretter lar API-et deg returnere listen over brukere, for hvilke roller blir opprettet automatisk.<\/p>\n<h3>Problemer og l\u00f8sninger<\/h3>\n<p>\nImidlertid avdekket bruken av operat\u00f8ren snart flere betydelige ulemper:<\/p>\n<ol>\n<li> mangel p\u00e5 st\u00f8tte for nodeSelector;<\/li>\n<li> umulighet \u00e5 deaktivere sikkerhetskopier;<\/li>\n<li> n\u00e5r man bruker funksjonen for \u00e5 opprette databaser, f\u00e5r man ikke standardrettigheter;<\/li>\n<li> det mangler periodisk dokumentasjon, eller den er utdaterte.<\/li>\n<\/ol>\n<p>\nHeldigvis kan mange av dem l\u00f8ses. La oss begynne med slutten \u2013 problemer med <strong>dokumentasjon<\/strong>. <\/p>\n<p>Det er sannsynlig at du vil oppleve at det ikke alltid er klart hvordan man spesifiserer sikkerhetskopiering og hvordan man kobler bakoverb\u00f8tte til Operator UI. Dette er nevnt kort i dokumentasjonen, mens en virkelig beskrivelse finnes i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/481\">PR<\/a><\/noindex>:<\/p>\n<ol>\n<li>du m\u00e5 lage et hemmelig;<\/li>\n<li>overf\u00f8re det til operat\u00f8ren som parameter <code>pod_environment_secret_name<\/code> i CRD med innstillingene til operat\u00f8ren eller i ConfigMap (avhengig av hvordan du har valgt \u00e5 installere operat\u00f8ren).<\/li>\n<\/ol>\n<p>\nImidlertid, som det viste seg, er dette for \u00f8yeblikket umulig. Det er derfor vi samlet <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/postgres-operator\">v\u00e5r versjon av operat\u00f8ren<\/a><\/noindex> med noen ekstra tredjepartsarbeider. Mer om den \u2014 se nedenfor.<\/p>\n<p>Hvis du overf\u00f8rer parametere til operat\u00f8ren for sikkerhetskopiering, nemlig \u2014 <code>wal_s3_bucket<\/code> og tilgangsn\u00f8kler i AWS S3, vil den <strong>sikkerhetskopiere alt<\/strong>: ikke bare databaser i produksjon, men ogs\u00e5 staging. Dette var ikke akseptabelt for oss.<\/p>\n<p>I beskrivelsen av parametrene til Spilo, som er den grunnleggende Docker-innpakningen for PgSQL n\u00e5r man bruker operat\u00f8ren, viste det seg: man kan overf\u00f8re parameteren <code>WAL_S3_BUCKET<\/code> som tom, og dermed deaktivere sikkerhetskopier. Dessuten, til stor glede, ble det funnet en <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/908\">ferdig PR<\/a><\/noindex>, som vi straks aksepterte i v\u00e5rt fork. N\u00e5 er det nok \u00e5 legge til <code>enableWALArchiving: false<\/code> i ressursen til PostgreSQL-klyngen.<\/p>\n<p>Ja, det var mulig \u00e5 gj\u00f8re det annerledes, ved \u00e5 kj\u00f8re 2 operat\u00f8rer: en for staging (uten sikkerhetskopier), og den andre \u2014 for produksjon. Men slik klarte vi oss med \u00e9n.<\/p>\n<p>Ok, vi l\u00e6rte \u00e5 gi databasene tilgang til S3, og sikkerhetskopiene begynte \u00e5 komme inn i lagringen. Hvordan f\u00e5r man sidene for sikkerhetskopier til \u00e5 fungere i Operator UI?<\/p>\n<p><img decoding=\"async\" alt=\"En kort oversikt over PostgreSQL-operat\u00f8rer for Kubernetes, v\u00e5rt valg og erfaring\" src=\"\/wp-content\/uploads\/2020\/09\/46169b53707b0bbb686798c655022f40.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI Operator UI m\u00e5 du legge til 3 variabler:<\/p>\n<ul>\n<li> <code>SPILO_S3_BACKUP_BUCKET<\/code><\/li>\n<li> <code>AWS_ACCESS_KEY_ID<\/code><\/li>\n<li> <code>AWS_SECRET_ACCESS_KEY<\/code><\/li>\n<\/ul>\n<p>\nEtter dette blir h\u00e5ndteringen av sikkerhetskopier tilgjengelig, noe som i v\u00e5rt tilfelle forenkler arbeidet med staging, ved \u00e5 tillate levering av utsnitt fra produksjon uten ekstra skript.<\/p>\n<p>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\u00f8ren. Imidlertid hadde de opprettede <strong>rollene ikke standardrettigheter.<\/strong>Dermed kunne en bruger med l\u00e6serettigheder ikke l\u00e6se de nye tabeller.<\/p>\n<p>Hvorfor er det s\u00e5dan? Selvom det i koden <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/pkg\/cluster\/database.go#L42\">det finnes<\/a><\/noindex> er n\u00f8dvendigt, <code>GRANT<\/code>, de anvendes langt fra altid. Der er 2 metoder: <code>syncPreparedDatabases<\/code> og <code>syncDatabases<\/code>. I <code>syncPreparedDatabases<\/code> \u2014 selvom der i sektionen <code>preparedDatabases<\/code> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/manifests\/complete-postgres-manifest.yaml#L26\">det finnes<\/a><\/noindex> er en betingelse <code>defaultRoles<\/code> og <code>defaultUsers<\/code> til oprettelse af roller, anvendes standardrettighederne ikke automatisk. Vi er i gang med at forberede en patch, s\u00e5 disse rettigheder anvendes automatisk.<\/p>\n<p>Og det sidste punkt i de forbedringer, der er relevante for os \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/975\">patch<\/a><\/noindex>, der tilf\u00f8jer Node Affinity til den oprettede StatefulSet. Vore kunder foretr\u00e6kker ofte at reducere omkostningerne ved at bruge spot-instanser, og p\u00e5 dem b\u00f8r man ikke placere databaser. Dette problem kunne ogs\u00e5 l\u00f8ses gennem tolerations, men tilstedev\u00e6relsen af Node Affinity giver st\u00f8rre sikkerhed.<\/p>\n<h3>Hvad kom der ud af det?<\/h3>\n<p>\nSom resultat af l\u00f8sningen p\u00e5 de n\u00e6vnte problemer har vi forgrenet Postgres Operator fra Zalando til <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/postgres-operator\">vores eget repository,<\/a><\/noindex>, hvor det samles med s\u00e5 nyttige patches. For mere bekvemmelighed har vi ogs\u00e5 samlet <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/flant\/postgres-operator\">Docker-image<\/a><\/noindex>.<\/p>\n<p>En liste over PR'er, der er accepteret i forgreningen:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/1066\">opbygning af en sikker letv\u00e6gts Docker-billede til operat\u00f8ren<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/908\">deaktivering af sikkerhedskopier<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/1121\">opdatering af ressourceversioner til de aktuelle versioner af k8s<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/975\">implementering af Node Affinity<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\nDet ville v\u00e6re fantastisk, hvis f\u00e6llesskabet st\u00f8ttede disse PR'er, s\u00e5 de kom ind i upstream med den n\u00e6ste version af operatoren (1.6).<\/p>\n<h2>Bonus! Succeshistorie om migrering af produktion<\/h2>\n<p>\nHvis du bruger Patroni, kan man migrere aktiv produktion til operat\u00f8ren med minimal nedetid.<\/p>\n<p>Spilo g\u00f8r det muligt at lave standby-klynger via S3-lagring med <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wal-e\/wal-e\">Wal-E,<\/a><\/noindex>, hvor den bin\u00e6re log PgSQL f\u00f8rst gemmes i S3 og derefter hentes af replikationen. Men hvad skal man g\u00f8re, hvis du <i>ikke<\/i> bruger Wal-E i en gammel infrastruktur? L\u00f8sningen p\u00e5 dette problem er allerede <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/true_engineering\/blog\/437318\/\">blevet foresl\u00e5et<\/a><\/noindex> p\u00e5 Habr.<\/p>\n<p>Logisk replikation af PostgreSQL kommer til hj\u00e6lp. Men lad os ikke dykke ned i detaljer om, hvordan man opretter publikationer og abonnementer, fordi... vores plan mislykkedes.<\/p>\n<p>Problemet er, at der var flere belastede tabeller i databasen med millioner af r\u00e6kker, som desuden konstant blev tilf\u00f8jet og slettet. <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgrespro\/12\/sql-createsubscription\">Simpelt abonnement<\/a><\/noindex> med <code>copy_data<\/code>, hvor en ny replik kopierer alt indhold fra master, kunne simpelthen ikke f\u00f8lge med masteren. Indholdsoverf\u00f8rslen fungerede i en uge, men n\u00e5ede aldrig masteren. Som f\u00f8lge heraf hjalp <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/avitotech\/recovery-use-cases-for-logical-replication-in-postgresql-10-a1e6bab03072\">article<\/a><\/noindex> kollegerne fra Avito: man kan overf\u00f8re data ved at bruge <code>pg_dump<\/code>. Jeg vil beskrive vores (lidt forbedrede) version af denne algoritme.<\/p>\n<p>Ideen er at man kan oprette en deaktiveret abonnement knyttet til en bestemt replikationsslot og derefter korrigere transaktionsnummeret. Der var replikaer til r\u00e5dighed for production. Dette er vigtigt, da replikaen vil hj\u00e6lpe med at skabe en konsistent dump og forts\u00e6tte med at modtage \u00e6ndringer fra masteren.<\/p>\n<p>I de efterf\u00f8lgende kommandoer, der beskriver migreringsprocessen, vil f\u00f8lgende betegnelser blive brugt for v\u00e6rtterne:<\/p>\n<ol>\n<li><i>master<\/i> \u2014 kilde server;<\/li>\n<li><i>replica1<\/i> \u2014 stream-replika p\u00e5 den gamle production;<\/li>\n<li><i>replica2<\/i> \u2014 ny logisk replika.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Migreringsplan<\/h3>\n<p>\n1. Opretter et abonnement p\u00e5 alle tabeller i skemaet <code>offentlig<\/code> database <code>dbname<\/code>:<\/p>\n<pre><code class=\"bash\">psql -h master -d dbname -c \"CREATE PUBLICATION dbname FOR ALL TABLES;\"\n<\/code><\/pre>\n<p>\n2. Opretter en replikationsslot p\u00e5 masteren:<\/p>\n<pre><code class=\"bash\">psql -h master -c \"select pg_create_logical_replication_slot('repl', 'pgoutput');\"\n<\/code><\/pre>\n<p>\n3. Stopper replikationen p\u00e5 den gamle replika:<\/p>\n<pre><code class=\"bash\">psql -h replica1 -c \"select pg_wal_replay_pause();\"\n<\/code><\/pre>\n<p>\n4. Henter transaktionsnummeret fra masteren:<\/p>\n<pre><code class=\"bash\">psql -h master -c \"select replay_lsn from pg_stat_replication where client_addr = 'replica1';\"\n<\/code><\/pre>\n<p>\n5. Tag dump fra den gamle replika. Vi vil g\u00f8re dette i flere tr\u00e5de, hvilket hj\u00e6lper med at fremskynde processen:<\/p>\n<pre><code class=\"bash\">pg_dump -h replica1 --no-publications --no-subscriptions -O -C -F d -j 8 -f dump\/ dbname\n<\/code><\/pre>\n<p>\n6. Laster dumpen op p\u00e5 den nye server:<\/p>\n<pre><code class=\"bash\">pg_restore -h replica2 -F d -j 8 -d dbname dump\/\n<\/code><\/pre>\n<p>\n7. Efter indl\u00e6sning af dump kan replikationen startes p\u00e5 stream-replikaen:<\/p>\n<pre><code class=\"bash\">psql -h replica1 -c \"select pg_wal_replay_resume();\"\n<\/code><\/pre>\n<p>\n7. Opretter abonnement p\u00e5 den nye logiske replika:<\/p>\n<pre><code class=\"bash\">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');\"\n<\/code><\/pre>\n<p>\n8. Henter <code>oid<\/code> af abonnementet:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c \"select oid, * from pg_subscription;\"\n<\/code><\/pre>\n<p>\n9. Antag, at der blev modtaget <code>oid=1000<\/code>. Anvender transaktionsnummeret p\u00e5 abonnementet:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c \"select pg_replication_origin_advance('pg_1000', 'AA\/AAAAAAAA');\"\n<\/code><\/pre>\n<p>\n10. Starter replikationen:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c \"alter subscription oldprod enable;\"\n<\/code><\/pre>\n<p>\n11. Kontrollerer status for abonnementet, replikationen b\u00f8r fungere:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c \"select * from pg_replication_origin_status;\"\npsql -h master -d dbname -c \"select slot_name, restart_lsn, confirmed_flush_lsn from pg_replication_slots;\"\n<\/code><\/pre>\n<p>\n12. N\u00e5r replikationen er startet og databaserne er synkroniseret, kan der foretages et skift.<\/p>\n<p>13. Efter at have deaktiveret replikationen skal sekvenserne korrigeres. Dette er godt beskrevet <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Fixing_Sequences\">i artiklen p\u00e5 wiki.postgresql.org<\/a><\/noindex>.<\/p>\n<p>Takket v\u00e6re denne plan blev skiftet gennemf\u00f8rt med minimale forsinkelser.<\/p>\n<h2>Konklusjon<\/h2>\n<p>\nKubernetes-operat\u00f8rar gjer det enklare \u00e5 utf\u00f8re ulike oppg\u00e5ver ved \u00e5 redusere dei til \u00e5 opprette K8s-ressursar. Men etter \u00e5 ha oppn\u00e5dd bemerkelsesverdig automatisering med dei, b\u00f8r ein hugse at dette kan bringe med seg ein del uventa utfordringar, s\u00e5 det er viktig \u00e5 velje operat\u00f8rar med omhu.<\/p>\n<p>Etter \u00e5 ha vurdert dei tre mest popul\u00e6re Kubernetes-operat\u00f8rane for PostgreSQL, valde vi prosjektet fr\u00e5 Zalando. Og vi m\u00e5tte overvinne visse vanskar, men resultatet var verkeleg tilfredsstillande, s\u00e5 vi planlegg \u00e5 utvide denne erfaringa til fleire andre PgSQL-installasjonar. Hvis du har erfaring med tilsvarande l\u00f8ysingar, vil vi gjerne sj\u00e5 detaljar i kommentarane!<\/p>\n<h2>P.S.<\/h2>\n<p>\nAlso read in our blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">Databaser og Kubernetes (oversikt og video av foredraget)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/479438\/\">Postgres-tirsdag nr. 5: PostgreSQL og Kubernetes. CI\/CD. Automatisering av testing<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/480722\/\">En historie med Redis-operatoren i K8s og en mini-anmeldelse av verkt\u00f8y for dataanalyse av denne databasen<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Kilde: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/520616\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0451 \u0447\u0430\u0449\u0435 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0442\u0430\u043a\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b: \u00ab\u0425\u043e\u0442\u0438\u043c \u043a\u0430\u043a Amazon RDS, \u043d\u043e \u0434\u0435\u0448\u0435\u0432\u043b\u0435\u00bb; \u00ab\u0425\u043e\u0442\u0438\u043c \u043a\u0430\u043a RDS, \u043d\u043e \u0432\u0435\u0437\u0434\u0435, \u0432 \u043b\u044e\u0431\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435\u00bb. \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 managed-\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 Kubernetes, \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f PostgreSQL (Stolon, \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043e\u0442 Crunchy Data \u0438 Zalando) \u0438 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0441\u0432\u043e\u0439 \u0432\u044b\u0431\u043e\u0440. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u2014 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u043e\u043f\u044b\u0442 \u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":95323,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-95322","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.5 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0451 \u0447\u0430\u0449\u0435 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0440\u0430\u0442\u043a\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 PostgreSQL \u0434\u043b\u044f Kubernetes, \u043d\u0430\u0448 \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u043f\u044b\u0442 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0451 \u0447\u0430\u0449\u0435 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-09-28T05:42:39+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-09-28T05:42:39+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Kort oversikt over PostgreSQL-operat\u00f8rar for Kubernetes, v\u00e5rt val og erfaring | ProHoster","description":"Fleire og fleire fr\u00e5 kundane.","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0440\u0430\u0442\u043a\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 PostgreSQL \u0434\u043b\u044f Kubernetes, \u043d\u0430\u0448 \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u043f\u044b\u0442 | ProHoster","og:description":"\u0412\u0441\u0451 \u0447\u0430\u0449\u0435 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432.","og:url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-09-28T05:42:39+00:00","article:modified_time":"2020-09-28T05:42:39+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"95322","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 11:08:22","updated":"2022-09-30 21:12:08","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/95322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=95322"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/95322\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media\/95323"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=95322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=95322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=95322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}