Selles artiklis rÀÀgin, kuidas me lĂ€henesime PostgreSQL-i tĂ”rke taastamise kĂŒsimusele, miks see meile oluline oli ja mis lĂ”puks vĂ€lja tuli.
Meil on suure koormusega teenus: 2,5 miljonit kasutajat ĂŒle kogu maailma, 50K+ aktiivset kasutajat igapĂ€evaselt. Serverid asuvad Amazones ĂŒhes Iiri regioonis: töös on pidevalt 100+ erinevat serverit, neist peaaegu 50 on andmebaasidega.
Kogu backend on suur monoliitne stateful-rakendus Java-s, mis hoiab pidevat websocketi ĂŒhendust kliendiga. Kui mitu kasutajat töötab samal tahvelarvutil, nĂ€evad nad kĂ”iki muudatusi reaalajas, kuna iga muudatus salvestatakse andmebaasi. Meil on umbes 10K pĂ€ringut sekundis meie andmebaasidele. Tipukoormuse ajal kirjutame Redis-i 80-100K pĂ€ringut sekundis.

Miks me lĂ€ksime Redisilt PostgreSQL-ile ĂŒle
Alguses töötas meie teenus Redisiga, vĂ”tme-vÀÀrtus salvestussĂŒsteemiga, mis hoiab kĂ”iki andmeid mĂ€lus serverilt.
Redis'i plussid:
- KÔrge vastamiskiirus, kuna kÔik on mÀlus;
- Mugav varukoopiate ja replikatsioonide tegemine.
Redis'i miinused meie jaoks:
- Tegelikke tehinguid ei ole. Proovisime neid simuleerida meie rakenduse tasemel. Kahjuks ei töötanud see alati hÀsti ja nÔudis vÀga keerulise koodi kirjutamist.
- Andmete maht on piiratud mĂ€lumahu jĂ€rgi. Kui andmete hulk suureneb, kasvab mĂ€lu ja lĂ”puks jĂ”uame valitud instantsi omaduste piiridesse, mis AWS-is nĂ”uab meie teenuse peatamist instantsi tĂŒĂŒbi muutmiseks.
- Peame pidevalt hoidma madalat latentsus taset, kuna meil on vĂ€ga palju pĂ€ringuid. Meie jaoks optimaalne viivituse tase on 17-20 ms. 30-40 ms tasemel saame pika vastuse pĂ€ringutele meie rakenduse eest ja teenuse halvenemise. Kahjuks juhtus see meil septembris 2018, kui ĂŒks Redis-i instants sai mingil pĂ”hjusel viivituse, mis oli kaks korda suurem kui tavaliselt. Probleemi lahendamiseks peatasime teenuse tööpĂ€eva keskel ettenĂ€gematuks hoolduseks ja vahetasime probleemse Redis-i instantsi.
- Andmete konsistentsuse kadumine on lihtne isegi vÀikeste vigade korral koodis ja seejÀrel vÔib kuluda palju aega nende andmete parandamiseks vajaliku koodi kirjutamiseks.
Me vĂ”tsime arvesse puudusi ja mĂ”istsime, et peame liikuma millegi mugavama suunas, normaalsemate tehingute ja vĂ€iksema sĂ”ltuvusega latentsusest. Tegime uuringu, analĂŒĂŒsisime mitmeid valikuid ja valisime PostgreSQL.
Uuele andmebaasile oleme ĂŒle kolinud juba 1,5 aastat ja edastanud vaid vĂ€ikese osa andmetest, seega töötame praegu samal ajal Redis'i ja PostgreSQL'iga. Rohkem etappidest ja andmete ĂŒleviimisest andmebaaside vahel on kirjutatud minu kolleegi artiklis.
Kui me alles alustasime ĂŒleminekut, töötas meie rakendus otse andmebaasiga ja pöördus Redis'i ja PostgreSQL'i poole. PostgreSQL klaster koosnes peakontorist ja asĂŒnkroneeritud replikast. Nii nĂ€gi vĂ€lja andmebaaside töö skeem:

