Falover Cluster PostgreSQL + Patroni. Eksperyans aplikasyon

Nan atik la mwen pral di w kouman nou te apwoche pwoblèm nan tolerans fay PostgreSQL, poukisa li te vin enpòtan pou nou ak sa ki te pase nan fen an.

Nou gen yon sèvis trè chaje: 2,5 milyon itilizatè atravè lemond, 50K + itilizatè aktif chak jou. Sèvè yo sitiye nan Amazone nan yon rejyon nan Iland: 100 + diferan sèvè yo toujou ap nan operasyon, nan ki prèske 50 yo ak baz done.

Backend an antye se yon gwo aplikasyon Java monolitik ki kenbe yon koneksyon websocket konstan ak kliyan an. Lè plizyè itilizatè travay sou menm tablo a an menm tan, yo tout wè chanjman yo an tan reyèl, paske nou ekri chak chanjman nan baz done a. Nou gen apeprè 10K demann pou chak segonn nan baz done nou yo. Nan pik chaj nan Redis, nou ekri demann 80-100K pou chak segonn.
Falover Cluster PostgreSQL + Patroni. Eksperyans aplikasyon

Poukisa nou chanje soti nan Redis nan PostgreSQL

Okòmansman, sèvis nou an te travay ak Redis, yon magazen kle-valè ki estoke tout done nan RAM sèvè a.

Avantaj nan Redis:

  1. Gwo vitès repons, paske tout bagay estoke nan memwa;
  2. Fasilite nan backup ak replikasyon.

Dezavantaj Redis pou nou:

  1. Pa gen okenn tranzaksyon reyèl. Nou te eseye simulation yo nan nivo aplikasyon nou an. Malerezman, sa a pa t 'toujou travay byen epi yo mande pou ekri kòd trè konplèks.
  2. Kantite done limite pa kantite memwa. Kòm kantite done ogmante, memwa a ap grandi, epi, nan fen a, nou pral kouri nan karakteristik sa yo nan egzanp yo chwazi a, ki nan AWS mande pou sispann sèvis nou an chanje kalite egzanp lan.
  3. Li nesesè yo toujou ap kenbe yon nivo latansi ki ba, paske. nou gen yon gwo kantite demann. Nivo reta pi bon pou nou se 17-20 ms. Nan yon nivo 30-40 ms, nou jwenn repons long a demann nan aplikasyon nou an ak degradasyon nan sèvis la. Malerezman, sa te rive nou an Septanm 2018, lè youn nan enstans yo ak Redis pou kèk rezon te resevwa latansi 2 fwa plis pase nòmal. Pou rezoud pwoblèm nan, nou sispann sèvis la mitan jounen an pou antretyen ki pa pwograme epi nou ranplase egzanp Redis ki te pwoblematik la.
  4. Li fasil pou jwenn done enkonsistans menm ak ti erè nan kòd la epi pase anpil tan ekri kòd pou korije done sa yo.

Nou te pran an kont dezavantaj yo ak reyalize ke nou bezwen deplase nan yon bagay ki pi pratik, ak tranzaksyon nòmal ak mwens depandans sou latansi. Fè rechèch, analize anpil opsyon epi chwazi PostgreSQL.

Nou te deplase nan yon nouvo baz done pou 1,5 ane deja epi yo te deplase sèlman yon ti pati nan done yo, kidonk kounye a nou ap travay ansanm ak Redis ak PostgreSQL. Plis enfòmasyon sou etap yo nan deplase ak chanje done ant baz done yo ekri nan atik kòlèg mwen an.

Lè nou te kòmanse deplase, aplikasyon nou an te travay dirèkteman ak baz done a epi jwenn aksè nan mèt Redis ak PostgreSQL. Gwoup PostgreSQL la konsiste de yon mèt ak yon kopi ak replikasyon asynchrone. Men ki jan konplo baz done a te sanble:
Falover Cluster PostgreSQL + Patroni. Eksperyans aplikasyon

Aplike PgBouncer

