{"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\/cs\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","title":{"rendered":"Stru\u010dn\u00fd p\u0159ehled oper\u00e1tor\u016f PostgreSQL pro Kubernetes, na\u0161e volba a zku\u0161enosti","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Stru\u010dn\u00fd p\u0159ehled oper\u00e1tor\u016f PostgreSQL pro Kubernetes, na\u0161e volba a zku\u0161enosti\" src=\"\/wp-content\/uploads\/2020\/09\/23b2db49941fa5bd5000358c8ffb991b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSt\u00e1le \u010dast\u011bji dost\u00e1v\u00e1me od klient\u016f takov\u00e9 dotazy: \u201eChceme n\u011bco jako Amazon RDS, ale levn\u011bj\u0161\u00ed\u201c; \u201eChceme n\u011bco jako RDS, ale v\u0161ude, v jak\u00e9koli infrastruktu\u0159e.\u201c Abychom realizovali takov\u00e9 spravovan\u00e9 \u0159e\u0161en\u00ed na Kubernetes, pod\u00edvali jsme se na aktu\u00e1ln\u00ed stav nejpopul\u00e1rn\u011bj\u0161\u00edch oper\u00e1tor\u016f pro PostgreSQL (Stolon, oper\u00e1to\u0159i od Crunchy Data a Zalando) a u\u010dinili jsme sv\u016fj v\u00fdb\u011br.<\/p>\n<p>Tento \u010dl\u00e1nek je zalo\u017een na na\u0161ich zku\u0161enostech a to jak z teoretick\u00e9ho hlediska (p\u0159ehled \u0159e\u0161en\u00ed), tak z praktick\u00e9ho pohledu (co bylo zvoleno a co z toho vze\u0161lo). Ale nejd\u0159\u00edve si poj\u010fme vyjasnit, jak\u00e9 po\u017eadavky jsou kladeny na potenci\u00e1ln\u00ed n\u00e1hradu RDS...<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Co vlastn\u011b RDS je<\/h2>\n<p>\nKdy\u017e lid\u00e9 mluv\u00ed o RDS, podle na\u0161ich zku\u0161enost\u00ed maj\u00ed na mysli spravovanou slu\u017ebu DBMS, kter\u00e1:<\/p>\n<ol>\n<li>snadno se nastavuje;<\/li>\n<li>m\u00e1 mo\u017enost pracovat se snapshoty a obnovovat je z nich (preferovan\u011b s podporou <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Point-in-time_recovery\">PITR<\/a><\/noindex>);<\/li>\n<li>umo\u017e\u0148uje vytv\u00e1\u0159et topologie master-slave;<\/li>\n<li>m\u00e1 bohat\u00fd seznam roz\u0161\u00ed\u0159en\u00ed;<\/li>\n<li>poskytuje audit a spr\u00e1vu u\u017eivatel\u016f\/p\u0159\u00edstup\u016f.<\/li>\n<\/ol>\n<p>\nObecn\u011b \u0159e\u010deno, p\u0159\u00edstupy k realizaci stanoven\u00e9ho \u00fakolu mohou b\u00fdt velmi r\u016fzn\u00e9, nicm\u00e9n\u011b cesta s podm\u00ednkov\u00fdm Ansible n\u00e1m nen\u00ed bl\u00edzk\u00e1. (K podobn\u00e9mu z\u00e1v\u011bru dosp\u011bli i kolegov\u00e9 z 2GIS v d\u016fsledku <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/509926\/\">sv\u00e9ho pokusu<\/a><\/noindex> vytvo\u0159it \u201en\u00e1stroj pro rychl\u00e9 nasazen\u00ed vysoce dostupn\u00e9ho clustera na z\u00e1klad\u011b Postgres\u201c.)<\/p>\n<p>Pr\u00e1v\u011b oper\u00e1to\u0159i jsou b\u011b\u017en\u011b pou\u017e\u00edvan\u00fd p\u0159\u00edstup pro \u0159e\u0161en\u00ed podobn\u00fdch \u00fakol\u016f v ekosyst\u00e9mu Kubernetes. Podrobn\u011bji o nich v souvislosti s datab\u00e1zemi spu\u0161t\u011bn\u00fdmi uvnit\u0159 Kubernetes ji\u017e hovo\u0159il technick\u00fd \u0159editel \u201eFlanta\u201c, <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\/\">v jedn\u00e9 ze sv\u00fdch prezentac\u00ed<\/a><\/noindex>.<\/p>\n<p><i><strong>NB<\/strong><\/i><i>: Pro rychl\u00e9 vytvo\u0159en\u00ed jednoduch\u00fdch oper\u00e1tor\u016f doporu\u010dujeme v\u011bnovat pozornost na\u0161\u00ed Open Source utilit\u011b <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/shell-operator\"><i>shell-operator<\/i><\/a><\/noindex><i>. Jej\u00ed vyu\u017eit\u00ed umo\u017e\u0148uje to bez znalosti Go, ale sp\u00ed\u0161e b\u011b\u017en\u00fdmi zp\u016fsoby pro administr\u00e1tory: v Bash, Pythonu atd.<\/i><\/p>\n<p>Pro PostgreSQL existuje n\u011bkolik popul\u00e1rn\u00edch K8s oper\u00e1tor\u016f:<\/p>\n<ul>\n<li>Stolon;<\/li>\n<li>Crunchy Data PostgreSQL Operator;<\/li>\n<li>Zalando Postgres Operator.<\/li>\n<\/ul>\n<p>\nPod\u00edvejme se na n\u011b podrobn\u011bji.<\/p>\n<h2>V\u00fdb\u011br oper\u00e1tora<\/h2>\n<p>\nKrom\u011b t\u011bch d\u016fle\u017eit\u00fdch funkc\u00ed, kter\u00e9 ji\u017e byly zm\u00edn\u011bny v\u00fd\u0161e, jsme \u2013 jako in\u017een\u00fd\u0159i pro provoz infrastruktury na Kubernetes \u2013 rovn\u011b\u017e o\u010dek\u00e1vali od oper\u00e1tor\u016f n\u00e1sleduj\u00edc\u00ed:<\/p>\n<ul>\n<li> nasazen\u00ed z Gitu a s <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/extend-kubernetes\/operator\/#deploying-operators\">Custom Resources<\/a><\/noindex>;<\/li>\n<li> podpora pod anti-affinity;<\/li>\n<li> n\u00e1stavba node affinity nebo node selector;<\/li>\n<li> n\u00e1stavba tolerations;<\/li>\n<li> mo\u017enosti lad\u011bn\u00ed;<\/li>\n<li> srozumiteln\u00e9 technologie a dokonce i p\u0159\u00edkazy.<\/li>\n<\/ul>\n<p>\nAni\u017e bych se podrobn\u011b zab\u00fdval ka\u017ed\u00fdm bodem (ptejte se v koment\u00e1\u0159\u00edch, pokud z\u016fstanou ot\u00e1zky po p\u0159e\u010dten\u00ed cel\u00e9ho \u010dl\u00e1nku), v\u0161imnu si celkov\u011b, \u017ee tyto parametry jsou pot\u0159ebn\u00e9 pro jemn\u011bj\u0161\u00ed popis specializace uzl\u016f clusteru, abychom je mohli objedn\u00e1vat pro konkr\u00e9tn\u00ed aplikace. T\u00edmto zp\u016fsobem m\u016f\u017eeme dos\u00e1hnout optim\u00e1ln\u00ed rovnov\u00e1hy mezi v\u00fdkonem a n\u00e1klady.<\/p>\n<p>Nyn\u00ed k samotn\u00fdm oper\u00e1tor\u016fm PostgreSQL.<\/p>\n<h3>1. Stolon<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\">Stolon<\/a><\/noindex> od italsk\u00e9 spole\u010dnosti Sorint.lab v <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">ji\u017e zm\u00edn\u011bn\u00e9 zpr\u00e1v\u011b<\/a><\/noindex> byl pova\u017eov\u00e1n za jak\u00fdsi etalon mezi oper\u00e1tory pro DB. Je to pom\u011brn\u011b star\u00fd projekt: jeho prvn\u00ed ve\u0159ejn\u00e9 vyd\u00e1n\u00ed se uskute\u010dnilo ji\u017e v listopadu 2015(!), a repozit\u00e1\u0159 na GitHubu se m\u016f\u017ee py\u0161nit t\u00e9m\u011b\u0159 3000 hv\u011bzdami a v\u00edce ne\u017e 40 p\u0159isp\u011bvateli.<\/p>\n<p>A skute\u010dn\u011b, Stolon je skv\u011bl\u00fdm p\u0159\u00edkladem promy\u0161len\u00e9 architektury:<\/p>\n<p><img decoding=\"async\" alt=\"Stru\u010dn\u00fd p\u0159ehled oper\u00e1tor\u016f PostgreSQL pro Kubernetes, na\u0161e volba a zku\u0161enosti\" src=\"\/wp-content\/uploads\/2020\/09\/a34625c130bfd29c5645cf2417042de2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nS t\u00edmto oper\u00e1torem se podrobn\u011bji m\u016f\u017eete sezn\u00e1mit ve zpr\u00e1v\u011b nebo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\/blob\/master\/doc\/architecture.md\">dokumentaci projektu<\/a><\/noindex>. Obecn\u011b lze \u0159\u00edci, \u017ee um\u00ed v\u0161e popsan\u00e9: failover, proxy pro transparentn\u00ed p\u0159\u00edstup klient\u016f, z\u00e1lohy\u2026 P\u0159i\u010dem\u017e proxy poskytuj\u00ed p\u0159\u00edstup p\u0159es jeden serverov\u00fd endpoint \u2014 na rozd\u00edl od dvou dal\u0161\u00edch \u0159e\u0161en\u00ed, kter\u00e1 budou d\u00e1le probr\u00e1na (maj\u00ed po dvou slu\u017eb\u00e1ch pro p\u0159\u00edstup k datab\u00e1zi).<\/p>\n<p>Nicm\u00e9n\u011b Stolon <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/sorintlab\/stolon\/issues\/463#issuecomment-379666733\">nem\u00e1 Custom Resources<\/a><\/noindex>, tak\u017ee jej nelze nasadit tak, aby bylo mo\u017en\u00e9 rychle a snadno \u2014 \"jako hork\u00e9 kol\u00e1\u010de\" \u2014 vytv\u00e1\u0159et instance DB v Kubernetes. Spr\u00e1va se prov\u00e1d\u00ed pomoc\u00ed n\u00e1stroje <code>stolonctl<\/code>, nasazen\u00ed \u2014 pomoc\u00ed Helm chartu, a u\u017eivatelsk\u00e9 definice se nastavuj\u00ed v ConfigMap.<\/p>\n<p>Na jedn\u00e9 stran\u011b to vypad\u00e1, \u017ee oper\u00e1tor nen\u00ed skute\u010dn\u011b oper\u00e1tor (v\u017edy\u0165 nevyu\u017e\u00edv\u00e1 CRD). Na druh\u00e9 stran\u011b je to flexibiln\u00ed syst\u00e9m, kter\u00fd umo\u017e\u0148uje p\u0159izp\u016fsoben\u00ed zdroj\u016f v K8s tak, jak v\u00e1m to vyhovuje.<\/p>\n<p>Shrnuto, osobn\u011b n\u00e1m nep\u0159i\u0161lo optim\u00e1ln\u00ed m\u00edt samostatn\u00fd chart pro ka\u017edou DB. Proto jsme za\u010dali hledat alternativy.<\/p>\n<h3>2. Crunchy Data PostgreSQL Operator<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/postgres-operator\">Oper\u00e1tor od Crunchy Data<\/a><\/noindex>, mlad\u00e9ho americk\u00e9ho startupu, vypadal jako logick\u00e1 alternativa. Jeho ve\u0159ejn\u00e1 historie za\u010d\u00edn\u00e1 prvn\u00edm vyd\u00e1n\u00edm v b\u0159eznu 2017, od t\u00e9 doby repozit\u00e1\u0159 na GitHubu z\u00edskal n\u011bco m\u00e9n\u011b ne\u017e 1300 hv\u011bzd a v\u00edce ne\u017e 50 p\u0159isp\u011bvatel\u016f. Posledn\u00ed vyd\u00e1n\u00ed z z\u00e1\u0159\u00ed bylo testov\u00e1no na spolupr\u00e1ci s Kubernetes 1.15\u20131.18, OpenShift 3.11+ a 4.4+, GKE a VMware Enterprise PKS 1.3+.<\/p>\n<p>Architektura Crunchy Data PostgreSQL Operator tak\u00e9 spl\u0148uje uveden\u00e9 po\u017eadavky:<\/p>\n<p><img decoding=\"async\" alt=\"Stru\u010dn\u00fd p\u0159ehled oper\u00e1tor\u016f PostgreSQL pro Kubernetes, na\u0161e volba a zku\u0161enosti\" src=\"\/wp-content\/uploads\/2020\/09\/343cd0494abae42fcf5b47c5bb4eb310.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSpr\u00e1va prob\u00edh\u00e1 prost\u0159ednictv\u00edm utility <code>pgo<\/code>, nicm\u00e9n\u011b ta zase generuje Custom Resources pro Kubernetes. Proto n\u00e1s jako potenci\u00e1ln\u00ed u\u017eivatele oper\u00e1tor pot\u011b\u0161il:<\/p>\n<ul>\n<li> existuje spr\u00e1va p\u0159es CRD;<\/li>\n<li> pohodln\u00e1 spr\u00e1va u\u017eivatel\u016f (tak\u00e9 p\u0159es CRD);<\/li>\n<li> integrace s dal\u0161\u00edmi komponentami <noindex><a rel=\"nofollow\" href=\"https:\/\/access.crunchydata.com\/documentation\/crunchy-postgres-containers\/4.3.1\/\">Crunchy Data Container Suite<\/a><\/noindex> \u2014 specializovan\u00e1 kolekce kontejnerov\u00fdch obraz\u016f pro PostgreSQL a utilit pro pr\u00e1ci s n\u00ed (v\u010detn\u011b pgBackRest, pgAudit, roz\u0161\u00ed\u0159en\u00ed z contrib atd.).<\/li>\n<\/ul>\n<p>\nNicm\u00e9n\u011b pokusy za\u010d\u00edt pou\u017e\u00edvat oper\u00e1tor od Crunchy Data odhalily n\u011bkolik probl\u00e9m\u016f:<\/p>\n<ul>\n<li>Nebyla mo\u017enost toleranc\u00ed \u2014 byl zaji\u0161t\u011bn pouze nodeSelector.<\/li>\n<li>Vytv\u00e1\u0159en\u00e9 pod-y byly sou\u010d\u00e1st\u00ed Deploymentu, p\u0159esto\u017ee jsme nasazovali stateful aplikaci. Na rozd\u00edl od StatefulSet\u016f, Deploymenty neum\u00ed vytv\u00e1\u0159et disky.<\/li>\n<\/ul>\n<p>\nPosledn\u00ed nedostatek vede k z\u00e1bavn\u00fdm okam\u017eik\u016fm: na testovac\u00ed prost\u0159ed\u00ed se poda\u0159ilo spustit 3 repliky s jedn\u00edm diskem <i>lok\u00e1ln\u00ed \u00falo\u017ei\u0161t\u011b<\/i>, co\u017e vedlo k tomu, \u017ee oper\u00e1tor hl\u00e1sil, \u017ee 3 repliky funguj\u00ed (a\u010dkoliv to tak nebylo).<\/p>\n<p>Dal\u0161\u00ed zvl\u00e1\u0161tnost\u00ed tohoto oper\u00e1tora je jeho hotov\u00e1 integrace s r\u016fzn\u00fdmi podp\u016frn\u00fdmi syst\u00e9my. Nap\u0159\u00edklad je snadn\u00e9 nainstalovat pgAdmin a pgBounce, a v <noindex><a rel=\"nofollow\" href=\"https:\/\/access.crunchydata.com\/documentation\/postgres-operator\/4.4.0\/installation\/other\/ansible\/installing-metrics\/\">dokumentaci<\/a><\/noindex> zva\u017euj\u00ed se p\u0159ednastaven\u00e9 Grafana a Prometheus. V ned\u00e1vn\u00e9m <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/postgres-operator\/releases\/tag\/v4.5.0-beta.1\">vyd\u00e1n\u00ed 4.5.0-beta1<\/a><\/noindex> se zvl\u00e1\u0161\u0165 zmi\u0148uje vylep\u0161en\u00e1 integrace s projektem <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CrunchyData\/pgmonitor\">pgMonitor<\/a><\/noindex>, d\u00edky n\u00ed\u017e oper\u00e1tor nab\u00edz\u00ed n\u00e1zornou vizualizaci metrik podle PgSQL \u201ez krabice\u201c.<\/p>\n<p>Nicm\u00e9n\u011b podivn\u00e1 volba generovan\u00fdch Kubernetes zdroj\u016f n\u00e1s p\u0159ivedla k nutnosti hledat jin\u00e9 \u0159e\u0161en\u00ed.<\/p>\n<h3>3. Zalando Postgres Operator<\/h3>\n<p>\nProdukty Zalando zn\u00e1me ji\u017e dlouho: m\u00e1me zku\u0161enosti s pou\u017e\u00edv\u00e1n\u00edm Zalenium a samoz\u0159ejm\u011b jsme vyzkou\u0161eli <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/patroni\">Patroni<\/a><\/noindex> \u2014 jejich popul\u00e1rn\u00ed HA \u0159e\u0161en\u00ed pro PostgreSQL. O p\u0159\u00edstupu firmy k vytvo\u0159en\u00ed <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\">Postgres Operator<\/a><\/noindex> vypr\u00e1v\u011bl jeden z jeho autor\u016f \u2014 Alexej Kljukin \u2014 ve vys\u00edl\u00e1n\u00ed <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/479438\/\">Postgres-vtorku \u010d. 5<\/a><\/noindex>, a ten se n\u00e1m zal\u00edbil.<\/p>\n<p>Je to nejmlad\u0161\u00ed \u0159e\u0161en\u00ed z t\u011bch, kter\u00e1 se zde zmi\u0148uj\u00ed: prvn\u00ed vyd\u00e1n\u00ed se konalo v srpnu 2018. Nicm\u00e9n\u011b, i p\u0159es mal\u00e9 mno\u017estv\u00ed form\u00e1ln\u00edch vyd\u00e1n\u00ed, projekt pro\u0161el dlouhou cestu, ji\u017e p\u0159ekonal na popularit\u011b \u0159e\u0161en\u00ed od Crunchy Data s v\u00edce ne\u017e 1300 hv\u011bzdami na GitHubu a maxim\u00e1ln\u00edm po\u010dtem p\u0159isp\u011bvatel\u016f (70+).<\/p>\n<p>\"Pod kapotou\" tohoto oper\u00e1tora se pou\u017e\u00edvaj\u00ed \u0159e\u0161en\u00ed, kter\u00e1 odolala zkou\u0161ce \u010dasu:<\/p>\n<ul>\n<li> Patroni a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/spilo\">Spilo<\/a><\/noindex> pro spr\u00e1vu,<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wal-e\/wal-e\">WAL-E<\/a><\/noindex> \u2014 pro z\u00e1lohy,<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgbouncer\/pgbouncer\">PgBouncer<\/a><\/noindex> \u2014 jako pool p\u0159ipojen\u00ed.<\/li>\n<\/ul>\n<p>\nTakto je reprezentov\u00e1na architektura oper\u00e1tora od Zalando:<\/p>\n<p><img decoding=\"async\" alt=\"Stru\u010dn\u00fd p\u0159ehled oper\u00e1tor\u016f PostgreSQL pro Kubernetes, na\u0161e volba a zku\u0161enosti\" src=\"\/wp-content\/uploads\/2020\/09\/c66f10c1a818592ecaacd2db4ce5ace5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOper\u00e1tor je pln\u011b spravov\u00e1n pomoc\u00ed Custom Resources, automaticky vytv\u00e1\u0159\u00ed StatefulSet z kontejner\u016f, kter\u00e9 lze n\u00e1sledn\u011b p\u0159izp\u016fsobit p\u0159id\u00e1n\u00edm r\u016fzn\u00fdch sidecar\u016f do podu. To je v\u00fdrazn\u00fd plus ve srovn\u00e1n\u00ed s oper\u00e1torem od Crunchy Data.<\/p>\n<p>Jeliko\u017e jsme se rozhodli pro \u0159e\u0161en\u00ed od Zalando mezi t\u0159emi zva\u017eovan\u00fdmi variantami, n\u00e1sleduj\u00edc\u00ed popis jeho mo\u017enost\u00ed bude uveden n\u00ed\u017ee, hned spole\u010dn\u011b s praktick\u00fdm pou\u017eit\u00edm.<\/p>\n<h2>Praktick\u00e1 \u010d\u00e1st s Postgres Oper\u00e1torem od Zalando<\/h2>\n<p>\nNasazen\u00ed oper\u00e1tora prob\u00edh\u00e1 velmi jednodu\u0161e: sta\u010d\u00ed st\u00e1hnout aktu\u00e1ln\u00ed verzi z GitHubu a aplikovat YAML soubory z adres\u00e1\u0159e <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/tree\/master\/manifests\">manifests<\/a><\/noindex>. Alternativn\u011b lze tak\u00e9 vyu\u017e\u00edt <noindex><a rel=\"nofollow\" href=\"https:\/\/operatorhub.io\/operator\/postgres-operator\">OperatorHub<\/a><\/noindex>.<\/p>\n<p>Po nainstalov\u00e1n\u00ed je dobr\u00e9 se postarat o nastaven\u00ed <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/reference\/operator_parameters.md#aws-or-gcp-interaction\">\u00falo\u017ei\u0161\u0165 pro logy a z\u00e1lohy<\/a><\/noindex>. To se prov\u00e1d\u00ed prost\u0159ednictv\u00edm ConfigMap <code>postgres-operator<\/code> ve jmenn\u00e9m prostoru, kam jste oper\u00e1tor nainstalovali. Jakmile jsou \u00falo\u017ei\u0161t\u011b nastavena, lze nasadit prvn\u00ed cluster PostgreSQL.<\/p>\n<p>Nap\u0159\u00edklad na\u0161e standardn\u00ed nasazen\u00ed vypad\u00e1 takto:<\/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>\nTento manifest nasazuje cluster ze 3 instanc\u00ed se sidecarem ve form\u011b <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wrouesnel\/postgres_exporter\">postgres_exporter<\/a><\/noindex>, ze kter\u00e9ho sledujeme metriky aplikace. Jak vid\u00edte, v\u0161e je velmi jednoduch\u00e9 a lze vytvo\u0159it doslova neomezen\u00e9 mno\u017estv\u00ed cluster\u016f.<\/p>\n<p>Je dobr\u00e9 v\u011bnovat pozornost tak\u00e9 <b>webov\u00e9mu rozhran\u00ed pro spr\u00e1vu<\/b> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/docs\/operator-ui.md\">postgres-operator-ui<\/a><\/noindex>. To se dod\u00e1v\u00e1 spolu s oper\u00e1torem a umo\u017e\u0148uje vytv\u00e1\u0159et a mazat clustery, stejn\u011b jako pracovat se z\u00e1lohami, kter\u00e9 oper\u00e1tor vytv\u00e1\u0159\u00ed.<\/p>\n<p><img decoding=\"async\" alt=\"Stru\u010dn\u00fd p\u0159ehled oper\u00e1tor\u016f PostgreSQL pro Kubernetes, na\u0161e volba a zku\u0161enosti\" src=\"\/wp-content\/uploads\/2020\/09\/2e9ae033a9817d101c843ce061aafdb5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Seznam cluster\u016f PostgreSQL<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Stru\u010dn\u00fd p\u0159ehled oper\u00e1tor\u016f PostgreSQL pro Kubernetes, na\u0161e volba a zku\u0161enosti\" src=\"\/wp-content\/uploads\/2020\/09\/74a65f7f301da14a0cb7bea6d5ef84ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Spr\u00e1va z\u00e1loh<\/i><\/p>\n<p>Dal\u0161\u00ed zaj\u00edmavou funkc\u00ed 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>. Tento mechanismus automaticky vytv\u00e1\u0159\u00ed <b>role v PostgreSQL<\/b>, na z\u00e1klad\u011b z\u00edskan\u00e9ho seznamu jmen u\u017eivatel\u016f. Pot\u00e9 API umo\u017e\u0148uje vr\u00e1tit seznam u\u017eivatel\u016f, pro kter\u00e9 jsou automaticky vytv\u00e1\u0159eny role.<\/p>\n<h3>Probl\u00e9my a jejich \u0159e\u0161en\u00ed<\/h3>\n<p>\nPou\u017eit\u00ed oper\u00e1tora v\u0161ak brzy odhalilo n\u011bkolik z\u00e1va\u017en\u00fdch nedostatk\u016f:<\/p>\n<ol>\n<li> nedostatek podpory pro nodeSelector;<\/li>\n<li> nemo\u017enost zak\u00e1zat z\u00e1lohy;<\/li>\n<li> p\u0159i pou\u017eit\u00ed funkce pro vytv\u00e1\u0159en\u00ed datab\u00e1z\u00ed se nezobrazuj\u00ed v\u00fdchoz\u00ed opr\u00e1vn\u011bn\u00ed;<\/li>\n<li> Ob\u010das chyb\u00ed dokumentace nebo je v zastaral\u00e9m stavu.<\/li>\n<\/ol>\n<p>\nNa\u0161t\u011bst\u00ed mnoho z nich lze vy\u0159e\u0161it. Za\u010dneme od konce \u2014 probl\u00e9m\u016f s <strong>dokumentac\u00ed<\/strong>. <\/p>\n<p>Pravd\u011bpodobn\u011b se setk\u00e1te s t\u00edm, \u017ee nen\u00ed v\u017edy jasn\u00e9, jak nastavit z\u00e1lohu a jak p\u0159ipojit z\u00e1lohovac\u00ed bucket k Operator UI. O tom se v dokumentaci zmi\u0148uje jen okrajov\u011b, skute\u010dn\u00fd popis je v <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/481\">PR<\/a><\/noindex>:<\/p>\n<ol>\n<li>je t\u0159eba vytvo\u0159it tajn\u00fd kl\u00ed\u010d;<\/li>\n<li>p\u0159edat jej oper\u00e1torovi v parametru <code>pod_environment_secret_name<\/code> v CRD se konfigurac\u00ed oper\u00e1tora nebo v ConfigMap (z\u00e1le\u017e\u00ed na tom, jak jste se rozhodli oper\u00e1tor nainstalovat).<\/li>\n<\/ol>\n<p>\nJak se v\u0161ak uk\u00e1zalo, v sou\u010dasn\u00e9 dob\u011b to nen\u00ed mo\u017en\u00e9. Pr\u00e1v\u011b proto jsme shrom\u00e1\u017edili <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/postgres-operator\">na\u0161i vlastn\u00ed verzi oper\u00e1tora<\/a><\/noindex> s n\u011bkter\u00fdmi dodate\u010dn\u00fdmi extern\u00edmi vylep\u0161en\u00edmi. Podrobnosti o n\u00ed \u2014 viz n\u00ed\u017ee.<\/p>\n<p>Pokud p\u0159ed\u00e1v\u00e1te oper\u00e1torovi parametry pro z\u00e1lohu, konkr\u00e9tn\u011b \u2014 <code>wal_s3_bucket<\/code> a p\u0159\u00edstupov\u00e9 kl\u00ed\u010de do AWS S3, pak <strong>bude z\u00e1lohovat v\u0161echno<\/strong>: nejen datab\u00e1ze v produkci, ale tak\u00e9 ve stagingu. To n\u00e1m nevyhovovalo.<\/p>\n<p>V popisu parametr\u016f k Spilo, kter\u00e9 je z\u00e1kladn\u00edm Docker wrapperem pro PgSQL p\u0159i pou\u017eit\u00ed oper\u00e1tora, se uk\u00e1zalo: lze p\u0159edat parametr <code>WAL_S3_BUCKET<\/code> pr\u00e1zdn\u00fdm, \u010d\u00edm\u017e se z\u00e1lohy deaktivuj\u00ed. Nav\u00edc, k na\u0161\u00ed velk\u00e9 radosti, se na\u0161el i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/908\">hotov\u00fd PR<\/a><\/noindex>, kter\u00fd jsme okam\u017eit\u011b p\u0159ijali do na\u0161eho forku. Te\u010f sta\u010d\u00ed jednodu\u0161e p\u0159idat <code>enableWALArchiving: false<\/code> do zdroje clusteru PostgreSQL.<\/p>\n<p>Ano, byla mo\u017enost ud\u011blat to jinak, spustit 2 oper\u00e1tory: jeden pro staging (bez z\u00e1loh), a druh\u00fd \u2014 pro produkci. Ale tak jsme se mohli obej\u00edt s jedn\u00edm.<\/p>\n<p>Dob\u0159e, nau\u010dili jsme se p\u0159ed\u00e1vat datab\u00e1z\u00edm p\u0159\u00edstup pro S3 a z\u00e1lohy za\u010daly kon\u010dit ve skladi\u0161ti. Jak aktivovat str\u00e1nky z\u00e1loh v Operator UI?<\/p>\n<p><img decoding=\"async\" alt=\"Stru\u010dn\u00fd p\u0159ehled oper\u00e1tor\u016f PostgreSQL pro Kubernetes, na\u0161e volba a zku\u0161enosti\" src=\"\/wp-content\/uploads\/2020\/09\/46169b53707b0bbb686798c655022f40.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV Operator UI je t\u0159eba p\u0159idat 3 prom\u011bnn\u00e9:<\/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>\nPot\u00e9 se spr\u00e1va z\u00e1loh stane dostupnou, co\u017e v na\u0161em p\u0159\u00edpad\u011b zjednodu\u0161\u00ed pr\u00e1ci se stagingem, umo\u017en\u00ed pos\u00edlat tam v\u00fd\u0159ezy z produkce bez dal\u0161\u00edch skript\u016f.<\/p>\n<p>Jako dal\u0161\u00ed v\u00fdhodu se zmi\u0148ovalo pou\u017eit\u00ed Teams API a \u0161irok\u00e9 mo\u017enosti pro vytv\u00e1\u0159en\u00ed datab\u00e1z\u00ed a rol\u00ed pomoc\u00ed oper\u00e1tora. Nicm\u00e9n\u011b vytv\u00e1\u0159en\u00e9 <strong>role nem\u011bly v\u00fdchoz\u00ed opr\u00e1vn\u011bn\u00ed<\/strong>. U\u017eivatel s pr\u00e1vy na \u010dten\u00ed tak nemohl \u010d\u00edst nov\u00e9 tabulky.<\/p>\n<p>Pro\u010d tomu tak je? I kdy\u017e v k\u00f3du <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/pkg\/cluster\/database.go#L42\">polo\u017eka \u201eP\u0159esunout karty\u201c. Krom\u011b toho<\/a><\/noindex> jsou pot\u0159ebn\u00e9 <code>UD\u011aLOVAT<\/code>, nejsou v\u017edy pou\u017e\u00edv\u00e1ny. Existuj\u00ed 2 metody: <code>syncPreparedDatabases<\/code> a <code>syncDatabases<\/code>. V <code>syncPreparedDatabases<\/code> \u2014 navzdory tomu, \u017ee v sekci <code>preparedDatabases<\/code> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/blob\/master\/manifests\/complete-postgres-manifest.yaml#L26\">polo\u017eka \u201eP\u0159esunout karty\u201c. Krom\u011b toho<\/a><\/noindex> je podm\u00ednka <code>defaultRoles<\/code> a <code>defaultUsers<\/code> pro vytv\u00e1\u0159en\u00ed rol\u00ed, \u2014 v\u00fdchoz\u00ed pr\u00e1va se neuplat\u0148uj\u00ed. Pracujeme na p\u0159\u00edprav\u011b opravy, aby se tato pr\u00e1va automaticky aplikovala.<\/p>\n<p>A posledn\u00ed bod v sou\u010dasn\u00fdch \u00faprav\u00e1ch \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/975\">patch<\/a><\/noindex>, kter\u00fd p\u0159id\u00e1v\u00e1 Node Affinity do vytv\u00e1\u0159en\u00e9ho StatefulSet. Na\u0161i klienti \u010dasto preferuj\u00ed sni\u017eovat n\u00e1klady pou\u017e\u00edv\u00e1n\u00edm spot instanc\u00ed, na kter\u00e9 rozhodn\u011b nen\u00ed dobr\u00e9 umis\u0165ovat datab\u00e1zov\u00e9 slu\u017eby. Tento probl\u00e9m by \u0161lo \u0159e\u0161it i pomoc\u00ed toleranc\u00ed, ale existence Node Affinity zaji\u0161\u0165uje v\u011bt\u0161\u00ed d\u016fv\u011bru.<\/p>\n<h3>Co se poda\u0159ilo?<\/h3>\n<p>\nNa z\u00e1klad\u011b \u0159e\u0161en\u00ed v\u00fd\u0161e uveden\u00fdch probl\u00e9m\u016f jsme forkli Postgres Operator od Zalando do <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/postgres-operator\">na\u0161eho repozit\u00e1\u0159e<\/a><\/noindex>, kde je sb\u00edr\u00e1n se velmi u\u017eite\u010dn\u00fdmi opravami. A pro v\u011bt\u0161\u00ed pohodl\u00ed jsme tak\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/flant\/postgres-operator\">Docker obraz<\/a><\/noindex>.<\/p>\n<p>Seznam PR p\u0159ijat\u00fdch do forku:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/1066\">vytvo\u0159en\u00ed bezpe\u010dn\u00e9ho lehk\u00e9ho Docker obrazu pro oper\u00e1tora<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/908\">deaktivace z\u00e1loh<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/1121\">aktualizace verz\u00ed zdroj\u016f pro aktu\u00e1ln\u00ed verze k8s<\/a><\/noindex>;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zalando\/postgres-operator\/pull\/975\">implementace Node Affinity<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\nBylo by skv\u011bl\u00e9, kdyby komunita podpo\u0159ila tyto PR, aby se dostaly do upstreamu s p\u0159\u00ed\u0161t\u00ed verz\u00ed oper\u00e1tora (1.6).<\/p>\n<h2>Bonus! P\u0159\u00edb\u011bh \u00fasp\u011bchu s migrac\u00ed produkce<\/h2>\n<p>\nPokud pou\u017e\u00edv\u00e1te Patroni, m\u016f\u017eete migrovat \u017eivou produkci na oper\u00e1tora s minim\u00e1ln\u00edm prostojem.<\/p>\n<p>Spilo umo\u017e\u0148uje vytv\u00e1\u0159en\u00ed standby cluster\u016f p\u0159es S3 \u00falo\u017ei\u0161t\u011b s <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wal-e\/wal-e\">Wal-E<\/a><\/noindex>, kdy je bin\u00e1rn\u00ed log PgSQL nejprve ulo\u017een do S3 a pot\u00e9 sta\u017een replikou. Ale co d\u011blat, pokud m\u00e1te <i>ne<\/i> pou\u017e\u00edv\u00e1te Wal-E ve star\u00e9 infrastruktu\u0159e? \u0158e\u0161en\u00ed tohoto probl\u00e9mu u\u017e <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/true_engineering\/blog\/437318\/\">bylo navr\u017eeno<\/a><\/noindex> na habru.<\/p>\n<p>Na pomoc p\u0159ich\u00e1z\u00ed logick\u00e1 replikace PostgreSQL. Nicm\u00e9n\u011b se nebudeme zab\u00fdvat detaily vytv\u00e1\u0159en\u00ed publikac\u00ed a p\u0159edplatn\u00fdch, proto\u017ee\u2026 n\u00e1\u0161 pl\u00e1n selhal.<\/p>\n<p>Skute\u010dnost\u00ed je, \u017ee v datab\u00e1zi bylo n\u011bkolik zat\u00ed\u017een\u00fdch tabulek s miliony \u0159\u00e1dk\u016f, kter\u00e9 byly z\u00e1rove\u0148 neust\u00e1le dopl\u0148ov\u00e1ny a odstra\u0148ov\u00e1ny. <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgrespro\/12\/sql-createsubscription\">Jednoduch\u00e9 p\u0159edplatn\u00e9<\/a><\/noindex> s <code>copy_data<\/code>, kdy nov\u00e1 replikace kop\u00edruje ve\u0161ker\u00fd obsah z prim\u00e1rn\u00edho zdroje, si jednodu\u0161e nesta\u010dila za prim\u00e1rn\u00edm zdrojem. Kop\u00edrov\u00e1n\u00ed obsahu trvalo t\u00fdden, ale prim\u00e1rn\u00ed zdroj nedohnala. Nakonec pomohlo se probl\u00e9mem pohnout <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/avitotech\/recovery-use-cases-for-logical-replication-in-postgresql-10-a1e6bab03072\">neaktu\u00e1ln\u00ed statistika<\/a><\/noindex> koleg\u016fm z Avito: lze p\u0159en\u00e9st data pomoc\u00ed <code>pg_dump<\/code>Pop\u00ed\u0161i na\u0161i (m\u00edrn\u011b upravenou) variantu tohoto algoritmu.<\/p>\n<p>My\u0161lenka spo\u010d\u00edv\u00e1 v tom, \u017ee lze vytvo\u0159it vypnutou subscripci, kter\u00e1 je v\u00e1zan\u00e1 na konkr\u00e9tn\u00ed replika\u010dn\u00ed slot, a pot\u00e9 opravit \u010d\u00edslo transakce. K dispozici byly repliky pro provoz v produkci. To je d\u016fle\u017eit\u00e9, proto\u017ee replika pom\u016f\u017ee vytvo\u0159it konzistentn\u00ed dump a pokra\u010dovat v p\u0159\u00edjmu zm\u011bn z hlavn\u00edho serveru.<\/p>\n<p>V n\u00e1sleduj\u00edc\u00edch p\u0159\u00edkazech, popisuj\u00edc\u00edch proces migrace, budou pou\u017eity n\u00e1sleduj\u00edc\u00ed ozna\u010den\u00ed pro hostitele:<\/p>\n<ol>\n<li><i>master<\/i> \u2014 zdrojov\u00fd server;<\/li>\n<li><i>replica1<\/i> \u2014 streamov\u00e1 replika na star\u00e9m produk\u010dn\u00edm serveru;<\/li>\n<li><i>replica2<\/i> \u2014 nov\u00e1 logick\u00e1 replika.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Pl\u00e1n migrace<\/h3>\n<p>\n1. Vytvo\u0159\u00edme na hlavn\u00edm serveru subscripci pro v\u0161echny tabulky ve sch\u00e9matu <code>public<\/code> datab\u00e1ze <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. Vytvo\u0159\u00edme replika\u010dn\u00ed slot na hlavn\u00edm serveru:<\/p>\n<pre><code class=\"bash\">psql -h master -c \"select pg_create_logical_replication_slot('repl', 'pgoutput');\"\n<\/code><\/pre>\n<p>\n3. Zastav\u00edme replikaci na star\u00e9 replice:<\/p>\n<pre><code class=\"bash\">psql -h replica1 -c \"select pg_wal_replay_pause();\"\n<\/code><\/pre>\n<p>\n4. Z\u00edsk\u00e1me \u010d\u00edslo transakce z hlavn\u00edho serveru:<\/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. Vytvo\u0159\u00edme dump ze star\u00e9 repliky. Budeme to d\u011blat ve v\u00edce vl\u00e1knech, co\u017e pom\u016f\u017ee urychlit proces:<\/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. Nahrajeme dump na nov\u00fd server:<\/p>\n<pre><code class=\"bash\">pg_restore -h replica2 -F d -j 8 -d dbname dump\/\n<\/code><\/pre>\n<p>\n7. Po na\u010dten\u00ed dumpu m\u016f\u017eeme spustit replikaci na streamov\u00e9 replice:<\/p>\n<pre><code class=\"bash\">psql -h replica1 -c \"select pg_wal_replay_resume();\"\n<\/code><\/pre>\n<p>\n7. Vytvo\u0159\u00edme subscripci na nov\u00e9 logick\u00e9 replice:<\/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. Z\u00edsk\u00e1me <code>oid<\/code> subscripce:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c \"select oid, * from pg_subscription;\"\n<\/code><\/pre>\n<p>\n9. P\u0159edpokl\u00e1dejme, \u017ee bylo z\u00edsk\u00e1no <code>oid=1000<\/code>. Aplikujeme \u010d\u00edslo transakce na subscripci:<\/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. Spust\u00edme replikaci:<\/p>\n<pre><code class=\"bash\">psql -h replica2 -d dbname -c \"alter subscription oldprod enable;\"\n<\/code><\/pre>\n<p>\n11. Zkontrolujeme stav subscripce, replikace by m\u011bla fungovat:<\/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 spu\u0161t\u011bn\u00ed replikace a synchronizaci datab\u00e1z\u00ed m\u016f\u017eeme prov\u00e9st p\u0159epnut\u00ed.<\/p>\n<p>13. Po zastaven\u00ed replikace je t\u0159eba opravit sekvence. To je dob\u0159e pops\u00e1no <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.postgresql.org\/wiki\/Fixing_Sequences\">v \u010dl\u00e1nku na wiki.postgresql.org<\/a><\/noindex>.<\/p>\n<p>D\u00edky tomuto pl\u00e1nu bylo p\u0159epnut\u00ed provedeno s minim\u00e1ln\u00edmi zpo\u017ed\u011bn\u00edmi.<\/p>\n<h2>Z\u00e1v\u011br<\/h2>\n<p>\nKubernetes oper\u00e1to\u0159i umo\u017e\u0148uj\u00ed zjednodu\u0161it r\u016fzn\u00e9 \u00fakony t\u00edm, \u017ee je zredukuj\u00ed na vytv\u00e1\u0159en\u00ed K8s zdroj\u016f. Nicm\u00e9n\u011b, pot\u00e9 co dos\u00e1hnete skv\u011bl\u00e9 automatizace s jejich pomoc\u00ed, nezapom\u00ednejte, \u017ee m\u016f\u017ee p\u0159in\u00e9st i \u0159adu ne\u010dekan\u00fdch nuanc\u00ed, proto p\u0159istupujte k v\u00fdb\u011bru oper\u00e1tor\u016f s rozmyslem.<\/p>\n<p>Po zv\u00e1\u017een\u00ed t\u0159\u00ed nejpopul\u00e1rn\u011bj\u0161\u00edch Kubernetes oper\u00e1tor\u016f pro PostgreSQL jsme se rozhodli pro projekt od Zalando. A museli jsme p\u0159ekonat ur\u010dit\u00e9 obt\u00ed\u017ee, ale v\u00fdsledek n\u00e1s skute\u010dn\u011b pot\u011b\u0161il, tak\u017ee pl\u00e1nujeme tento zku\u0161enost roz\u0161\u00ed\u0159it i na n\u011bkolik dal\u0161\u00edch instalac\u00ed PgSQL. Pokud m\u00e1te zku\u0161enosti s podobn\u00fdmi \u0159e\u0161en\u00edmi \u2014 r\u00e1di uvid\u00edme podrobnosti v koment\u00e1\u0159\u00edch!<\/p>\n<h2>P.S.<\/h2>\n<p>\nP\u0159e\u010dt\u011bte si tak\u00e9 n\u00e1\u0161 blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">Datab\u00e1ze a Kubernetes (p\u0159ehled a video prezentace)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/479438\/\">Postgres \u00fater\u00fd \u010d. 5: PostgreSQL a Kubernetes. CI\/CD. Automatizace testov\u00e1n\u00ed<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/480722\/\">Jedna historie s oper\u00e1torem Redis v K8s a mini p\u0159ehled utility pro anal\u00fdzu dat t\u00e9to datab\u00e1ze<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Zdroj: <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.3 - 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\/cs\/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.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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\udd47Kr\u00e1tk\u00fd p\u0159ehled oper\u00e1tor\u016f PostgreSQL pro Kubernetes, n\u00e1\u0161 v\u00fdb\u011br a zku\u0161enost | ProHoster","description":"\u010c\u00edm d\u00e1l \u010dast\u011bji od klient\u016f.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kratkij-obzor-operatorov-postgresql-dlya-kubernetes-nash-vybor-i-opyt","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/95322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=95322"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/95322\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/95323"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=95322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=95322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=95322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}