PgBouncer'i rakendamine
Kuna me ĂŒlemineku kĂ€igus arendasime ka toodet: kasutajate arv ja PostgreSQL'iga töötavate serverite arv suurenes, ja meil hakkas puuduma ĂŒhendusi. PostgreSQL loob iga ĂŒhenduse jaoks eraldi protsessi ja tarbib ressursse. Ăhenduste arvu vĂ”ib suurendada teatud piirini, vastasel juhul on oht saada alatehnilise töö andmebaas. Sellises olukorras oleks ideaalne valida ĂŒhendusehaldur, mis paigaldataks andmebaasi ette.
Meil oli kaks valikut ĂŒhendusehalduriks: Pgpool ja PgBouncer. Kuid esimene ei toeta andmebaasi tehingureĆŸiimi, seetĂ”ttu valisime PgBouncer'i.
Seadsime ĂŒles jĂ€rgmise töö skeemi: meie rakendus pöördub ĂŒhe PgBouncer'i poole, mille taga on PostgreSQL'i peamised serverid, ja iga peamise konto taga on ĂŒks asĂŒnkroneeritud replik.

Samal ajal ei saanud me salvestada kogu andmevoogu PostgreSQL'i ja meile oli oluline andmebaasi töö kiirus, seega hakkasime PostgreSQL'i andmebaasi sharding'iga rakenduse tasemel. Ălaltoodud skeem on selle jaoks suhteliselt mugav: uue shard'i lisamisel on PostgreSQL'i konfiguratsiooni lihtsalt uuendada ja rakendus vĂ”ib kohe uue shard'iga töötada.
PgBouncer'i talitlushÀiretunne
See skeem töötas seni, kuni ainus PgBouncer'i instants hetkel ei kadunud. Oleme AWS-is, kus kĂ”ik instantsid töötavad riistvaral, mis aeg-ajalt kukub. Sellistel juhtudel liigub instants lihtsalt uuele riistvarale ja töötab jĂ€lle. Nii juhtus ka PgBouncer'i puhul, kuid see muutus kĂ€ttesaamatuks. Selle purunemise tulemuseks oli meie teenuse tĂ”rge 25 minutiks. AWS soovitab selliste olukordade jaoks kasutada kasutaja poolel ĂŒleliiksust, mida meie hetkel ei olnud rakendanud.
PÀrast seda hakkasime tÔsiselt mÔtlema PgBouncer'i ja PostgreSQL'i klastrite töökindlusele, sest sarnane olukord vÔis korduda mis tahes meie AWS kontol asuvas instantsis.
PgBouncer'i töökindluse skeemi ehitasime jÀrgmiselt: kÔik rakendusserverid pöörduvad Network Load Balancer'i poole, mille taga on kaks PgBouncer'it. Iga PgBouncer vaatab sama master PostgreSQL'i igas shardis. Kui situatsioon AWS-i instantsi kukkumisega kordub, suunatakse kogu liiklus teise PgBouncer'i kaudu. Network Load Balancer'i töökindlust tagab AWS.
See skeem vÔimaldab probleemideta lisada uusi PgBouncer'e.