Pandan nou t ap deplase, pwodwi a te devlope tou: kantite itilizatè yo ak kantite sèvè ki te travay ak PostgreSQL ogmante, epi nou te kòmanse manke koneksyon. PostgreSQL kreye yon pwosesis separe pou chak koneksyon ak konsome resous yo. Ou ka ogmante kantite koneksyon jiska yon sèten pwen, otreman gen yon chans jwenn pèfòmans baz done ki pa pi bon. Opsyon ideyal la nan yon sitiyasyon konsa ta dwe chwazi yon manadjè koneksyon ki pral kanpe devan baz la.

Nou te gen de opsyon pou manadjè koneksyon an: Pgpool ak PgBouncer. Men, premye a pa sipòte mòd tranzaksyon nan travay ak baz done a, kidonk nou te chwazi PgBouncer.

Nou mete plan travay sa a: aplikasyon nou an gen aksè a yon sèl PgBouncer, dèyè ki gen mèt PostgreSQL, epi dèyè chak mèt gen yon kopi ak replikasyon asynchrone.
Falover Cluster PostgreSQL + Patroni. Eksperyans aplikasyon

An menm tan an, nou pa t 'kapab estoke tout kantite done nan PostgreSQL ak vitès la nan travay ak baz done a te enpòtan pou nou, kidonk nou te kòmanse sharding PostgreSQL nan nivo aplikasyon an. Konplo ki dekri pi wo a se relativman pratik pou sa a: lè ajoute yon nouvo shard PostgreSQL, li se ase yo mete ajou konfigirasyon an PgBouncer ak aplikasyon an ka imedyatman travay ak nouvo shard la.

PgBouncer failover

Konplo sa a te travay jiska moman kote sèl egzanp PgBouncer la te mouri. Nou nan AWS, kote tout ka ap kouri sou pyès ki nan konpitè ki mouri detanzantan. Nan ka sa yo, egzanp lan tou senpleman deplase nan nouvo pyès ki nan konpitè epi li travay ankò. Sa te rive ak PgBouncer, men li te vin pa disponib. Rezilta sezon otòn sa a se te indisponibilite sèvis nou an pou 25 minit. AWS rekòmande pou itilize redondans bò itilizatè pou sitiyasyon sa yo, ki pa te aplike nan peyi nou an nan moman sa a.

Apre sa, nou seryezman te panse sou tolerans fay nan gwoup PgBouncer ak PostgreSQL, paske yon sitiyasyon menm jan an ka rive ak nenpòt egzanp nan kont AWS nou an.

Nou te konstwi plan tolerans fay PgBouncer jan sa a: tout sèvè aplikasyon jwenn aksè nan Network Load Balancer, dèyè ki gen de PgBouncers. Chak PgBouncer gade menm mèt PostgreSQL nan chak shard. Si yon aksidan egzanp AWS rive ankò, tout trafik yo redireksyon atravè yon lòt PgBouncer. Rezo Load Balancer failover se AWS ki bay.

Konplo sa a fè li fasil pou ajoute nouvo serveurs PgBouncer.
Falover Cluster PostgreSQL + Patroni. Eksperyans aplikasyon

Kreye yon Cluster PostgreSQL Failover

Lè nou rezoud pwoblèm sa a, nou konsidere opsyon diferan: failover ekri pwòp tèt ou, repmgr, AWS RDS, Patroni.

Scripts pwòp tèt ou ekri

Yo ka kontwole travay mèt la epi, si li echwe, ankouraje kopi a bay mèt la epi mete ajou konfigirasyon PgBouncer la.

Avantaj ki genyen nan apwòch sa a se senplisite maksimòm, paske ou ekri Scripts tèt ou epi konprann egzakteman ki jan yo travay.

