{"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\/sl\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","title":{"rendered":"Kratka predstavitev skrbnikov PostgreSQL za Kubernetes, na\u0161 izbor in izku\u0161nje","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kratka predstavitev skrbnikov PostgreSQL za Kubernetes, na\u0161 izbor in izku\u0161nje\" src=\"\/wp-content\/uploads\/2020\/09\/23b2db49941fa5bd5000358c8ffb991b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS coraz bolj se odjemalci pojavijo tak\u0161ni zahtevki: \u201e\u017delimo kot Amazon RDS, vendar ceneje\u201c; \u201e\u017delimo kot RDS, vendar povsod, v kateri koli infrastrukturi\u201c. Da bi uresni\u010dili tovrstno upravljano re\u0161itev na Kubernetes, smo pregledali trenutno stanje najbolj priljubljenih operaterjev za PostgreSQL (Stolon, operaterji podjetij Crunchy Data in Zalando) in naredili svoj izbor.<\/p>\n<p>Ta \u010dlanek je na\u0161 pridobljen izku\u0161nji z teoreti\u010dnega vidika (pregled re\u0161itev) in s prakti\u010dne strani (kaj je bilo izbrano in kak\u0161ni so bili rezultati). Toda najprej dolo\u010dimo, katere zahteve se na\u010deloma postavljajo za potencialno zamenjavo RDS\u2026<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Kaj je RDS<\/h2>\n<p>\nKo ljudje govorijo o RDS, po na\u0161em mnenju mislijo na upravljano storitev DBMS, ki:<\/p>\n<ol>\n<li>se enostavno nastavi;<\/li>\n<li>ima mo\u017enost dela s posnetki in se iz njih obnovi (najbolje \u2014 s podporo <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Point-in-time_recovery\">PITR<\/a><\/noindex>);<\/li>\n<li>omogo\u010da ustvarjanje topologij master-slave;<\/li>\n<li>ima obse\u017een seznam raz\u0161iritev;<\/li>\n<li>nudi revizijo in upravljanje uporabnikov\/dostopov.<\/li>\n<\/ol>\n<p>\n\u010ce govorimo splo\u0161no, so lahko pristopi k re\u0161evanju naloge precej razli\u010dni, vendar nam pot z Ansible ni blizu. (Do podobnega zaklju\u010dka so pri\u0161li tudi kolegi iz 2GIS v svojem poskusu <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/509926\/\">ustvariti \u201eorodje za hitro postavitev odpornosti na napake klasterja na osnovi Postgresa\u201c.)<\/a><\/noindex> Operaterji so namre\u010d splo\u0161no sprejet pristop za re\u0161evanje tovrstnih nalog v ekosistemu Kubernetes. O njih v zvezi z bazami podatkov, ki se izvajajo znotraj Kubernetes, je direktor \u201eFlante\u201c \u017ee predaval<\/p>\n<p>v enem od svojih predavanj <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/distol\/\" class=\"user_link\">distol<\/a><\/noindex>, v <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">: Za hitro ustvarjanje preprostih operaterjev priporo\u010damo, da se osredoto\u010dite na na\u0161o Open Source orodje<\/a><\/noindex>.<\/p>\n<p><i><strong>NB<\/strong><\/i><i>. Z njegovo pomo\u010djo lahko to dose\u017eete brez znanja Go, na bolj obi\u010dajne na\u010dine za sistemske administratorje: v Bashu, Pythonu itd. <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/shell-operator\"><i>shell-operatorja<\/i><\/a><\/noindex><i>Za PostgreSQL obstaja ve\u010d priljubljenih K8s operaterjev:<\/i><\/p>\n<p>Stolon;<\/p>\n<ul>\n<li>Crunchy Data PostgreSQL Operator;<\/li>\n<li>Zalando Postgres Operator.<\/li>\n<li>Poglejmo jih podrobneje.<\/li>\n<\/ul>\n<p>\nIzbor operaterja<\/p>\n<h2>Poleg pomembnih mo\u017enosti, ki so bile \u017ee omenjene, smo mi \u2014 kot in\u017eenirji za upravljanje infrastrukture v Kubernetes \u2014 prav tako pri\u010dakovali od operaterjev naslednje:<\/h2>\n<p>\ndeploj iz Git in s<\/p>\n<ul>\n<li> Custom Resources <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/extend-kubernetes\/operator\/#deploying-operators\">podpora pod anti-affinity;<\/a><\/noindex>;<\/li>\n<li> namestitev node affinity ali node selector;<\/li>\n<li> namestitev tolerations;<\/li>\n<li> mo\u017enosti tuning;<\/li>\n<li> jasne tehnologije in celo ukazi.<\/li>\n<li> jasne tehnologije i \u010dak timovi.<\/li>\n<\/ul>\n<p>\nNe dajuci se u detalje o svakom od stavki (pitajte u komentarima ako imate pitanja nakon \u010ditanja celog \u010dlanka), istakao bih da su ovi parametri potrebni za preciznije opisivanje specijalizacije \u010dvorova klastera kako bismo ih naru\u010dili za konkretne aplikacije. Tako mo\u017eemo posti\u0107i optimalnu ravnote\u017eu izme\u0111u performansi i tro\u0161kova.<\/p>\n<p>Sada, prelazimo na same operatore PostgreSQL.<\/p>\n<h3>1. Stolon<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\">Stolon<\/a><\/noindex> iz italijanske kompanije Sorint.lab u <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">ve\u0107 pomenutom izve\u0161taju<\/a><\/noindex> razmatran je kao svojevrsni standard me\u0111u operatorima za DBMS. To je prili\u010dno star projekt: prva javna verzija objavljena je jo\u0161 u novembru 2015. godine (sic!), a GitHub repozitorij mo\u017ee se pohvaliti sa skoro 3000 zvezdica i 40+ doprinositelja.<\/p>\n<p>I zaista, Stolon je odli\u010dan primer promi\u0161ljene arhitekture:<\/p>\n<p><img decoding=\"async\" alt=\"Kratka predstavitev skrbnikov PostgreSQL za Kubernetes, na\u0161 izbor in izku\u0161nje\" src=\"\/wp-content\/uploads\/2020\/09\/a34625c130bfd29c5645cf2417042de2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nO radu ovog operatora se mo\u017eete detaljno upoznati u izve\u0161taju ili <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\/blob\/master\/doc\/architecture.md\">dokumentaciji projekta<\/a><\/noindex>. U celini, dovoljno je re\u0107i da mo\u017ee sve navedeno: failover, proxy za transparentan pristup klijentima, backup... Pri \u010demu proxy pru\u017ea pristup preko jednog servisa endpoint \u2014 za razliku od druga dva re\u0161enja koja \u0107e biti diskutovana (za njih postoji po dva servisa za pristup bazi).<\/p>\n<p>Me\u0111utim, Stolon <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\/issues\/463#issuecomment-379666733\">nema Custom Resources<\/a><\/noindex>, zbog \u010dega ga nije mogu\u0107e postaviti tako da jednostavno i brzo \u2014 \u201ekao sve\u017ee peciva\u201c \u2014 kreira instance DBMS u Kubernetesu. Upravljanje se vr\u0161i putem alata <code>stolonctl<\/code>, postavljanje preko Helm \u0161ema, a korisni\u010dki se defini\u0161u u ConfigMap.<\/p>\n<p>S jedne strane, ispostavlja se da operator nije ba\u0161 operator (jer ne koristi CRD). Ali s druge strane \u2014 to je fleksibilan sistem koji omogu\u0107ava prilago\u0111avanje resursa u K8s kako vam odgovara.<\/p>\n<p>U zaklju\u010dku, za nas se nije pokazao optimalnim put da pravimo poseban chart za svaku bazu podataka. Zato smo po\u010deli da tra\u017eimo alternative.<\/p>\n<h3>2. Crunchy Data PostgreSQL Operator<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/postgres-operator\">Operator od Crunchy Data<\/a><\/noindex>, mladog ameri\u010dkog startapa, izgledao je kao logi\u010dna alternativa. Njegova javna istorija po\u010dinje s prvim izdanjem u martu 2017. godine, od tada GitHub repozitorij je dobio ne\u0161to manje od 1300 zvezdica i 50+ doprinositelja. Poslednje izdanje iz septembra je testirano za rad sa Kubernetes 1.15\u20141.18, OpenShift 3.11+ i 4.4+, GKE i VMware Enterprise PKS 1.3+.<\/p>\n<p>Arhitektura Crunchy Data PostgreSQL Operator tako\u0111e odgovara navedenim zahtevima:<\/p>\n<p><img decoding=\"async\" alt=\"Kratka predstavitev skrbnikov PostgreSQL za Kubernetes, na\u0161 izbor in izku\u0161nje\" src=\"\/wp-content\/uploads\/2020\/09\/343cd0494abae42fcf5b47c5bb4eb310.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUpravljanje se odvija putem alata <code>pgo<\/code>, no on, s druge strane, generira prilago\u0111ene resurse za Kubernetes. Stoga nas je kao potencijalne korisnike operator obradovao:<\/p>\n<ul>\n<li> postoje upravljanje putem CRD-a;<\/li>\n<li> prikladno upravljanje korisnicima (tako\u0111er putem CRD-a);<\/li>\n<li> integracija s drugim komponentama <noindex><a rel=\"nofollow\" href=\"https:\/\/access.crunchydata.com\/documentation\/crunchy-postgres-containers\/4.3.1\/\">Crunchy Data Container Suite<\/a><\/noindex> \u2014 specijalizirana kolekcija kontejnerskih slika za PostgreSQL i alate za rad s njom (uklju\u010duju\u0107i pgBackRest, pgAudit, pro\u0161irenja iz contrib itd.).<\/li>\n<\/ul>\n<p>\nMe\u0111utim, poku\u0161aji zapo\u010dinjanja kori\u0161tenja Crunchy Data operatora otkrili su nekoliko problema:<\/p>\n<ul>\n<li>Nije bila mogu\u0107a toleracija \u2014 predvi\u0111en je samo nodeSelector.<\/li>\n<li>Stvoreni podovi bili su dio Deployment-a, unato\u010d tome \u0161to smo implementirali stateful aplikaciju. Za razliku od StatefulSet-a, Deployment-i ne mogu stvoriti diske.<\/li>\n<\/ul>\n<p>\nZadnji nedostatak dovodi do zabavnih trenutaka: na testnom okru\u017eenju uspjelo se pokrenuti 3 replike s jednim diskom <i>local storage<\/i>, zbog \u010dega je operator izvijestio da 3 replike rade (iako to nije bilo slu\u010daj).<\/p>\n<p>Jo\u0161 jedna karakteristika ovog operatora je njegova gotova integracija s raznim pomo\u0107nim sustavima. Na primjer, lako je instalirati pgAdmin i pgBounce, a u <noindex><a rel=\"nofollow\" href=\"https:\/\/access.crunchydata.com\/documentation\/postgres-operator\/4.4.0\/installation\/other\/ansible\/installing-metrics\/\">dokumenti<\/a><\/noindex> razmatranju su unaprijed konfigurirani Grafana i Prometheus. U nedavnom <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/postgres-operator\/releases\/tag\/v4.5.0-beta.1\">izdanju 4.5.0-beta1<\/a><\/noindex> posebno se isti\u010de pobolj\u0161ana integracija s projektom <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/pgmonitor\">pgMonitor<\/a><\/noindex>, zahvaljuju\u0107i \u010demu operator nudi jasnu vizualizaciju metrika za PgSQL \"iz kutije\".<\/p>\n<p>Ipak, \u010dudan izbor generiranih Kubernetes resursa doveo je do potrebe da prona\u0111emo drugo rje\u0161enje.<\/p>\n<h3>3. Zalando Postgres Operator<\/h3>\n<p>\nProizvodi Zalando su nam poznati ve\u0107 dugo: imamo iskustva s kori\u0161tenjem Zaleniuma i, naravno, poku\u0161ali smo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/patroni\">Patroni<\/a><\/noindex> \u2014 njihovo popularno HA rje\u0161enje za PostgreSQL. O pristupu tvrtke u stvaranju <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\">Postgres Operator<\/a><\/noindex> govorio je jedan od njegovih autora \u2014 Aleksej Kljukin \u2014 u eteru <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/479438\/\">Postgres-utorka br. 5<\/a><\/noindex>, i dopao nam se.<\/p>\n<p>Ovo je najmla\u0111e rje\u0161enje od razmatranih u \u010dlanku: prvo izdanje odr\u017eano je u kolovozu 2018. godine. Me\u0111utim, \u010dak i unato\u010d malom broju formalnih izdanja, projekt je pro\u0161ao veliki put, ve\u0107 prema\u0161iv\u0161i popularnost rje\u0161enja od Crunchy Data s vi\u0161e od 1300 zvjezdica na GitHubu i maksimalnim brojem suradnika (preko 70).<\/p>\n<p>\"Ispod haube\" ovog operatora koriste se rje\u0161enja koja su se pokazala dugotrajnima:<\/p>\n<ul>\n<li> Patroni i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/spilo\">Spilo<\/a><\/noindex> za upravljanje,<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wal-e\/wal-e\">WAL-E<\/a><\/noindex> \u2014 za backupove,<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgbouncer\/pgbouncer\">PgBouncer<\/a><\/noindex> \u2014 kao pool veza.<\/li>\n<\/ul>\n<p>\nEvo kako je predstavljena arhitektura operatora iz Zalanda:<\/p>\n<p><img decoding=\"async\" alt=\"Kratka predstavitev skrbnikov PostgreSQL za Kubernetes, na\u0161 izbor in izku\u0161nje\" src=\"\/wp-content\/uploads\/2020\/09\/c66f10c1a818592ecaacd2db4ce5ace5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOperator se potpuno upravlja putem Custom Resources, automatski stvara StatefulSet iz kontejnera, koji se zatim mogu prilagoditi dodavanjem razli\u010ditih sidecar-a u pod. Sve ovo je zna\u010dajna prednost u odnosu na operatora od Crunchy Data.<\/p>\n<p>Ker smo se odlo\u010dili za re\u0161itev podjetja Zalando med tremi obravnavanimi mo\u017enostmi, bomo spodaj predstavili njene zmo\u017enosti skupaj s prakti\u010dno uporabo.<\/p>\n<h2>Praksa z Postgres Operatorjem od Zalanda<\/h2>\n<p>\nNamestitev operaterja je zelo preprosta: dovolj je, da prenesete aktualno razli\u010dico s GitHub-a in uporabite YAML datoteke iz imenika <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/tree\/master\/manifests\">manifests<\/a><\/noindex>. Kot mo\u017enost lahko tudi uporabite <noindex><a rel=\"nofollow\" href=\"https:\/\/operatorhub.io\/operator\/postgres-operator\">OperatorHub<\/a><\/noindex>.<\/p>\n<p>Po namestitvi je potrebno poskrbeti za nastavitev <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/reference\/operator_parameters.md#aws-or-gcp-interaction\">shranjevanja za dnevnike in varnostne kopije<\/a><\/noindex>. Ta se izvede prek ConfigMap <code>postgres-operator<\/code> v imenskem prostoru, kjer ste namestili operaterja. Ko je shranjevanje nastavljeno, lahko razporedite prvi cluster PostgreSQL.<\/p>\n<p>Na primer, standardna namestitev izgleda takole:<\/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>\nTa manifest razporedi cluster s 3 primeri in sidecar-om v obliki <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wrouesnel\/postgres_exporter\">postgres_exporter<\/a><\/noindex>, s katerim zbiramo metrike aplikacije. Kot vidite, je vse zelo preprosto in po \u017eelji lahko ustvarite dobesedno neomejeno \u0161tevilo clusterjev.<\/p>\n<p>Pozorno je treba gledati tudi na <b>spletno plo\u0161\u010do za upravljanje<\/b> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/operator-ui.md\">postgres-operator-ui<\/a><\/noindex>. Ta pride skupaj z operaterjem in omogo\u010da ustvarjanje in brisanje clusterjev ter delo z varnostnimi kopijami, ki jih izvaja operater.<\/p>\n<p><img decoding=\"async\" alt=\"Kratka predstavitev skrbnikov PostgreSQL za Kubernetes, na\u0161 izbor in izku\u0161nje\" src=\"\/wp-content\/uploads\/2020\/09\/2e9ae033a9817d101c843ce061aafdb5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Seznam clusterjev PostgreSQL<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Kratka predstavitev skrbnikov PostgreSQL za Kubernetes, na\u0161 izbor in izku\u0161nje\" src=\"\/wp-content\/uploads\/2020\/09\/74a65f7f301da14a0cb7bea6d5ef84ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Upravljanje varnostnih kopij<\/i><\/p>\n<p>Druga zanimiva zna\u010dilnost je podpora <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/user.md#teams-api-roles\">Teams API<\/a><\/noindex>. Ta mehanizem samodejno ustvari <b>vloge v PostgreSQL<\/b>, glede na prejet seznam imen uporabnikov. Po tem API omogo\u010da vrnitev seznama uporabnikov, za katere se samodejno ustvarjajo vloge.<\/p>\n<h3>Te\u017eave in njihovo re\u0161evanje<\/h3>\n<p>\nVendar pa je uporaba operaterja kmalu razkrila nekaj pomembnih pomanjkljivosti:<\/p>\n<ol>\n<li> pomanjkanje podpore za nodeSelector;<\/li>\n<li> nemogo\u010dnost izklju\u010diti varnostne kopije;<\/li>\n<li> pri uporabi funkcije ustvarjanja baz se ne pojavijo privzete pravice;<\/li>\n<li> ob\u010dasno primanjkuje dokumentacije ali pa je ta zastarela.<\/li>\n<\/ol>\n<p>\nNa sre\u010do je veliko od teh te\u017eav mogo\u010de odpraviti. Za\u010dnimo z zadnjim \u2014 te\u017eave s <strong>dokumentacijo<\/strong>. <\/p>\n<p>Verjetno se boste sre\u010dali s tem, da ni vedno jasno, kako zapisati varnostno kopijo in kako povezati varnostno kopijo s Operator UI. O tem se v dokumentaciji omenjajo na kratko, realen opis pa je v <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/481\">PR<\/a><\/noindex>:<\/p>\n<ol>\n<li>potrebno je ustvariti skrivnost;<\/li>\n<li>predati jo operatorju v parametru <code>pod_environment_secret_name<\/code> v CRD z nastavitvami operatorja ali v ConfigMap (odvisno od tega, kako ste se odlo\u010dili namestiti operator).<\/li>\n<\/ol>\n<p>\nVendar, kot se je izkazalo, trenutno to ni mogo\u010de. Zato smo zbrali <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/postgres-operator\">svojo razli\u010dico operatorja<\/a><\/noindex> z nekaterimi dodatnimi zunanjimi razvoji. Ve\u010d informacij o njem \u2014 glejte spodaj.<\/p>\n<p>\u010ce operatorju predamo parametre za varnostno kopijo, natan\u010dneje \u2014 <code>wal_s3_bucket<\/code> in klju\u010de za dostop do AWS S3, bo <strong>varnostno kopiral vse<\/strong>: ne samo baze v production, ampak tudi staging. To nas ni zadovoljilo.<\/p>\n<p>V opisu parametrov za Spilo, ki je osnovna Docker-ovitek za PgSQL pri uporabi operatorja, se je izkazalo: parameter <code>WAL_S3_BUCKET<\/code> lahko pustimo prazen, s tem pa izklju\u010dimo varnostne kopije. Poleg tega je bilo na\u0161emu velikemu veselju najdeno tudi <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/908\">kon\u010dano PR<\/a><\/noindex>, ki smo ga takoj sprejeli v svoj fork. Zdaj je dovolj, da preprosto dodamo <code>enableWALArchiving: false<\/code> v vir klasterja PostgreSQL.<\/p>\n<p>Da, obstajala je mo\u017enost, da to naredimo druga\u010de, z zagonom dveh operatorjev: enega za staging (brez varnostnih kopij), in drugega \u2014 za production. A tako smo lahko obvladali z enim.<\/p>\n<p>V redu, nau\u010dili smo se predati dostop do S3 bazam in varnostne kopije so za\u010dele priti v shrambo. Kako spraviti strani varnostnih kopij v Operator UI, da delujejo?<\/p>\n<p><img decoding=\"async\" alt=\"Kratka predstavitev skrbnikov PostgreSQL za Kubernetes, na\u0161 izbor in izku\u0161nje\" src=\"\/wp-content\/uploads\/2020\/09\/46169b53707b0bbb686798c655022f40.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV Operator UI bo potrebno dodati 3 spremenljivke:<\/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>\nPo tem bo upravljanje z varnostnimi kopijami postalo dostopno, kar bo v na\u0161em primeru poenostavilo delo s stagingom, saj bo omogo\u010dilo dostavo rezin z productiona brez dodatnih skript.<\/p>\n<p>Kot \u0161e en plus so omenjeni delo z Teams API in \u0161iroke mo\u017enosti za ustvarjanje baz in vlog s pomo\u010djo operatorja. Vendar ustvarjene <strong>vloge niso imele privzetih pravic<\/strong>. Zato uporabnik s pravicami za branje ni mogel brati novih tabel.<\/p>\n<p>Zakaj tako? Kljub temu, da je v kodi <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/pkg\/cluster\/database.go#L42\">je<\/a><\/noindex> potrebno <code>GRANT<\/code>, se ne uporabljajo vedno. Obstajata 2 metode: <code>syncPreparedDatabases<\/code> in <code>syncDatabases<\/code>. U <code>syncPreparedDatabases<\/code> \u2014 kljub temu, da v razdelku <code>preparedDatabases<\/code> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/manifests\/complete-postgres-manifest.yaml#L26\">je<\/a><\/noindex> je pogoj <code>defaultRoles<\/code> in <code>defaultUsers<\/code> za ustvarjanje vlog, \u2014 privzete pravice se ne uporabljajo. Trenutno pripravljamo popravke, da bodo te pravice samodejno uporabljene.<\/p>\n<p>In zadnja to\u010dka v na\u0161ih aktualnih izbolj\u0161avah \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/975\">zakrpu<\/a><\/noindex>, ki dodaja Node Affinity v ustvarjeni StatefulSet. Na\u0161i naro\u010dniki pogosto raje zmanj\u0161ajo stro\u0161ke z uporabo spot-instances, kar pomeni, da jih ni smiselno uporabljati za baze podatkov. To te\u017eavo bi bilo mogo\u010de re\u0161iti tudi z toleracijami, vendar prisotnost Node Affinity zagotavlja ve\u010djo varnost.<\/p>\n<h3>Kaj smo dosegli?<\/h3>\n<p>\nKot rezultat re\u0161itve na\u0161tetih te\u017eav smo forkali Postgres Operator od Zalanda v <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/postgres-operator\">svojo shrambo<\/a><\/noindex>, kjer se zbira s tako uporabnimi popravki. Za \u0161e ve\u010dje udobje smo zbrali tudi <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/flant\/postgres-operator\">Docker-sliko<\/a><\/noindex>.<\/p>\n<p>Seznam PR, sprejetih v fork:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/1066\">gradnjo varne, lahke Docker slike za operaterja<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/908\">izklop varnostnih kopij<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/1121\">posodobitev razli\u010dic virov za aktualne razli\u010dice k8s<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/975\">vpeljava Node Affinity<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\nBilo bi super, \u010de bi skupnost podprla te PR, da bi pri\u0161li v upstream z naslednjo razli\u010dico operaterja (1.6).<\/p>\n<h2>Bonus! Zgodba o uspehu pri migraciji produkcije<\/h2>\n<p>\n\u010ce uporabljate Patroni, lahko na operater migrirate \u017eivo produkcijo z minimalnim izpadom.<\/p>\n<p>Spilo omogo\u010da ustvarjanje standby-klasterjev preko S3 skladi\u0161\u010d z <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wal-e\/wal-e\">Wal-E<\/a><\/noindex>, ko se binarni log PgSQL najprej shrani v S3, nato pa ga prenese replika. Kaj pa, \u010de imate <i>ne<\/i> uporabo Wal-E v stari infrastrukturi? Re\u0161itev tega problema je \u017ee <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/true_engineering\/blog\/437318\/\">bila predlagana<\/a><\/noindex> na Habr\u00e9.<\/p>\n<p>Na pomo\u010d prihaja logi\u010dna replikacija PostgreSQL. Vendar se ne bomo poglobili v podrobnosti, kako ustvariti publikacije in naro\u010dnine, ker\u2026 na\u0161 na\u010drt je propadel.<\/p>\n<p>Gre za to, da je bilo v DB ve\u010d obremenjenih tabel z milijoni vrstic, ki so se nenehno dodajale in odstranjevale. <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgrespro\/12\/sql-createsubscription\">Preprosta naro\u010dnina<\/a><\/noindex> z <code>copy_data<\/code>, pri kateri nova replika kopira celotno vsebino z glavne baze, ni uspela temu slediti. Kopiranje vsebine je trajalo teden dni, vendar je le-to ni ujelo glavne baze. Na koncu je re\u0161itev pri\u0161la od <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/avitotech\/recovery-use-cases-for-logical-replication-in-postgresql-10-a1e6bab03072\">\u010dlanek<\/a><\/noindex> kolegov iz Avita: podatke je mogo\u010de prenesti z uporabo <code>pg_dump<\/code>. Opisal bom na\u0161 (malce dopolnjen) variant tega algoritma.<\/p>\n<p>Ideja je, da lahko ustvarimo izklopljeno naro\u010dnino, povezano s specifi\u010dnim repliko, in nato popravimo \u0161tevilko transakcije. Na voljo so bile replike za delovanje produkcije. To je pomembno, ker bo replikacija pomagala ustvariti dosleden izpis in nadaljevati z obravnavo sprememb iz glavnega stre\u017enika.<\/p>\n<p>V nadaljnjih ukazih, ki opisujejo postopek migracije, bodo uporabljene naslednje oznake za gostitelje:<\/p>\n<ol>\n<li><i>master<\/i> \u2014 izvorni stre\u017enik;<\/li>\n<li><i>replica1<\/i> \u2014 tokovna replikacija na starem produkcijskem stre\u017eniku;<\/li>\n<li><i>replica2<\/i> \u2014 nova logi\u010dna replikacija.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Migra\u010dni na\u010drt<\/h3>\n<p>\n1. Na glavnem stre\u017eniku bomo ustvarili naro\u010dnino za vse tabele v shemi <code>public<\/code> baze <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. Ustvarimo repliko na glavnem stre\u017eniku:<\/p>\n<pre><code class=\"bash\">psql -h master -c \"select pg_create_logical_replication_slot('repl', 'pgoutput');\"\n<\/code><\/pre>\n<p>\n3. Ustavimo replikacijo na stari repliki:<\/p>\n<pre><code class=\"bash\">psql -h replica1 -c \"select pg_wal_replay_pause();\"\n<\/code><\/pre>\n<p>\n4. Pridobimo \u0161tevilko transakcije z glavnega stre\u017enika:<\/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. Izvedemo izpis iz stare replikacije. To bomo naredili v ve\u010d tokovih, kar bo pospe\u0161ilo postopek:<\/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. Nalo\u017eimo izpis na nov stre\u017enik:<\/p>\n<pre><code class=\"bash\">pg_restore -h replica2 -F d -j 8 -d dbname dump\/\n<\/code><\/pre>\n<p>\n7. Po nalaganju izpisa lahko za\u017eenemo replikacijo na tokovni repliki:<\/p>\n<pre><code class=\"bash\">psql -h replica1 -c \"select pg_wal_replay_resume();\"\n<\/code><\/pre>\n<p>\n7. Ustvarimo naro\u010dnino na novi logi\u010dni repliki:<\/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. Pridobimo <code>oid<\/code> naro\u010dnine:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c \"select oid, * from pg_subscription;\"\n<\/code><\/pre>\n<p>\n9. Predpostavimo, da smo pridobili <code>oid=1000<\/code>. Uporabimo \u0161tevilko transakcije za naro\u010dnino:<\/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. Za\u010dnemo replikacijo:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c \"alter subscription oldprod enable;\"\n<\/code><\/pre>\n<p>\n11. Preverimo status naro\u010dnine, replikacija bi morala delovati:<\/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. Po zagonu replikacije in sinhronizaciji baz se lahko izvr\u0161i preklop.<\/p>\n<p>13. Po izklopu replikacije moramo popraviti sekvence. To je dobro opisano <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Fixing_Sequences\">v \u010dlanku na wiki.postgresql.org<\/a><\/noindex>.<\/p>\n<p>Zaradi tak\u0161nega na\u010drta je preklop potekal z minimalnimi zakasnitvami.<\/p>\n<h2>Zaklju\u010dek<\/h2>\n<p>\nKubernetes operaterji omogo\u010dajo poenostavljanje razli\u010dnih dejanj tako, da jih zni\u017eajo na ustvarjanje K8s virov. Vendar, ko dose\u017eete izjemno avtomatizacijo z njihovo pomo\u010djo, ne pozabite, da lahko prinese tudi vrsto nepri\u010dakovanih zapletov, zato previdno izbirajte operaterje.<\/p>\n<p>Po pregledu treh najbolj priljubljenih Kubernetes operaterjev za PostgreSQL smo se odlo\u010dili za projekt podjetja Zalando. Kljub nekaterim izzivom, s katerimi smo se soo\u010dili, smo bili resni\u010dno navdu\u0161eni nad rezultati, zato na\u010drtujemo \u0161iritev tega znanja na nekatere druge namestitve PgSQL. \u010ce imate izku\u0161nje z uporabo podobnih re\u0161itev, bomo veseli va\u0161ih podrobnosti v komentarjih!<\/p>\n<h2>P.S.<\/h2>\n<p>\nPreberite tudi na na\u0161em blogu:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">Baze podatkov in Kubernetes (pregled in video predavanja)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/479438\/\">Postgres torek \u0161t. 5: PostgreSQL in Kubernetes. CI\/CD. Avtomatizacija testiranja<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/480722\/\">Ena zgodba z operaterjem Redis v K8s in kratek pregled orodij za analizo podatkov te zbirke podatkov<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Izvor: <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.4 - 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\/sl\/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.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sl_SI\" \/>\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\/sl\/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\udd47Kratek pregled operaterjev PostgreSQL za Kubernetes, na\u0161a izbira in izku\u0161nje | ProHoster","description":"Vedno pogosteje od strank.","canonical_url":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sl_SI","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\/sl\/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\/sl\/wp-json\/wp\/v2\/posts\/95322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/comments?post=95322"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/95322\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media\/95323"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media?parent=95322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/categories?post=95322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/tags?post=95322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}