Töökindla PostgreSQL'i klusteri loomine
Selle probleemi lahendamisel kaalume erinevaid valikuid: isetehtud failover, repmgr, AWS RDS, Patroni.
Isetehitatud skriptid
Saavad jÀlgida master'i tööd ja, kui see kukub, tÔsta replikatsioon master'iks ja uuendada PgBouncer'i konfiguratsiooni.
Selle lÀhenemise plussid on maksimaalne lihtsus, sest kirjutate ise skripte ja mÔistate tÀpselt, kuidas need töötavad.
Miinused:
- Master ei pruugi olla surnud, vÔib olla ka vÔrgu tÔrge. Failover, teadmata sellest, tÔukab replikatsiooni master'iks, samas kui vana master jÀtkab töötamist. Tulemuseks on, et meil on kaks serverit master'i rollis ja me ei tea, millel on viimased aktiivsed andmed. Sellist olukorda nimetatakse ka split-brain'iks.
- JĂ€ime ilma replikast. Meie konfiguratsioonis on master ja ĂŒks replikatsioon, pĂ€rast ĂŒleviimist tĂ”ukatakse replikatsioon master'iks ja meil ei ole enam replikasid, seega peame kĂ€sitsi lisama uue replikatsiooni.
- On vajalik tÀiendav failover'i töötamise jÀlgimine, samas on meil 12 PostgreSQL'i shard'i, seega peame jÀlgima 12 klastrit. Kui shard'ide arv suureneb, ei tohi unustada failover'it uuendada.
Kohandatud failover tundub vĂ€ga keeruline ja nĂ”uab mitte triviaalset tuge. Ăhe PostgreSQL-klastriga on see kĂ”ige lihtsam variant, kuid see ei ole skaleeritav, seega meie jaoks ei sobi.
Repmgr
PostgreSQL klastrite replikatsiooni haldaja, mis oskab hallata PostgreSQL klastri tööd. Samas puudub selles automaatne failover âkarbist vĂ€ljaâ, seega on vajalik kirjutada selle valmis lahenduse peale oma âĂŒmberpakendâ. Nii et kĂ”ik vĂ”ib osutuda isegi keerulisemaks kui kohandatud skriptide puhul, seega ei proovinud me isegi Repmgr.
AWS RDS
Toetab kĂ”ike vajalikku meie jaoks, oskab teha varukoopiaid ja toetab ĂŒhenduste basseini. Omab automaatset vahetust: kui master sureb, muutub replikast uus master ja AWS muudab dns-kirje uuele masterile, samal ajal kui replikad vĂ”ivad olla erinevates AZ-des.
Puudustena vĂ”ib vĂ€lja tuua peente seadete puudumise. NĂ€iteks peene seadistusena on meie instantsidel TCP-ĂŒhenduste jaoks piirangud, mida kahjuks RDS-is teha ei saa:
net.ipv4.tcp_keepalive_time=10
net.ipv4.tcp_keepalive_intvl=1
net.ipv4.tcp_keepalive_probes=5
net.ipv4.tcp_retries2=3
Lisaks on AWS RDS hind peaaegu kaks korda kallim kui tava hind instantside puhul, mis oli ka peamine pĂ”hjus selle lahenduse kĂ€est Ă€ra ĂŒtlemiseks.
Patronit
See on Pythonis kirjutatud mall PostgreSQL haldamiseks, millel on hea dokumentatsioon, automaatne failover ja source code GitHubis.
Patroni plussid:
- Iga seadistuse parameeter on kirjas, on selge, kuidas mis töötab;
- Automaatne failover töötab karbist vÀlja;
- Kirjutatud Pythonis ja kuna me ise kirjutame palju Pythonis, siis on meil lihtsam lahendada probleeme ja vÔib-olla isegi aidata projekti arengus;
- Haldab tÀielikult PostgreSQL-i, vÔimaldab muuta konfiguratsiooni kohe kÔigil klastrinoodidel, ja kui uue konfiguratsiooni kasutamiseks on vajalik klastrit taaskÀivitada, saab seda taas teha Patroni abil.
Miinused:
- Dokumentatsioonist ei ole selge, kuidas Ă”igesti PgBounceriga töötada. Kuigi seda on keeruline miinuseks pidada, sest Patroni ĂŒlesanne on hallata PostgreSQL-i, ja kuidas ĂŒhendused Patronisse jĂ”uavad, on juba meie probleem;
- Patroni rakendamise nÀidiseid on vÀhe suurte koguste puhul, samas on palju nÀiteid rakendamise algusest.
KokkuvÔttes valisime kÔrgema usaldusvÀÀrsuse klastri loomiseks just Patroni.
Patroni rakendamise protsess
Enne Patronit oli meil 12 PostgreSQL shard'i konfiguratsioonis, kus oli ĂŒks meister ja ĂŒks replikatsioon asĂŒnkroonse replikatsiooniga. Rakenduste serverid kasutasid andmebaase Network Load Balancer'i kaudu, mille taga olid kaks PgBouncer'i instantsi, ja nende taga kĂ”ik PostgreSQL serverid.