Kont:

  • Mèt la ta ka pa te mouri, olye de yon echèk rezo a te ka rive. Failover, inyorans sa a, pral ankouraje kopi a bay mèt la, pandan y ap ansyen mèt la ap kontinye travay. Kòm yon rezilta, nou pral jwenn de serveurs nan wòl nan mèt epi nou pa pral konnen kilès nan yo gen dènye done yo ajou. Sitiyasyon sa a yo rele tou split-brain;
  • Nou te rete san repons. Nan konfigirasyon nou an, mèt la ak yon sèl kopi, apre yo fin chanje, kopi a deplase jiska mèt la epi nou pa gen kopi ankò, kidonk nou dwe manyèlman ajoute yon nouvo kopi;
  • Nou bezwen siveyans adisyonèl nan operasyon fayit la, pandan ke nou gen 12 shards PostgreSQL, ki vle di nou dwe kontwole 12 grap. Avèk yon ogmantasyon nan kantite shards, ou dwe sonje tou pou mete ajou failover a.

Oto-ekri failover sanble trè konplike epi li mande sipò ki pa trivial. Avèk yon sèl gwoup PostgreSQL, sa a ta dwe opsyon ki pi fasil, men li pa echèl, kidonk li pa apwopriye pou nou.

Repmgr

Manadjè Replikasyon pou grap PostgreSQL, ki ka jere operasyon yon grap PostgreSQL. An menm tan an, li pa gen yon failover otomatik soti nan bwat la, kidonk pou travay ou pral bezwen ekri pwòp "wrapper" sou tèt solisyon an fini. Se konsa, tout bagay ka vire menm pi konplike pase ak ekriti pwòp tèt ou, kidonk nou pa t 'menm eseye Repmgr.

AWS RDS

Sipòte tout sa nou bezwen, konnen ki jan fè sovgad epi kenbe yon pisin nan koneksyon. Li gen chanjman otomatik: lè mèt la mouri, kopi a vin nouvo mèt la, ak AWS chanje dosye dns nan nouvo mèt la, pandan y ap kopi yo ka lokalize nan diferan AZ.

Dezavantaj yo enkli mank de ajisteman amann. Kòm yon egzanp ajisteman amann: ka nou yo gen restriksyon pou koneksyon tcp, ki, malerezman, pa ka fè nan RDS:

net.ipv4.tcp_keepalive_time=10
net.ipv4.tcp_keepalive_intvl=1
net.ipv4.tcp_keepalive_probes=5
net.ipv4.tcp_retries2=3

Anplis de sa, AWS RDS prèske de fwa pi chè pase pri egzanp regilye a, ki te rezon prensipal pou abandone solisyon sa a.

Patroni

Sa a se yon modèl python pou jere PostgreSQL ak bon dokiman, failover otomatik ak kòd sous sou github.

Avantaj nan Patroni:

  • Chak paramèt konfigirasyon dekri, li klè ki jan li fonksyone;
  • Otomatik failover travay soti nan bwat la;
  • Ekri nan piton, epi piske nou menm nou ekri anpil nan piton, li pral pi fasil pou nou fè fas ak pwoblèm epi, petèt, menm ede devlopman nan pwojè a;
  • Totalman jere PostgreSQL, pèmèt ou chanje konfigirasyon an sou tout nœuds nan gwoup la alafwa, epi si gwoup la bezwen rekòmanse pou aplike nouvo konfigirasyon an, Lè sa a, sa a ka fè ankò lè l sèvi avèk Patroni.

Kont:

  • Li pa klè nan dokiman an ki jan yo travay ak PgBouncer kòrèkteman. Malgre ke li difisil yo rele li yon mwens, paske travay Patroni a se jere PostgreSQL, ak ki jan koneksyon ak Patroni pral ale se deja pwoblèm nou an;
  • Gen kèk egzanp aplikasyon Patroni sou gwo komèsan, pandan y ap gen anpil egzanp aplikasyon nan grate.

Kòm yon rezilta, nou te chwazi Patroni pou kreye yon gwoup failover.

Patroni Aplikasyon Pwosesis

Anvan Patroni, nou te gen 12 shards PostgreSQL nan yon konfigirasyon nan yon sèl mèt ak yon kopi ak replikasyon asynchrone. Sèvè aplikasyon yo te jwenn aksè nan baz done yo atravè Network Load Balancer, dèyè ki te gen de ka ak PgBouncer, ak dèyè yo te tout sèvè PostgreSQL yo.
Falover Cluster PostgreSQL + Patroni. Eksperyans aplikasyon

