{"id":35706,"date":"2019-10-31T22:05:50","date_gmt":"2019-10-31T19:05:50","guid":{"rendered":"https:\/\/prohoster.info\/blog\/otkazoustojchivyj-klaster-postgresql-patroni-opyt-vnedreniya\/"},"modified":"2026-05-18T20:58:46","modified_gmt":"2026-05-18T18:58:46","slug":"otkazoustojchivyj-klaster-postgresql-patroni-opyt-vnedreniya","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/otkazoustojchivyj-klaster-postgresql-patroni-opyt-vnedreniya","title":{"rendered":"T\u00f5rgeteta PostgreSQL klaster + Patroni. Rakendamise kogemus","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Artiklis r\u00e4\u00e4gin, kuidas me l\u00e4henesime PostgreSQL t\u00f5rketaluvuse k\u00fcsimusele, miks see meie jaoks t\u00e4htis on ja mida l\u00f5puks saavutasime.<\/p>\n<p>Meil on k\u00f5rge koormusega teenus: 2,5 miljonit kasutajat \u00fcle kogu maailma, 50K+ aktiivset kasutajat iga p\u00e4ev. Serverid asuvad Amazone'is \u00fches Iirimaa regioonis: t\u00f6\u00f6tab pidevalt \u00fcle 100 erineva serveri, sealhulgas peaaegu 50 andmebaasiga.<\/p>\n<p>Kogu backend on suur monoliitne stateful-rakendus Java-s, mis hoiab pidevat websocket-\u00fchendust kliendiga. Kui mitu kasutajat t\u00f6\u00f6tavad \u00fchel tahvelarvutil, n\u00e4evad nad k\u00f5ik muudatusi reaalajas, kuna iga muudatus salvestatakse andmebaasi. Meil on ligikaudu 10K p\u00e4ringut sekundis meie andmebaasidele. Tipukoormuse ajal kirjutame Redis'sse 80-100K p\u00e4ringut sekundis.<br \/>\n<img decoding=\"async\" style=\"display: block; margin: 0 auto;\" src=\"\/wp-content\/uploads\/2019\/06\/443f85815b0560fade7db5b639942935.png\" alt=\"T\u00f5rgeteta PostgreSQL klaster + Patroni. Rakendamise kogemus\" \/><br \/>\n<a rel=\"nofollow\" name=\"habracut\"><\/a><\/p>\n<h2>Miks me l\u00e4ksime Rediselt PostgreSQL-ile \u00fcle<\/h2>\n<p>Alguses t\u00f6\u00f6tas meie teenus Redis'ega, v\u00f5tme-v\u00e4\u00e4rtuse salvestusmoodul, mis salvestab k\u00f5ik andmed m\u00e4llu. <a href=\"https:\/\/prohoster.info\/et\/server\/\">serverile<\/a>.<\/p>\n<p>Redis'e plussid:<\/p>\n<ol>\n<li>K\u00f5rge vastuse kiirus, kuna k\u00f5ik on salvestatud m\u00e4llu;<\/li>\n<li>Mugav varundamine ja replitseerimine.<\/li>\n<\/ol>\n<p>Redis'e miinused meie jaoks:<\/p>\n<ol>\n<li>Reaalsete tehingute puudumine. Proovisime neid simuleerida meie rakenduse tasemel. Kahjuks ei toiminud see alati h\u00e4sti ja n\u00f5udis v\u00e4ga keerulise koodi kirjutamist.<\/li>\n<li>Andmete maht on piiratud m\u00e4lu hulgaga. Andmete suurenedes kasvab m\u00e4lu ja l\u00f5puks j\u00f5uame valitud instantsi omadustesse, mis AWS-is n\u00f5uab meie teenuse peatamist instantsit\u00fc\u00fcbi muutmiseks.<\/li>\n<li>Madala latentsuse taseme pidev s\u00e4ilitamine on vajalik, kuna meil on v\u00e4ga palju p\u00e4ringuid. Meie jaoks on optimaalne latentsuse tase 17-20 ms. 30-40 ms taseme puhul saame meie rakenduse p\u00e4ringutele aeglaseid vastuseid ja teenuse halvenemist. Kahjuks juhtus see meil septembris 2018, kui \u00fcks Redis instants sai mingil p\u00f5hjusel kaks korda suurema latentsuse. Probleemi lahendamiseks peatamine teenus keset t\u00f6\u00f6p\u00e4eva etten\u00e4gematu hoolduse jaoks ja probleemne Redis instants asendati.<\/li>\n<li>Andmete konsistentsi kergesti saavutamine isegi kergemate koodivigade korral ja seej\u00e4rel kulutada palju aega nende andmete parandamiseks koodi kirjutamisele.<\/li>\n<\/ol>\n<p>Oleme arvesse v\u00f5tnud puudused ja m\u00f5istnud, et peame liikuma millegi mugavama suunas, et teha normaalseid tehinguid ja v\u00e4hendada latentsuse s\u00f5ltuvust. Tegime uuringu, anal\u00fc\u00fcsisime hulgaliselt varianta ja valisime PostgreSQL-i.<\/p>\n<p>Oleme uut andmebaasi kasutusele v\u00f5tnud juba 1,5 aastat ja kolinud ainult v\u00e4ikese osa andmetest, seega t\u00f6\u00f6tame praegu samaaegselt Redis'i ja PostgreSQL-i peal. \u00dcksikasjalikumalt \u00fclemineku etappidest ja andmete vahetamisest andmebaaside vahel on kirjutatud <a href=\"https:\/\/habr.com\/ru\/company\/miro\/blog\/437826\/\" rel=\"nofollow\">minu kolleegi artiklis<\/a>.<\/p>\n<p>Kui me alles alustasime \u00fcleminekut, t\u00f6\u00f6tas meie rakendus otse andmebaasiga ja side toimus Redis'i ja PostgreSQL'i emaga. PostgreSQL klasster koosnes emast ja replikast, kasutades as\u00fcnkroonset replikatsiooni. Nii n\u00e4gi v\u00e4lja andmebaasidega t\u00f6\u00f6tamise skeem:<br \/>\n<img decoding=\"async\" style=\"display: block; margin: 0 auto;\" src=\"\/wp-content\/uploads\/2019\/06\/674dd77de4c8b48a946c9f64c0b2fdd1.png\" alt=\"T\u00f5rgeteta PostgreSQL klaster + Patroni. Rakendamise kogemus\" \/><\/p>\n<h2>PgBouncer'i juurutamine<\/h2>\n<p>Selle \u00fclemineku ajal arenes toode samuti: kasutajate arv ja PostgreSQL-i teenindavate serverite arv suurenes ning meil j\u00e4i \u00fchendustest puudu. PostgreSQL loob iga \u00fchenduse jaoks eraldi protsessi, mis tarbib ressursse. \u00dchenduste arvu saab suurendada kuni teatud punktini, muidu on oht saada andmebaasi ebapiisav t\u00f6\u00f6. Sellises olukorras on ideaalne lahendus \u00fchenduste halduri valimine, mis paigaldatakse andmebaasi ette.<\/p>\n<p>Meil oli kaks valikut \u00fchenduste haldurile: Pgpool ja PgBouncer. Kuid esimene ei toeta andmebaasiga t\u00f6\u00f6tamise tehingure\u017eiimi, seet\u00f5ttu valisime PgBounceri.<\/p>\n<p>Me seadistasime j\u00e4rgmise t\u00f6\u00f6 skeemi: meie rakendus p\u00f6\u00f6rdub \u00fche PgBounceri poole, mille taga on PostgreSQL-i peamised serverid ning iga peaserveri taga on \u00fcks replikatsioon as\u00fcnkroonse replikatsiooniga.<br \/>\n<img decoding=\"async\" style=\"display: block; margin: 0 auto;\" src=\"\/wp-content\/uploads\/2019\/06\/dabcb7f6006520c4fec85fb925e8975e.png\" alt=\"T\u00f5rgeteta PostgreSQL klaster + Patroni. Rakendamise kogemus\" \/><\/p>\n<p>Kuna me ei saanud salvestada kogu andmemahtu PostgreSQL-i ning kiirus andmebaasiga t\u00f6\u00f6tamisel oli meile oluline, alustasime PostgreSQL-i shardimist rakendustasandil. \u00dclaltoodud skeem on selleks suhteliselt mugav: uue shardi lisamisel on piisav lihtsalt PgBounceri konfiguratsiooni uuendamine ja rakendus saab kohe uue shardiga t\u00f6\u00f6tada.<\/p>\n<h3>PgBounceri talitlush\u00e4ired<\/h3>\n<p>See skeem t\u00f6\u00f6tas, kuni ainus PgBounceri instants kukkus \u00e4ra. Oleme AWS-is, kus k\u00f5ik instantsid t\u00f6\u00f6tavad riistvaral, mis perioodiliselt loobub elust. Sellistel juhtudel lihtsalt migreeritakse instants uutesse seadmetesse ja see t\u00f6\u00f6tab j\u00e4lle. Nii juhtus ka PgBounceriga, kuid see muutus k\u00e4ttesaamatuks. Selle languse tulemuseks oli meie teenuse k\u00e4ttesaamatuse kestus 25 minutit. AWS soovitab selliste olukordade puhul kliendipoolset \u00fcleliigset lahendust, mida meil tol ajal ei olnud.<\/p>\n<p>P\u00e4rast seda hakkasime t\u00f5siselt m\u00f5tlema PgBounceri ja PostgreSQL klastrite talitlush\u00e4irele, sest sarnane situatsioon v\u00f5iks korduda iga instantsiga meie AWS kontol.<\/p>\n<p>Meie PgBounceri h\u00e4irekavand on ehitatud j\u00e4rgmiselt: k\u00f5ik rakenduste serverid suunavad liikluse Network Load Balancerile, mille taga on kaks PgBouncerit. Iga PgBouncer j\u00e4lgib iga shard'i samu master PostgreSQL servereid. Kui AWS-i instantsi t\u00f5rge kordub, suunatakse kogu liiklus teise PgBounceri kaudu. Network Load Balancer tagab AWS-i kaudu k\u00f5rge k\u00e4ttesaadavuse.<\/p>\n<p>Selline skeem v\u00f5imaldab probleemideta lisada uusi PgBounceri servereid.<br \/>\n<img decoding=\"async\" style=\"display: block; margin: 0 auto;\" src=\"\/wp-content\/uploads\/2019\/06\/2c1f1e7d9f7be4fdeb43858520d55e36.png\" alt=\"T\u00f5rgeteta PostgreSQL klaster + Patroni. Rakendamise kogemus\" \/><\/p>\n<h2>H\u00e4irek\u00f5rguseta PostgreSQL klastrite loomine<\/h2>\n<p>Selle \u00fclesande lahendamisel vaatasime erinevaid v\u00f5imalusi: k\u00e4sitsi kirjutatud failover, repmgr, AWS RDS, Patroni.<\/p>\n<h3>Kohandatud skriptid<\/h3>\n<p>Need saavad monitoorda masteri toimimist ja, kui see eba\u00f5nnestub, edendada koopiat masteriks ning uuendada PgBounceri konfiguratsiooni.<\/p>\n<p>Selle l\u00e4henemise plussid seisnevad maksimaalses lihtsuses, kuna kirjutate skripte ise ja m\u00f5istate t\u00e4pselt, kuidas need t\u00f6\u00f6tavad.<\/p>\n<p>Miinused:<\/p>\n<ul>\n<li>Master ei pruugi olla surnud, v\u00f5ib-olla toimus v\u00f5rgu t\u00f5rge. Kui failover ei tea sellest, edendab see koopiat masteriks ning vana master j\u00e4\u00e4b t\u00f6\u00f6tama. Tulemuseks on kaks serverit masterina ja me ei tea, milles neist on viimased andmed. Sellist olukorda nimetatakse ka split-brain'iks.<\/li>\n<li>Meil on olnud mure replika puudumise osas. Meie konfiguratsioonis on master ja \u00fcks replikatsioon, p\u00e4rast switch'i edeneb replika masteriks ja meil ei ole enam replikaid, seet\u00f5ttu peame k\u00e4sitsi lisama uue replika.<\/li>\n<li>Failoveri t\u00e4iendav j\u00e4lgimine on vajalik, meil on 12 PostgreSQL shard'i, seega peame j\u00e4lgima 12 klastrit. Shardide arvu suurenedes tuleb failover'i samuti v\u00e4rskendada.<\/li>\n<\/ul>\n<p>Kohandatud failover n\u00e4ib v\u00e4ga keeruline ja vajab mittetavalist tuge. \u00dche PostgreSQL klastri puhul oleks see lihtsaim lahendus, kuid see ei ole skaleeritav, seega ei sobi see meile.<\/p>\n<h3>Repmgr<\/h3>\n<p>PostgreSQL klastrite replikatsiooni haldur, mis suudab hallata PostgreSQL klastrite t\u00f6\u00f6d. Samas ei ole seal automaatset failover'i 'karbist', seega on vajalik kirjutada oma '\u00fcmbrik' valmis lahenduse peale. Seet\u00f5ttu v\u00f5ib k\u00f5ik osutuda isegi keerulisemaks kui kohandatud skriptidega, mist\u00f5ttu me ei proovinudki Repmgr'i.<\/p>\n<h3>AWS RDS<\/h3>\n<p>Toetab k\u00f5ike vajalikku, suudab teha varukoopiaid ja toetab \u00fchenduste kogumit. Omab automaatselt \u00fcleminekut: kui p\u00f5hiserver sureb, muutub replikatsioon uuesti peamiseks serveriks ja AWS muudab DNS-kirje uut p\u00f5hiserverit, samas kui replikatsioonid v\u00f5ivad asuda erinevates AZ-des.<\/p>\n<p>Miinusteks on v\u00f5imalikud peened seadistused. N\u00e4iteks peente seadistuste osas: meie instantsidel on piirangud TCP \u00fchenduste jaoks, mida kahjuks RDS-is teha ei saa:<\/p>\n<pre><code class=\"python\">net.ipv4.tcp_keepalive_time=10\nnet.ipv4.tcp_keepalive_intvl=1\nnet.ipv4.tcp_keepalive_probes=5\nnet.ipv4.tcp_retries2=3\n<\/code><\/pre>\n<p>Lisaks on AWS RDS hind peaaegu kaks korda kallim kui tavalise instantsi hind, mis oli peamine p\u00f5hjus selle lahenduse tagasi l\u00fckkamiseks.<\/p>\n<h3>Patroni<\/h3>\n<p>See on Python'i mall PostgreSQL-i haldamiseks, millel on hea dokumentatsioon, automaatne rike ja l\u00e4htekood GitHubis.<\/p>\n<p>Patroni plusse:<\/p>\n<ul>\n<li>Iga konfiguratsiooniparameeter on selgelt kirjas, kuidas miski t\u00f6\u00f6tab;<\/li>\n<li>Automaatne rikete \u00fcleminek t\u00f6\u00f6tab v\u00e4lja karbist;<\/li>\n<li>Kirjutatud Python'is, ja kuna me ise kirjutame palju Python'is, on meil lihtsam probleemidega tegeleda ja v\u00f5ib-olla isegi aidata projekti arengus;<\/li>\n<li>Haldab t\u00e4ielikult PostgreSQL-i, v\u00f5imaldades konfigureerida k\u00f5iki klastrite s\u00f5lmi. Kui uue konfiguratsiooni rakendamiseks on vajalik klastrite taask\u00e4ivitamine, saab seda teha taas Patroni abil.<\/li>\n<\/ul>\n<p>Miinused:<\/p>\n<ul>\n<li>Dokumendist ei ole selge, kuidas PgBounceriga \u00f5igesti t\u00f6\u00f6tada. Kuigi seda on keeruline nimetada miinuseks, kuna Patroni \u00fclesanne on hallata PostgreSQL-i ja kuidas \u00fchendused Patroniga toimuvad, on juba meie probleem.<\/li>\n<li>Patroni juurutamiseks suuremates mahus on v\u00e4he n\u00e4iteid, samas on palju n\u00e4iteid juurutamisest nullist.<\/li>\n<\/ul>\n<p>L\u00f5puks valisime usaldusv\u00e4\u00e4rse klastrite loomise jaoks just Patroni.<\/p>\n<h2>Patroni juurutamisprotsess<\/h2>\n<p>Enne Patronit oli meil 12 PostgreSQL-i shard'i, mis olid konfigureeritud \u00fche meistri ja \u00fche replikaga, mille replikatsioon oli as\u00fcnkroonset t\u00fc\u00fcpi. Rakenduste serverid p\u00f6\u00f6rdusid andmebaaside poole l\u00e4bi Network Load Balanceri, mille taga olid kaks PgBounceri instantsi, ning nende taga k\u00f5ik PostgreSQL serverid.<br \/>\n<img decoding=\"async\" style=\"display: block; margin: 0 auto;\" src=\"\/wp-content\/uploads\/2019\/06\/8e5350d2466311593e11add30d5b1bdc.png\" alt=\"T\u00f5rgeteta PostgreSQL klaster + Patroni. Rakendamise kogemus\" \/><\/p>\n<p>Patroni rakendamiseks pidime valima klastrite konfiguratsiooni jaotatud salvestusruumi. Patroni t\u00f6\u00f6tab koos jaotatud konfiguratsioonihalduss\u00fcsteemidega, nagu etcd, Zookeeper, Consul. Meil on tootmises t\u00e4ielik Consul klaster, mis t\u00f6\u00f6tab koos Vaultiga ja me ei kasuta seda muul viisil. Suurep\u00e4rane v\u00f5imalus hakata Consulit \u00f5igesti kasutama.<\/p>\n<h3>Kuidas Patroni t\u00f6\u00f6tab Consuliga<\/h3>\n<p>Meil on Consul klaster, mis koosneb kolmest node'ist, ja Patroni klaster, mis koosneb liidristruktuurist ja replikast (Patronis nimetatakse master'it klastriliidriks ja slavenid - replikateks). Iga Patroni klastrite instants saadab pidevalt Consulile teavet klastriseisundi kohta. Seet\u00f5ttu saab Consulist alati teada Patroni klastrite praegust konfiguratsiooni ja kes on hetkel liider.<\/p>\n<p><img decoding=\"async\" style=\"display: block; margin: 0 auto;\" src=\"\/wp-content\/uploads\/2019\/06\/3234594b363904424fdce64c9d77fca5.png\" alt=\"T\u00f5rgeteta PostgreSQL klaster + Patroni. Rakendamise kogemus\" \/><\/p>\n<p>Patroni \u00fchendamiseks Consuliga on piisav tutvuda ametliku dokumentatsiooniga, kus on kirjas, et tuleb n\u00e4idata hosti formaadis http v\u00f5i https, s\u00f5ltuvalt sellest, kuidas me Consuliga t\u00f6\u00f6tame, ning \u00fchenduse skeem, mis on valikuline:<\/p>\n<pre><code class=\"plaintext\">host: host:port Consul l\u00f5pp-punkti jaoks, vormingus: http(s):\/\/host:port\nscheme: (valikuline) http v\u00f5i https, vaikimisi http<\/code><\/pre>\n<p>Tundub lihtne, kuid siin algavad komistuskivid. Konsuliga t\u00f6\u00f6tame me kaitstud \u00fchenduse kaudu https ja meie \u00fchenduse konfigureerimine n\u00e4eb v\u00e4lja j\u00e4rgmine:<\/p>\n<pre><code class=\"python\">consul:\n  host: https:\/\/server.production.consul:8080 \n  verify: true\n  cacert: {{ consul_cacert }}\n  cert: {{ consul_cert }}\n  key: {{ consul_key }}<\/code><\/pre>\n<p>Aga see ei toimi. Patroni k\u00e4ivitamisel ei saa see Konsuliga \u00fchendust luua, kuna see \u00fcritab ikkagi minna http kaudu.<\/p>\n<p>Probleemi lahendamisel aitas Patrioni allikas. Hea, et see on kirjutatud pythonis. Selgub, et host-parameetrit ei anal\u00fc\u00fcsita, vaid protokoll tuleb m\u00e4\u00e4rata skeemi all. Nii n\u00e4eb v\u00e4lja t\u00f6\u00f6tav konfigureerimissegment Konsuliga t\u00f6\u00f6tamiseks meie jaoks:<\/p>\n<pre><code class=\"python\">consul:\n  host: server.production.consul:8080\n  scheme: https\n  verify: true\n  cacert: {{ consul_cacert }}\n  cert: {{ consul_cert }}\n  key: {{ consul_key }}<\/code><\/pre>\n<h3>Consul-template<\/h3>\n<p>Nii oleme valinud konfiguratsiooniks hoiuruumi. N\u00fc\u00fcd peame aru saama, kuidas PgBouncer vahetab oma konfiguratsiooni, kui Patroni klastris liider vahetub. Sellele k\u00fcsimusele ei leia dokumentatsioonist vastust, kuna seal ei ole p\u00f5him\u00f5tteliselt kirjeldatud koost\u00f6\u00f6d PgBounceriga.<\/p>\n<p>Lahenduse otsingutel leidsime artikli (pealkiri, kahjuks, ei meenu), kus oli kirjutatud, et Consul-template aitas v\u00e4ga h\u00e4sti PgBounceri ja Patroni vahel. See suunas meid uurima Consul-template'i toimimist.<\/p>\n<p>Selgus, et \u0421onsul-template j\u00e4lgib pidevalt PostgreSQL klastri konfiguratsiooni \u0421onsuli kaudu. Juhtide vahetamisel uuendab ta PgBounceri konfiguratsiooni ja saadab k\u00e4su selle taask\u00e4ivitamiseks.<\/p>\n<p><img decoding=\"async\" style=\"display: block; margin: 0 auto;\" src=\"\/wp-content\/uploads\/2019\/06\/6cf92996a127bb6637ab81dc45fdd60a.png\" alt=\"T\u00f5rgeteta PostgreSQL klaster + Patroni. Rakendamise kogemus\" \/><\/p>\n<p>Suur pluss template'is on see, et see salvestatakse koodina, seega piisab uue shard'i lisamisest lihtsalt uue commit'i tegemisel ja template'i automaatsest uuendamisest, toetades Infrastructure as code p\u00f5him\u00f5tet.<\/p>\n<h3>Uus arhitektuur koos Patroniga<\/h3>\n<p>Tulemuseks saime sellise t\u00f6\u00f6 \u0441\u0445\u0435\u043c:<br \/>\n<img decoding=\"async\" style=\"display: block; margin: 0 auto;\" src=\"\/wp-content\/uploads\/2019\/06\/bf9a9eff675a26039e3f76b16c6cd713.png\" alt=\"T\u00f5rgeteta PostgreSQL klaster + Patroni. Rakendamise kogemus\" \/><\/p>\n<p>K\u00f5ik rakenduste serverid p\u00f6\u00f6rduvad tasakaalustaja poole \u2192 selle taga on kaks PgBounceri instantsi \u2192 igal instantsil on k\u00e4imas \u0421onsul-template, mis j\u00e4lgib iga Patroni klastri olekut ja hoolitseb PgBounceri konfi ajakohasuse eest, mis suunab p\u00e4ringud iga klastri praegusele juhile.<\/p>\n<h3>K\u00e4sitsi testimine<\/h3>\n<p>Selle skeemi enne tootmisse viimist k\u00e4ivitasime v\u00e4ikese testkeskkonna ja kontrollisime automaatse \u00fclemineku toimimist. Avatud tahvlil liikusime kleebist ja sel hetkel 'tapsime' klastri juhi. AWS-is piisab selleks instantsi konsoolist v\u00e4ljal\u00fclitamisest.<\/p>\n<p><img decoding=\"async\" style=\"display: block; margin: 0 auto;\" src=\"\/wp-content\/uploads\/2019\/06\/d670fe373b774f1b52bfd8a8c3b53a21.png\" alt=\"T\u00f5rgeteta PostgreSQL klaster + Patroni. Rakendamise kogemus\" \/><\/p>\n<p>Siltik tuli tagasi 10-20 sekundi jooksul, seej\u00e4rel hakkas j\u00e4lle normaalselt liikuma. See t\u00e4hendab, et Patroni klaster t\u00f6\u00f6tas \u00f5igesti: vahetas liidri, edastas teabe Consulile ja Consul-template haaras selle teabe kohe, asendas PgBounceri konfiguratsiooni ja edastas k\u00e4su reload.<\/p>\n<h2>Kuidas ellu j\u00e4\u00e4da k\u00f5rge koormuse all ja s\u00e4ilitada minimaalne seisak?<\/h2>\n<p>K\u00f5ik t\u00f6\u00f6tab suurep\u00e4raselt! Kuid uusi k\u00fcsimusi tekib: Kuidas see t\u00f6\u00f6tab k\u00f5rge koormuse all? Kuidas kiiresti ja ohutult k\u00f5ike tootmisse rakendada?<\/p>\n<p>Esimesele k\u00fcsimusele aitab vastata testkeskkond, kus teeme koormustestimist. See on t\u00e4ielikult identne tootmisele arhitektuurilt ja sisaldab genereeritud testandmeid, mille maht on umbes sama suur nagu tootmises. Otsustame lihtsalt \u201ctappa\u201d \u00fche PostgreSQL peamise serveri testi ajal ja vaadata, mis juhtub. Kuid enne seda on oluline kontrollida automaatset rakendamist, sest sellel keskkonnas on meil mitu PostgreSQL shard'i, nii et saame suurep\u00e4rase konfiguratsiooniskeemide testimise enne tootmist.<\/p>\n<p>M\u00f5lemad \u00fclesanded tunduvad ambitsioonikad, kuid meil on PostgreSQL 9.6. Kas t\u00f5stame kohe versioonile 11.2?<\/p>\n<p>Kavandame seda teha kahes etapis: esmalt uuendame versiooni 11.2-le ja seej\u00e4rel k\u00e4ivitame Patroni.<\/p>\n<h3>PostgreSQL uuendamine<\/h3>\n<p>PostgreSQL versiooni kiireks uuendamiseks tuleb kasutada valikut <b>-k<\/b>, milles luuakse k\u00f5vakettale hard link ja teie andmete kopeerimist pole vaja. 300-400 GB suuruste andmebaaside puhul v\u00f5tab uuendamine aega 1 sekund.<\/p>\n<p>Meil on palju sharde, seega peab uuendamine toimuma automaatre\u017eiimis. Selleks kirjutasime Ansible playbook'i, mis viib kogu uuendamisprotsessi l\u00e4bi meie eest:<\/p>\n<pre><code class=\"plaintext\">\/usr\/lib\/postgresql\/11\/bin\/pg_upgrade \n&lt;b&gt;--link &lt;\/b&gt;\n--old-datadir=&#039;&#039; --new-datadir=&#039;&#039; \n --old-bindir=&#039;&#039;  --new-bindir=&#039;&#039; \n --old-options=&#039; -c config_file=&#039; \n --new-options=&#039; -c config_file=&#039;<\/code><\/pre>\n<p>Siinkohal on oluline m\u00e4rkida, et enne uuenduse k\u00e4ivitamist tuleb see teha parameetriga <b>&#8212;check<\/b>, et veenduda uuendamise v\u00f5imalikkuses. Samuti teeb meie skript uuendamise ajaks konfiguratsioonifailide vahetuse. Meie skript k\u00e4ivitati 30 sekundi jooksul, see on suurep\u00e4rane tulemus.<\/p>\n<h3>Patroni k\u00e4ivitamine<\/h3>\n<p>Teise probleemi lahendamiseks piisab, kui vaadata Patroni konfiguratsiooni. Ametlikus hoidlas on olemas initdb konfiguratsiooni n\u00e4idis, mis vastutab uue andmebaasi initsialiseerimise eest Patroni esmakordsel k\u00e4ivitamisel. Kuna meil on juba valmis andmebaas, eemaldasime lihtsalt selle osa konfiguratsioonist.<\/p>\n<p>Kui alustasime Patroni seadistamist juba valmis PostgreSQL klastrile ja selle k\u00e4ivitamist, siis kohtasime uut probleem: m\u00f5lemad serverid k\u00e4ivituvad kui liidrid. Patroni ei tea klastrite varasest seisundist ja \u00fcritab k\u00e4ivitada m\u00f5lemat serverit nagu kahte eraldi klastrit sama nimega. Selle probleemi lahendamiseks tuleb kustutada slaavi andmed direktori:<\/p>\n<pre><code class=\"plaintext\">rm -rf \/var\/lib\/postgresql\/<\/code><\/pre>\n<p><b>Seda tuleb teha ainult slaavil!<\/b><\/p>\n<p>Puhas replikatsioon \u00fchendamisel teeb Patroni liidri baasi varukoopia ja taastab selle replikatsioonile, seej\u00e4rel j\u00f5uab aktuaalsesse seisundisse l\u00e4bi wal-logide.<\/p>\n<p>Veel \u00fcks keerukus, millega me kokku puutusime, on see, et k\u00f5ik PostgreSQL klastrid kannavad vaikimisi nime main. Kui iga klaster ei tea teistest midagi, on see normaalne. Kuid kui soovite kasutada Patronit, peavad k\u00f5ik klastrid omama unikaalset nime. Lahendus on muuta PostgreSQL konfiguratsioonis klastrinime.<\/p>\n<h3>Koormustest<\/h3>\n<p>Me k\u00e4ivitasime testi, mis j\u00e4ljendab kasutajate tegevust tahvlitel. Kui koormus j\u00f5udis meie keskmisele p\u00e4evatasemele, viisime l\u00e4bi t\u00e4pselt sama testi, l\u00fclitades v\u00e4lja \u00fche PostgreSQL juhi esinduse. Automatiseeritud failover toimis meie ootuste kohaselt: Patroni vahetas juhti, Consul-template uuendas PgBounceri konfiguratsiooni ja k\u00e4skis ta uuesti laadida. Meie Grafanas n\u00e4htavatest graafikutest oli n\u00e4ha, et oli 20-30 sekundi pikkused viivitused ja v\u00e4ike hulk vigu serveritest, mis olid seotud andmebaasi \u00fchendustega. See on normaalne olukord, sellised n\u00e4itajad on meie failover'i jaoks vastuv\u00f5etavad ja kindlasti paremad kui teenuse seiskumine.<\/p>\n<h2>Patroni v\u00e4ljund tootmises<\/h2>\n<p>Kokkuv\u00f5ttes saime j\u00e4rgmise plaani:<\/p>\n<ul>\n<li>Consul-template'i juurutamine PgBounceri serveritesse ja k\u00e4ivitamine;<\/li>\n<li>PostgreSQL versiooni 11.2 uuendamine;<\/li>\n<li>Klastri nime muutmine;<\/li>\n<li>Patroni klastri k\u00e4ivitamine.<\/li>\n<\/ul>\n<p>Samal ajal v\u00f5imaldab meie skeem esimese punkti teostada praktiliselt igal ajal, saame j\u00e4rk-j\u00e4rgult iga PgBounceri v\u00e4lja l\u00fclitada ning teostada sellele juurutamise ja Consul-template'i k\u00e4ivitamise. Just seda me tegime.<\/p>\n<p>Kiirete juurutuste jaoks kasutasime Ansible'i, kuna k\u00f5ik playbook'id olime juba testkeskkonnas \u00fcle kontrollinud ning t\u00e4issaneerimise kestus iga shard\u2019i kohta oli 1,5 kuni 2 minutit. Me oleksime saanud k\u00f5ik j\u00e4rk-j\u00e4rgult iga shard'i peale k\u00e4ivitada ilma meie teenuse peatamiseta, kuid oleksime pidanud iga PostgreSQL m\u00f5neks minutiks v\u00e4lja l\u00fclitama. Sellisel juhul ei saaks need kasutajad, kelle andmed on sellel shard'il, sel ajal t\u00e4ielikult t\u00f6\u00f6tada, mis on meie jaoks vastuv\u00f5etamatu.<\/p>\n<p>Selle olukorra lahenduseks sai planeeritud hooldus, mis toimub meil iga kolm kuu tagant. See on aken planeeritud t\u00f6\u00f6deks, mille k\u00e4igus l\u00fclitame meie teenuse t\u00e4ielikult v\u00e4lja ja uuendame andmebaasi instantsid. J\u00e4rgmise aknani oli j\u00e4\u00e4nud n\u00e4dal ja otsustasime lihtsalt oodata ja t\u00e4iendavalt valmistuda. Ootamise ajal kindlustasime end t\u00e4iendavalt: iga shard'i jaoks t\u00f5stsime \u00fcles varureplika, et \u00e4ra hoida eba\u00f5nnestumist ja s\u00e4ilitada k\u00f5ige v\u00e4rskemad andmed, ning lisasime iga shard'i jaoks uue instantsi, mis peab olema uus replikator Patroni klastris, et mitte k\u00e4ivitada andmete kustutamise k\u00e4sku. K\u00f5ik see aitas maksimaalselt v\u00e4hendada vea riski.<br \/>\n<img decoding=\"async\" style=\"display: block; margin: 0 auto;\" src=\"\/wp-content\/uploads\/2019\/06\/29e5c5f50dbfebfe5665fa0aeb009728.png\" alt=\"T\u00f5rgeteta PostgreSQL klaster + Patroni. Rakendamise kogemus\" \/><\/p>\n<p>Oleme meie teenuse taask\u00e4ivitanud, k\u00f5ik t\u00f6\u00f6tab nagu peab, kasutajad said j\u00e4tkata t\u00f6\u00f6d, kuid graafikud n\u00e4itasid ebanormaalset k\u00f5rget koormust Consul-serveritele.<br \/>\n<img decoding=\"async\" style=\"display: block; margin: 0 auto;\" src=\"\/wp-content\/uploads\/2019\/06\/af0eef9ac235706c0aac62d2e1ee179d.png\" alt=\"T\u00f5rgeteta PostgreSQL klaster + Patroni. Rakendamise kogemus\" \/><\/p>\n<p>Miks me seda testkeskkonnas ei n\u00e4inud? See probleem illustreerib v\u00e4ga selgelt, et on h\u00e4davajalik j\u00e4rgida printsiipi \u201eInfrastruktuur kui kood\u201d ja t\u00e4iustada kogu infrastruktuuri alates testkeskkondadest kuni tootmiseni. Vastasel juhul on v\u00e4ga lihtne saada selline probleem, nagu meil oli. Mis juhtus? Consul ilmus esmalt tootmisse ja alles hiljem testkeskkondadesse, tulemuseks oli see, et testkeskkondades oli Consuli versioon k\u00f5rgem kui tootmises. Just \u00fches versiooniv\u00e4ljaandes lahendati CPU lekkimine consul-template'i kasutamisel. Seet\u00f5ttu v\u00e4rskendasime lihtsalt Consuli, lahendades niiviisi probleemi.<\/p>\n<h3>Taask\u00e4ivita Patroni klaster<\/h3>\n<p>Kuid saime uue probleemi, millest isegi ei kahtlustanud. Consuli uuendamisel eemaldame lihtsalt Consuli s\u00f5lme klastrist k\u00e4suga consul leave \u2192 Patroni \u00fchendub teise Consuli serveriga \u2192 k\u00f5ik t\u00f6\u00f6tab. Kuid kui j\u00f5udsime klastris viimasele Consuli instantsile ja saatsime talle k\u00e4su consul leave, taask\u00e4ivitusid k\u00f5ik Patroni klastrid, ja logides n\u00e4gime j\u00e4rgmist viga:<\/p>\n<pre><code class=\"plaintext\">VIGA: get_cluster\nViga j&auml;lgimine (viimase k&otilde;ne sisu):\n...\nRetryFailedError: &#039;&Uuml;letatud uuesti proovimise t&auml;htaeg&#039;\nVIGA: Viga suhtlemisel DCS-iga\n&lt;b&gt;LOGI: andmebaasi s&uuml;steem on v&auml;lja l&uuml;litatud&lt;\/b&gt;<\/code><\/pre>\n<p>Patroni klaster ei saanud teavet oma klastrist ja taask\u00e4ivitati.<\/p>\n<p>Otsides lahendust, p\u00f6\u00f6rdusime Patroni autorite poole GitHubi teema kaudu. Nad pakkusid meie konfiguratsioonifailide t\u00e4iustusi:<\/p>\n<pre><code class=\"python\">consul:\n consul.checks: []\nbootstrap:\n dcs:\n   retry_timeout: 8<\/code><\/pre>\n<p>Me suutsime probleemi testkeskkonnas korrata ja testisime seal neid parameetreid, kuid kahjuks need ei t\u00f6\u00f6tanud.<\/p>\n<p>Probleem on endiselt lahendamata. Plaanime proovida j\u00e4rgmisi lahendusi:<\/p>\n<ul>\n<li>Kasutada Consul-agent\u2019i igas Patroni klastris asuvas instantsis;<\/li>\n<li>Parandada probleem koodis.<\/li>\n<\/ul>\n<p>Meile on selge vea tekkimise koht: probleem on t\u00f5en\u00e4oliselt default timeout\u2019i kasutamises, mida ei \u00fcmberdefineerita konfiguratsioonifaili kaudu. Kui viimane Consul server eemaldatakse klastrist, hangub kogu Consul klaster, mis kestab kauem kui sekund, mist\u00f5ttu Patroni ei saa klastriseisundit ja taask\u00e4ivitab kogu klastrit.<\/p>\n<p>\u00d5nneks ei ole me kohanud mingeid muid vigu.<\/p>\n<h2>Patroni kasutamise tulemused<\/h2>\n<p>P\u00e4rast Patroni edukat k\u00e4ivitamist lisasime igasse klastrisse \u00fche t\u00e4iendava repliigi. N\u00fc\u00fcd on igas klastris mingi liik, kus on \u00fcks liider ja kaks repliiki \u2014 et kaitsta jagatud aju olukorra korral vahetamisel.<br \/>\n<img decoding=\"async\" style=\"display: block; margin: 0 auto;\" src=\"\/wp-content\/uploads\/2019\/06\/3bb4c0495fea274b04edd2e99b59eacb.png\" alt=\"T\u00f5rgeteta PostgreSQL klaster + Patroni. Rakendamise kogemus\" \/><\/p>\n<p>Patroni on tootmises olnud \u00fcle kolme kuu. Selle aja jooksul on see meid juba p\u00e4\u00e4stnud. Hiljuti suri AWS-is \u00fche klastri liider, automaatne failover t\u00f6\u00f6tas ja kasutajad said j\u00e4tkata t\u00f6\u00f6d. Patroni t\u00e4itis oma peamise eesm\u00e4rgi.<\/p>\n<p><b>Patroni kasutamise v\u00e4ike kokkuv\u00f5te:<\/b><\/p>\n<ul>\n<li>Asetuste muutmise mugavus. Piisab muudatusest \u00fches instantsis ja see t\u00f5mmatakse kogu klastrisse. Kui uue seadistuse rakendamiseks on vajalik taask\u00e4ivitamine, siis Patroni teavitab sellest. Patroni saab kogu klastrit taask\u00e4ivitada \u00fche k\u00e4suga, mis on samuti v\u00e4ga mugav.<\/li>\n<li>Automaatne failover t\u00f6\u00f6tab ja on meid juba aidanud.<\/li>\n<li>PostgreSQL-i uuendamine ilma rakenduse seiskamiseta. Esiteks tuleb uuendada repliigid uuele versioonile, seej\u00e4rel vahetada klastri Patroni liider ja uuendada vana liider. Sellega toimub vajalik automaatse failoveri testimine.<\/li>\n<\/ul>\n<p>Allikas: <a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/miro\/blog\/457326\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u043a \u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 PostgreSQL, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u0434\u043b\u044f \u043d\u0430\u0441 \u0432\u0430\u0436\u043d\u043e \u0438 \u0447\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. \u0423 \u043d\u0430\u0441 \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441: 2,5 \u043c\u043b\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0438\u0440\u0443, 50\u041a+ \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c. \u0421\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 Amazone \u0432 \u043e\u0434\u043d\u043e\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0435 \u0418\u0440\u043b\u0430\u043d\u0434\u0438\u0438: \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e 100+ \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432, \u0438\u0437 \u043d\u0438\u0445 \u043f\u043e\u0447\u0442\u0438 50 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26749,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35706","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u043a \u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 PostgreSQL, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u0434\u043b\u044f \u043d\u0430\u0441 \u0432\u0430\u0436\u043d\u043e \u0438 \u0447\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. \u0423 \u043d\u0430\u0441 \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441: 2,5 \u043c\u043b\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0438\u0440\u0443, 50\u041a+ \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c. \u0421\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 Amazone \u0432 \u043e\u0434\u043d\u043e\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0435 \u0418\u0440\u043b\u0430\u043d\u0434\u0438\u0438: \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e 100+ \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432, \u0438\u0437 \u043d\u0438\u0445 \u043f\u043e\u0447\u0442\u0438 50\" \/>\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\/et\/blog\/administrirovanie\/otkazoustojchivyj-klaster-postgresql-patroni-opyt-vnedreniya\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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\u041e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 PostgreSQL + Patroni. \u041e\u043f\u044b\u0442 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u043a \u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 PostgreSQL, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u0434\u043b\u044f \u043d\u0430\u0441 \u0432\u0430\u0436\u043d\u043e \u0438 \u0447\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. \u0423 \u043d\u0430\u0441 \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441: 2,5 \u043c\u043b\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0438\u0440\u0443, 50\u041a+ \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c. \u0421\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 Amazone \u0432 \u043e\u0434\u043d\u043e\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0435 \u0418\u0440\u043b\u0430\u043d\u0434\u0438\u0438: \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e 100+ \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432, \u0438\u0437 \u043d\u0438\u0445 \u043f\u043e\u0447\u0442\u0438 50\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/otkazoustojchivyj-klaster-postgresql-patroni-opyt-vnedreniya\" \/>\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=\"2019-10-31T19:05:50+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-05-18T18:58:46+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\udd47Talitlush\u00e4irete v\u00e4ltimise PostgreSQL klaster + Patroni. Rakendamise kogemus | ProHoster","description":"Selles artiklis r\u00e4\u00e4gin, kuidas me l\u00e4henesime PostgreSQL-i talitlush\u00e4irete v\u00e4ltimise k\u00fcsimusele, miks see meie jaoks oluline on ja millised olid l\u00f5ppkokkuv\u00f5ttes tulemused. Meil on k\u00f5rge koormusega teenus: 2,5 miljonit kasutajat \u00fcle kogu maailma, igap\u00e4evaselt 50 000+ aktiivset kasutajat. Serverid asuvad Amazone'is, \u00fches Iirimaa regioonis: t\u00f6\u00f6 k\u00e4ib pidevalt 100+ erineva serveriga, millest peaaegu 50.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/otkazoustojchivyj-klaster-postgresql-patroni-opyt-vnedreniya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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\u041e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 PostgreSQL + Patroni. \u041e\u043f\u044b\u0442 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f | ProHoster","og:description":"\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u043a \u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 PostgreSQL, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u0434\u043b\u044f \u043d\u0430\u0441 \u0432\u0430\u0436\u043d\u043e \u0438 \u0447\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. \u0423 \u043d\u0430\u0441 \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441: 2,5 \u043c\u043b\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0438\u0440\u0443, 50\u041a+ \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c. \u0421\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 Amazone \u0432 \u043e\u0434\u043d\u043e\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0435 \u0418\u0440\u043b\u0430\u043d\u0434\u0438\u0438: \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e 100+ \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432, \u0438\u0437 \u043d\u0438\u0445 \u043f\u043e\u0447\u0442\u0438 50","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/otkazoustojchivyj-klaster-postgresql-patroni-opyt-vnedreniya","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":"2019-10-31T19:05:50+00:00","article:modified_time":"2026-05-18T18:58:46+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35706","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":"2026-01-22 00:26:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 13:51:06","updated":"2026-01-22 00:26:19"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/35706","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=35706"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/35706\/revisions"}],"predecessor-version":[{"id":172654,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/35706\/revisions\/172654"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/26749"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=35706"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=35706"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=35706"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}