Patroni rakendamiseks pidime valima klastrite konfiguratsiooni jaotatud salvestuse. Patroni töötab jaotatud konfiguratsioonide salvestussĂŒsteemidega nagu etcd, Zookeeper ja Consul. Meil on tootmises tĂ€ielik Consul klaster, mis töötab koos Vault'iga ja me ei kasuta seda muul viisil. SuurepĂ€rane vĂ”imalus hakata Consulit sihipĂ€raselt kasutama.
Kuidas Patroni töötab koos Consuliga
Meil on Consul klaster, mis koosneb kolmest sĂ”lmest ja Patroni klaster, mis koosneb ĂŒlemast ja replikast (Patronis nimetatakse meistrit klastrite ĂŒlemaks ja koopiaid replikateks). Iga Patroni klastrite instants saadab pidevalt Consulile teavet klastrite oleku kohta. SeetĂ”ttu on Consul'is alati vĂ”imalik teada saada hetke Patroni klastrite konfiguratsiooni ja kes on antud hetkel ĂŒlem.

Patroni ĂŒhendamiseks Consuliga piisab ametliku dokumentatsiooni uurimisest, kus on kirjas, et tuleb nĂ€idata hosti http vĂ”i https formaadis, olenevalt meie tööviisist Consuliga, ja ĂŒhenduse skeemi, valikuline:
host: Consul'i lÔpp-punkti host:port, formaadis: http(s)://host:port
scheme: (valikuline) http vĂ”i https, vaikevÀÀrtuseks on httpSee tundub lihtne, kuid siin algavad probleemid. Consul'iga töötame kaitstud ĂŒhenduse kaudu https kaudu ja meie ĂŒhenduse konfigureerimine nĂ€eb vĂ€lja jĂ€rgmine:
consul:
host: https://server.production.consul:8080
verify: true
cacert: {{ consul_cacert }}
cert: {{ consul_cert }}
key: {{ consul_key }}Kuid see ei tööta. Patroni kĂ€ivitamisel ei saa see Consul'iga ĂŒhendust, sest ta proovib ikkagi minna http kaudu.
Probleemi lahendamine osutus annetatud Patroni lÀhtekoodiks. Hea, et see on kirjutatud python'is. Selgub, et parameetrit host ei parsita, vaid protokoll tuleb nÀidata skeemis. Nii nÀeb vÀlja töötav konfiguratsiooniblokk Consul'iga töötamiseks meie jaoks:
consul:
host: server.production.consul:8080
scheme: https
verify: true
cacert: {{ consul_cacert }}
cert: {{ consul_cert }}
key: {{ consul_key }}Consul-template
Nii, me oleme valinud konfiguratsioonide mahuti. NĂŒĂŒd tuleb mĂ”ista, kuidas PgBouncer muudab oma konfiguratsiooni, kui Patroni klastris liider vahetub. Selle kohta dokumentatsioonis vastust ei leidu, kuna PgBouncer'i kasutamine ei ole seal pĂ”hjalikult kirjeldatud.
Lahendust otsides leidsime artikli (pealkirja, kahjuks, ei mÀleta), kus kirjutati, et Consul-template aitas vÀga hÀsti PgBouncer'i ja Patroni vahel. See suunaski meid uurima Consul-template'i tööd.
Selgus, et Consul-template jÀlgib pidevalt PostgreSQL klastri konfiguratsiooni Consulis. Liidri vahetamisel uuendab ta PgBouncer'i konfiguratsiooni ja saadab kÀsu selle taaskÀivitamiseks.

Suur pluss template'i juures on see, et see on salvestatud koodina, seega on uue shardi lisamisel piisav teha uus commit ja automaatse protsessiga template uuendada, toetades Infrastructure as Code pÔhimÔtet.
Uus arhitektuur Patroniga
Tulemuseks saime jÀrgmise tööskeemi:

KĂ”ik rakenduse serverid pöörduvad tasakaalustaja poole â selle taga on kaks PgBouncer'i instantsi â igal instantsil töötab Consul-template, mis jĂ€lgib iga Patroni klastri olekut ja hoolitseb PgBouncer'i konfi ajakohasuse eest, suunates pĂ€ringud iga klastri aktiivsele liidrile.
KĂ€sitsi testimine
Enne tootmist lĂ”puleviimist kĂ€ivitasime selle skeemi vĂ€ikeses testkeskkonnas ja kontrollisime automaatse vahetamise toimimist. Avastasime tahvli, liikusime kleebise ĂŒmber ja samal ajal 'tapsime' klastri liidri. AWS-is piisab selleks instantsi konsoliga vĂ€lja lĂŒlitamisest.