Pou aplike Patroni, nou te bezwen chwazi yon konfigirasyon gwoup depo distribye. Patroni travay ak sistèm depo konfigirasyon distribye tankou etcd, Zookeeper, Consul. Nou jis gen yon gwoup Konsil konplè sou mache a, ki travay ansanm ak Vault epi nou pa sèvi ak li ankò. Yon gwo rezon pou kòmanse itilize Consul pou objektif li.

Kijan Patroni travay ak Konsil

Nou gen yon gwoup Konsil, ki gen twa nœuds, ak yon gwoup Patroni, ki gen yon lidè ak yon kopi (nan Patroni, mèt la rele lidè gwoup la, epi esklav yo rele kopi). Chak egzanp nan gwoup Patroni a toujou ap voye enfòmasyon sou eta a nan gwoup la bay Konsil. Se poutèt sa, nan Consul ou ka toujou jwenn konfigirasyon aktyèl la nan gwoup Patroni a ak ki moun ki lidè nan moman an.

Falover Cluster PostgreSQL + Patroni. Eksperyans aplikasyon

Pou konekte Patroni ak Konsil, li ase pou etidye dokiman ofisyèl la, ki di ke ou bezwen presize yon lame nan fòma http oswa https, tou depann de fason nou travay ak Konsil, ak konplo koneksyon an, opsyonèlman:

host: the host:port for the Consul endpoint, in format: http(s)://host:port
scheme: (optional) http or https, defaults to http

Li sanble senp, men isit la enkonvenyans yo kòmanse. Avèk Consul, nou travay sou yon koneksyon an sekirite atravè https ak konfigirasyon koneksyon nou an ap sanble sa a:

consul:
  host: https://server.production.consul:8080 
  verify: true
  cacert: {{ consul_cacert }}
  cert: {{ consul_cert }}
  key: {{ consul_key }}

Men sa pa mache. Nan demaraj, Patroni pa ka konekte ak Consul, paske li eseye ale nan http de tout fason.

Kòd sous Patroni te ede fè fas ak pwoblèm nan. Bon bagay li ekri nan piton. Li sanble ke paramèt lame a pa analize nan okenn fason, epi yo dwe espesifye pwotokòl la nan konplo. Men ki jan blòk konfigirasyon travay la pou travay ak Consul sanble pou nou:

consul:
  host: server.production.consul:8080
  scheme: https
  verify: true
  cacert: {{ consul_cacert }}
  cert: {{ consul_cert }}
  key: {{ consul_key }}

konsil-modèl

Se konsa, nou te chwazi depo a pou konfigirasyon an. Koulye a, nou bezwen konprann ki jan PgBouncer pral chanje konfigirasyon li lè li chanje lidè nan gwoup Patroni la. Pa gen repons pou kesyon sa a nan dokiman an, paske. gen, nan prensip, travay ak PgBouncer pa dekri.

Nan rechèch nan yon solisyon, nou te jwenn yon atik (malerezman mwen pa sonje tit la) kote yo te ekri ke Сonsul-modèl te ede anpil nan pè PgBouncer ak Patroni. Sa a te pouse nou mennen ankèt sou fason Konsil-modèl fonksyone.

Li te tounen soti ke Konsil-modèl toujou ap kontwole konfigirasyon an nan gwoup la PostgreSQL nan Consul. Lè lidè a chanje, li mete ajou konfigirasyon PgBouncer la epi li voye yon lòd pou rechaje li.

Falover Cluster PostgreSQL + Patroni. Eksperyans aplikasyon

Yon gwo plis modèl se ke li estoke kòm kòd, kidonk lè w ajoute yon nouvo shard, li ase pou fè yon nouvo komèt epi mete ajou modèl la otomatikman, sipòte Enfrastrikti kòm prensip kòd.

Nouvo achitekti ak Patroni

Kòm yon rezilta, nou te jwenn konplo sa a nan travay:
Falover Cluster PostgreSQL + Patroni. Eksperyans aplikasyon

Tout sèvè aplikasyon yo jwenn aksè nan balans lan → gen de egzanp PgBouncer dèyè li → sou chak egzanp, Konsil-modèl lanse, ki kontwole estati chak gwoup Patroni ak kontwole enpòtans konfigirasyon PgBouncer la, ki voye demann bay lidè aktyèl la. nan chak grap.

Tès manyèl

Nou te kouri konplo sa a anvan lanse li sou yon ti anviwònman tès ak tcheke operasyon an nan otomatik chanje. Yo louvri tablo a, yo deplase fich la, e nan moman sa a yo "touye" lidè gwoup la. Nan AWS, sa a se senp tankou fèmen egzanp lan atravè konsole a.

Falover Cluster PostgreSQL + Patroni. Eksperyans aplikasyon

Fichye a tounen tounen nan 10-20 segonn, ak Lè sa a, ankò yo te kòmanse deplase nòmalman. Sa vle di ke gwoup Patroni a te travay kòrèkteman: li chanje lidè a, li voye enfòmasyon yo bay Сonsul, ak Сonsul-template imedyatman te pran enfòmasyon sa a, ranplase konfigirasyon PgBouncer la epi li te voye lòd la rechaje.

Ki jan yo siviv anba chaj segondè epi kenbe tan an minimòm?

Tout bagay ap travay pafètman! Men, gen nouvo kesyon: Ki jan li pral travay anba gwo chaj? Ki jan yo byen vit ak san danje woule tout bagay nan pwodiksyon?

Anviwònman tès kote nou fè tès chaj la ede nou reponn premye kesyon an. Li konplètman idantik ak pwodiksyon an tèm de achitekti e li te pwodwi done tès ki apeprè egal nan volim ak pwodiksyon an. Nou deside jis "touye" youn nan mèt PostgreSQL yo pandan tès la epi wè sa k ap pase. Men, anvan sa, li enpòtan pou tcheke otomatik woule a, paske sou anviwònman sa a nou gen plizyè shards PostgreSQL, kidonk nou pral jwenn ekselan tès nan scripts konfigirasyon anvan pwodiksyon an.

Tou de travay yo sanble anbisye, men nou gen PostgreSQL 9.6. Èske nou ka imedyatman ajou nan 11.2?

Nou deside fè li nan 2 etap: premye ajou nan 11.2, Lè sa a, lanse Patroni.

PostgreSQL aktyalizasyon

Pou mete ajou vèsyon PostgreSQL la byen vit, sèvi ak opsyon an -k, nan ki lyen difisil yo kreye sou disk epi pa gen okenn bezwen kopye done ou yo. Sou baz 300-400 GB, aktyalizasyon a pran 1 segonn.

Nou gen anpil shards, kidonk aktyalizasyon a bezwen fèt otomatikman. Pou fè sa, nou te ekri yon liv Ansible ki okipe tout pwosesis aktyalizasyon pou nou:

/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='

Li enpòtan sonje isit la ke anvan ou kòmanse ajou a, ou dwe fè li ak paramèt la --tchekepou asire w ou ka ajou. Script nou an tou fè sibstitisyon an nan konfigirasyon pou dire a nan ajou a. Script nou an fini nan 30 segonn, ki se yon rezilta ekselan.

Lanse Patroni

Pou rezoud dezyèm pwoblèm nan, jis gade nan konfigirasyon Patroni la. Repozitwa ofisyèl la gen yon egzanp konfigirasyon ak initdb, ki responsab pou inisyalize yon nouvo baz done lè w kòmanse Patroni. Men, depi nou deja gen yon baz done pare, nou tou senpleman retire seksyon sa a nan konfigirasyon an.

Lè nou te kòmanse enstale Patroni sou yon gwoup PostgreSQL ki deja egziste epi kouri li, nou te rankontre yon nouvo pwoblèm: tou de serveurs te kòmanse kòm yon lidè. Patroni pa konnen anyen sou eta a byen bonè nan gwoup la epi li eseye kòmanse tou de sèvè kòm de grap separe ak menm non an. Pou rezoud pwoblèm sa a, ou bezwen efase anyè a ak done sou esklav la:

rm -rf /var/lib/postgresql/

Sa a bezwen fè sèlman sou esklav la!