Kleebis naases 10-20 sekundi jooksul tagasi, ja seejÀrel hakkas uuesti normaalselt liikuma. See tÀhendab, et Patroni klaster tegutses Ôigesti: vahetas liidri, edastas teabe Consulisse ja Consul-template haaras kohe selle teabe, asendas PgBouncer'i konfiguratsiooni ja saatis reload kÀsu.
Kuidas ellu jÀÀda kÔrge koormuse all ja hoida minimaalset seisuaja?
KĂ”ik töötab suurepĂ€raselt! Ent tekivad uued kĂŒsimused: Kuidas see töötab kĂ”rge koormuse all? Kuidas kiiresti ja ohutult kĂ”ik tootmisse viia?
Esimesele kĂŒsimusele vastamiseks aitab meid testkeskkond, kus viime lĂ€bi koormustestimise. See on tĂ€ielikult identne tootmisuuendusele arhitektuurilt ja sisaldab genereeritud testandmeid, mille maht on ligikaudu sama kui tootmises. Me otsustame lihtsalt 'tappa' ĂŒhe PostgreSQL meistritest testimise ajal ja vaadata, mis juhtub. Kuid enne seda on oluline kontrollida automaatset ĂŒmberpaigutamist, kuna sellel keskkonnas on meil mitu PostgreSQL shard'i, seega saame suurepĂ€rase konfigureerimisskriptide testimise enne tootmist.
MĂ”lemad ĂŒlesanded nĂ€evad ambitsioonikad vĂ€lja, kuid meil on PostgreSQL 9.6. Kas me vĂ”iks kohe 11.2 versioonile ĂŒle minna?
Otsustame teha seda kahes etapis: esmalt uuendame versiooni 11.2 peale, seejÀrel kÀivitame Patroni.
PostgreSQL uuendamine
PostgreSQL versiooni kiireks uuendamiseks tuleb kasutada valikut -k, mille puhul luuakse kĂ”vakettale hard link ja teie andmete kopeerimine ei ole vajalik. 300â400 GB suuruste andmebaaside puhul kestab uuendamine 1 sekund.
Meil on palju shard'e, seega peab uuendamine toimuma automaatselt. Selleks oleme kirjutanud Ansible playbook'i, mis teostab kogu uuendamise protsessi meie eest:
/usr/lib/postgresql/11/bin/pg_upgrade
<b>--link </b>
--old-datadir='' --new-datadir=''
--old-bindir='' --new-bindir=''
--old-options=' -c config_file='
--new-options=' -c config_file='Siinkohal on oluline mĂ€rkida, et enne uuenduse kĂ€ivitamist tuleb see teha parameetriga âcheck, et olla kindel uuenduse vĂ”imalikuses. Samuti meie skript asendab konfiguratsioone uuenduse ajaks. Meie skript tĂ€itis ĂŒlesande 30 sekundiga, see on suurepĂ€rane tulemus.
Patroni kÀivitamine
Teise probleemi lahendamiseks piisab Patroni konfiguratsiooni vaatamisest. Ametlikus hoidlas on olemas nÀidiskonfiguratsioon koos initdb'ga, mis vastutab uue andmebaasi initsialiseerimise eest Patroni esmakordsel kÀivitamisel. Kuid kuna meil on juba valmis andmebaas, siis lihtsalt kustutasime selle osa konfiguratsioonist.
Kui me hakkasime Patroni installima juba olemasolevale PostgreSQL klastrile ja seda kÀivitama, siis kokku puutusime uue probleemiga: mÔlemad serverid kÀivitusid juhtidena. Patroni ei tea klastrite varasemast olekust ja proovib kÀivitada mÔlemat serverit kui kahte eraldi klastri samu nimesid. Selle probleemi lahendamiseks on vajalik kustutada slave'i andmed direktorium:
rm -rf /var/lib/postgresql/Seda tuleb teha ainult slave'il!
Puhta replika ĂŒhendamisel teeb Patroni basebackup'i juhist ja taastab selle replikale, seejĂ€rel hoiab see ajakohast seisundit wal-logide kaudu.
Veel raskusi, millega silmitsi seisime, oli see, et kÔik PostgreSQL klastrid on vaikimisi nimega main. Kui iga klaster ei tea teistest, siis on kÔik korras. Kuid kui soovite kasutada Patronit, peavad kÔik klastrid omama ainulaadset nime. Lahendus on muuta PostgreSQL konfiguratsioonis klastri nime.
Koormustest
LĂ€ksime testima, simuleerides kasutajate tööd foorumites. Kui koormus jĂ”udis meie keskmisele pĂ€evasele tasemele, kordasime tĂ€pselt sama testi, kus katkestasime ĂŒhe instance'i, millel oli PostgreSQL juht. Automaatne failover toimis ootuspĂ€raselt: Patron vahetas juhti, Consul-template uuendas PgBounceri konfiguratsiooni ja saatis reload-kĂ€su. Meie Grafanas olevad graafikud nĂ€itasid, et esines 20-30 sekundi viivitusi ja mĂ”ningaid vigu serveritest, mis olid seotud andmebaasi ĂŒhendamisega. See on normaalne olukord, sellised nĂ€itajad on meie failoveri jaoks vastuvĂ”etavad ja kindlasti parem kui teenuse seiskumine.
Patroni kÀitamine tootmises
KokkuvÔttes saime jÀrgmise plaani:
- Consul-template'i paigaldamine PgBounceri serveritesse ja kÀivitamine;
- PostgreSQL vÀrskendamine versioonile 11.2;
- Klastri nime muutmine;
- Patroni klastri kÀivitamine.
Samas vÔimaldab meie skeem teha esimese punkti praktiliselt igal ajal, saame jÀrjestikku iga PgBounceri töölt eemaldada ja teha selle jaoks Consul-template'i paigaldamise ja kÀivitamise. Just seda me tegime.
Kiireks juurutamiseks kasutasime Ansible'i, kuna kĂ”ik playbookid olime juba testkeskkonnas kontrollinud, ning kogu stsenaariumi tĂ€itmise aeg oli iga shard'i jaoks 1,5 kuni 2 minutit. Saime kĂ”ik jĂ€rjestikku igale shard'ile juurutada ilma meie teenuse seiskamiseta, kuid pidime iga PostgreSQL mĂ”neks minutiks vĂ€lja lĂŒlitama. Sel juhul ei saaks kasutajad, kelle andmed on sellel shard'il, samaaegselt töötada, mis meie jaoks pole vastuvĂ”etav.
Situatsioonist pÀÀsemiseks toimus planeeritud hooldus, mis meil toimub iga 3 kuu tagant. See on aeg, mil teeme tĂ€iesti vĂ€lja meie teenuse ning uuendame andmebaasi instantsid. JÀÀnud oli nĂ€dal jĂ€rgmise aknani ja otsustasime lihtsalt oodata ning valmistuda. Ootamise ajal tegime tĂ€iendavaid ettevaatusabinĂ”usid: iga PostgreSQL shard'i jaoks tĂ”ime ĂŒles varureplika juhuks, kui midagi lĂ€heks valesti, et sĂ€ilitada viimaseid andmeid, ja lisasime iga shardi jaoks uue instantsi, millest peaks saama uus replik Patroni klastris, et mitte tĂ€ita kĂ€su andmete kustutamiseks. See kĂ”ik aitas minimeerida vea riski.