Lè yon kopi pwòp konekte, Patroni fè yon lidè basebackup epi restore li nan kopi a, epi Lè sa a, kenbe ak eta aktyèl la dapre wal journaux yo.

Yon lòt difikilte nou rankontre se ke tout gwoup PostgreSQL yo rele prensipal pa default. Lè chak gwoup pa konnen anyen sou lòt la, sa a nòmal. Men, lè ou vle sèvi ak Patroni, Lè sa a, tout grap dwe gen yon non inik. Solisyon an se chanje non gwoup la nan konfigirasyon PostgreSQL la.

tès chaj

Nou te lanse yon tès ki simulation eksperyans itilizatè sou tablo. Lè chaj la rive nan valè mwayèn chak jou nou an, nou repete egzakteman menm tès la, nou fèmen yon egzanp ak lidè PostgreSQL la. Fayit otomatik la te travay jan nou te espere: Patroni chanje lidè a, Consul-model mete ajou konfigirasyon PgBouncer la epi voye yon lòd pou rechaje. Dapre graf nou yo nan Grafana, li te klè ke gen reta nan 20-30 segonn ak yon ti kantite erè nan serveurs yo ki asosye ak koneksyon an nan baz done a. Sa a se yon sitiyasyon nòmal, valè sa yo akseptab pou failover nou an epi yo definitivman pi bon pase tan an sèvis.

Pote Patroni nan pwodiksyon an

Kòm rezilta, nou te vini ak plan sa a:

  • Deplwaye Konsil-modèl sou sèvè PgBouncer ak lanse;
  • PostgreSQL mizajou nan vèsyon 11.2;
  • Chanje non gwoup la;
  • Kòmanse Patroni Cluster la.

An menm tan an, konplo nou an pèmèt nou fè premye pwen an prèske nenpòt ki lè, nou ka retire chak PgBouncer nan travay nan vire epi deplwaye epi kouri konsil-modèl sou li. Se konsa, nou te fè.

Pou deplwaman rapid, nou te itilize Ansible, paske nou te deja teste tout liv yo sou yon anviwònman tès, ak tan an ekzekisyon nan script konplè a te soti nan 1,5 a 2 minit pou chak shard. Nou ta ka woule tout bagay nan vire nan chak shard san yo pa sispann sèvis nou an, men nou ta dwe fèmen chak PostgreSQL pou plizyè minit. Nan ka sa a, itilizatè ki gen done yo sou shard sa a pa t 'kapab travay konplètman nan moman sa a, e sa a se akseptab pou nou.

Wout la soti nan sitiyasyon sa a se antretyen an te planifye, ki fèt chak 3 mwa. Sa a se yon fenèt pou travay pwograme, lè nou konplètman fèmen sèvis nou yo ak ajou ka baz done nou an. Te gen yon semèn ki rete jiska pwochen fenèt la, epi nou deside jis tann ak prepare pi lwen. Pandan tan ap tann la, nou te asire tèt nou anplis: pou chak shard PostgreSQL, nou te ogmante yon kopi rezèv si nou ta pa kenbe dènye done yo, epi ajoute yon nouvo egzanp pou chak shard, ki ta dwe vin tounen yon nouvo kopi nan gwoup Patroni la, pou yo pa egzekite yon lòd pou efase done . Tout bagay sa yo te ede pou minimize risk erè.
Falover Cluster PostgreSQL + Patroni. Eksperyans aplikasyon

Nou rekòmanse sèvis nou an, tout bagay te travay jan li ta dwe, itilizatè yo te kontinye travay, men sou graf yo nou remake yon chaj anòmal wo sou sèvè Konsil yo.
Falover Cluster PostgreSQL + Patroni. Eksperyans aplikasyon

Poukisa nou pa t 'wè sa a nan anviwònman tès la? Pwoblèm sa a montre trè byen ke li nesesè pou swiv Enfrastrikti kòm prensip kòd epi rafine tout enfrastrikti a, soti nan anviwònman tès yo rive nan pwodiksyon an. Sinon, li trè fasil jwenn pwoblèm nan nou te resevwa. sak pase? Konsil premye parèt sou pwodiksyon, ak Lè sa a, sou anviwònman tès, kòm yon rezilta, sou anviwònman tès, vèsyon an nan Konsil te pi wo pase sou pwodiksyon an. Jis nan youn nan degaje yo, yon fuit CPU te rezoud lè w ap travay ak konsil-modèl. Se poutèt sa, nou tou senpleman mete ajou Konsil, konsa rezoud pwoblèm nan.

Rekòmanse gwoup Patroni

Sepandan, nou te resevwa yon nouvo pwoblèm, ki nou pa t 'menm sispèk. Lè n ap mete ajou Konsil la, nou tou senpleman retire nœud Konsil la nan gwoup la lè l sèvi avèk lòd kite konsil la → Patroni konekte ak yon lòt sèvè Konsil → tout bagay ap mache. Men, lè nou te rive nan dènye egzanp gwoup Konsil la epi nou te voye lòd konje konsil la ba li, tout gwoup Patroni yo te senpleman rekòmanse, epi nan jounal yo nou te wè erè sa a:

ERROR: get_cluster
Traceback (most recent call last):
...
RetryFailedError: 'Exceeded retry deadline'
ERROR: Error communicating with DCS
<b>LOG: database system is shut down</b>

Gwoup Patroni a pa t kapab rekipere enfòmasyon sou gwoup li a epi li te rekòmanse.

Pou jwenn yon solisyon, nou kontakte otè Patroni yo atravè yon pwoblèm sou github. Yo sijere amelyorasyon nan dosye konfigirasyon nou yo:

consul:
 consul.checks: []
bootstrap:
 dcs:
   retry_timeout: 8

Nou te kapab repwodui pwoblèm nan sou yon anviwònman tès epi teste opsyon sa yo la, men malerezman yo pa t travay.

Pwoblèm nan toujou rete san rezoud. Nou planifye pou eseye solisyon sa yo:

  • Sèvi ak Konsil-ajan sou chak egzanp gwoup Patroni;
  • Ranje pwoblèm nan nan kòd la.

Nou konprann ki kote erè a te fèt: pwoblèm nan se pwobableman itilize nan delè default, ki pa pase sou plas nan fichye a konfigirasyon. Lè yo retire dènye sèvè Konsil la nan gwoup la, tout gwoup Konsil la pandye pou plis pase yon segonn, poutèt sa, Patroni pa ka jwenn estati gwoup la epi rekòmanse tout gwoup la nèt.

Erezman, nou pa t rankontre okenn erè ankò.

Rezilta itilize Patroni

Apre lansman siksè Patroni, nou te ajoute yon kopi adisyonèl nan chak gwoup. Koulye a, nan chak gwoup gen yon sanblab nan yon kowòm: yon lidè ak de kopi, pou rezo sekirite nan ka fann-sèvo lè chanje.
Falover Cluster PostgreSQL + Patroni. Eksperyans aplikasyon

Patroni te travay sou pwodiksyon pou plis pase twa mwa. Pandan tan sa a, li te deja jere ede nou soti. Dènyèman, lidè youn nan grap yo te mouri nan AWS, echèk otomatik te travay epi itilizatè yo te kontinye travay. Patroni te akonpli travay prensipal li.

Yon ti rezime sou itilizasyon Patroni:

  • Fasilite nan chanjman konfigirasyon. Li ase pou chanje konfigirasyon an sou yon sèl egzanp epi li pral rale jiska tout gwoup la. Si yon rdemare oblije aplike nouvo konfigirasyon an, Lè sa a, Patroni ap fè w konnen. Patroni ka rekòmanse tout gwoup la ak yon sèl kòmand, ki se tou trè pratik.
  • Otomatik failover travay e li deja jere ede nou soti.
  • PostgreSQL aktyalizasyon san D' aplikasyon an. Ou dwe premye mete ajou kopi yo nan nouvo vèsyon an, Lè sa a, chanje lidè nan gwoup Patroni a ak mete ajou ansyen lidè a. Nan ka sa a, tès ki nesesè nan failover otomatik rive.

Sous: www.habr.com

Add nouvo kòmantè