TaaskÀivitame oma teenuse, kÔik töötas nagu peab, kasutajad jÀtkasid tööd, kuid graafikutel mÀrkasime ebanormaalset kÔrget koormust Consul-serveritele.

Miks me ei nĂ€inud seda testkeskkonnas? See probleem illustreerib vĂ€ga hĂ€sti, et on vajalik jĂ€rgida infrastruktuuri kui koodi pĂ”himĂ”tet ja tĂ€iendada kogu infrastruktuuri alates testkeskkondadest kuni tootmiseni. Vastasel juhul on vĂ€ga lihtne sattuda sellisesse probleemisse nagu meil. Mis juhtus? Consul ilmus esmalt tootmisesse ja alles sitten testkeskkondades, mille tulemusena testkeskkondade versioon Consulist oli kĂ”rgem kui tootmises. Ăhes versioonide vĂ€ljaandes lahendati CPU leke, kui töötati consul-template'iga. SeetĂ”ttu uuendusime lihtsalt Consulit, lahendades nii probleemi.
TaaskÀivita Patroni klaster
Kuid me sattusime uude probleemisse, millest me isegi ei kahtlustanud. Consuli uuendamise kĂ€igus kustutame lihtsalt Consuli sĂ”lme klastrist kĂ€suga consul leave â Patroni ĂŒhendub teise Consul-serveriga â kĂ”ik töötab. Kuid kui jĂ”udsime viimase instantsi Consuli klastrisse ja saatasime talle kĂ€su consul leave, taaskĂ€ivitusid kĂ”ik Patroni klastrid ja logides nĂ€gime jĂ€rgmist viga:
VIGA: get_cluster
Jälgimine (viimane kutse viimasena):
...
RetryFailedError: 'Ületatud korduse tähtaeg'
VIGA: Viga suhtlemisel DCS-iga
<b>LOG: andmebaasisüsteem on välja lülitatud</b>Patroni klaster ei suutnud saada teavet oma klastri kohta ja taaskĂ€ivitati.
Lahenduse leidmiseks pöördusime Patroni autorite poole GitHubi kaudu. Nad soovitasid meie konfiguratsioonifailide tÀiustusi:
consul:
consul.checks: []
bootstrap:
dcs:
retry_timeout: 8Me suutsime probleemi testkeskkonnas uuesti esitada ja testisime seal neid parameetreid, kuid kahjuks need ei toiminud.
Probleem jÀÀb endiselt lahendamata. Planeerime proovida jÀrgmisi lahendusi:
- Kasutada Consul-agent'i igas Patroni klastris asuvas instantsis;
- Parandada probleem koodis.
Meile on teada vea tekkimise koht: tĂ”enĂ€oliselt on probleem default timeout'i kasutamises, mida ei ĂŒmbersĂ”ideta konfiguratsioonifailis. Kui viimane Consul server eemaldatakse klastri seest, jÀÀb kogu Consul-klaster hanguma, mis kestab kauem kui sekund, mistĂ”ttu ei saa Patroni klastri seisundit mÀÀrata ja kĂ€ivitab kogu klastri tĂ€ielikult uuesti.
Ănneks ei ole me kokku puutunud millegi muuga, mis viga tekitaks.
Patroni kasutamise tulemused
PĂ€rast Patroni edukat kĂ€ivitamist lisasime igasse klastrisse ĂŒhe tĂ€iendava replitseerimise. NĂŒĂŒd on igas klastris mingi kuorum: ĂŒks juht ja kaks replitseerimist, et tagada ohutus split-braini korral vahetamise ajal.

Tootmises on Patroni töötanud ĂŒle kolme kuu. Selle aja jooksul on see meid juba aidanud. Hiljuti suri AWS-is ĂŒhe klastri juht, automaatne failover toimis ja kasutajad jĂ€tkasid tööd. Patroni tĂ€itis oma peamist ĂŒlesannet.
VÀike kokkuvÔte Patroni kasutamisest:
- Konfiguratsiooni muutmise mugavus. Piisab konfiguratsiooni muutmisest ĂŒhel instantsil ja see tĂ”mmatakse kogu klastrisse. Kui uue konfiguratsiooni rakendamiseks on vajalik taaskĂ€ivitamine, siis Patroni annab sellest teada. Patroni saab kogu klastrit taaskĂ€ivitada ĂŒhe kĂ€suga, mis on samuti vĂ€ga mugav.
- Automaatne failover töötab ja on meid juba aidanud.
- PostgreSQL uuendamine ilma rakenduse seisaku. Esiteks tuleb uuendada replitseerimise uus versioon, seejÀrel vahetada klastri Patronis juht ja uuendada vana juhti. Sellega kaasneb vajalik automaatse failoveri testimine.
Allikas: habr.com
