Iṣupọ Failover PostgreSQL + Patroni. iriri imuse

Ninu nkan naa Emi yoo sọ fun ọ bi a ṣe sunmọ ọran ti ifarada ẹbi PostgreSQL, idi ti o ṣe pataki fun wa ati ohun ti o ṣẹlẹ ni ipari.

A ni iṣẹ ti kojọpọ pupọ: awọn olumulo miliọnu 2,5 ni kariaye, awọn olumulo 50K+ ti nṣiṣe lọwọ lojoojumọ. Awọn olupin wa ni Amazone ni agbegbe kan ti Ireland: 100+ awọn olupin oriṣiriṣi wa ni iṣẹ nigbagbogbo, eyiti o fẹrẹ jẹ 50 pẹlu awọn apoti isura data.

Gbogbo ẹhin jẹ ohun elo Java monolithic stateful nla ti o tọju asopọ oju opo wẹẹbu igbagbogbo pẹlu alabara. Nigbati ọpọlọpọ awọn olumulo ṣiṣẹ lori igbimọ kanna ni akoko kanna, gbogbo wọn rii awọn ayipada ni akoko gidi, nitori a kọ iyipada kọọkan si ibi ipamọ data. A ni nipa awọn ibeere 10K fun iṣẹju-aaya si awọn data data wa. Ni fifuye tente oke ni Redis, a kọ awọn ibeere 80-100K fun iṣẹju kan.
Iṣupọ Failover PostgreSQL + Patroni. iriri imuse

Kini idi ti a yipada lati Redis si PostgreSQL

Ni ibẹrẹ, iṣẹ wa ṣiṣẹ pẹlu Redis, ile itaja iyeye bọtini kan ti o tọju gbogbo data sinu Ramu olupin naa.

Awọn anfani ti Redis:

  1. Iyara esi giga, nitori ohun gbogbo ti wa ni ipamọ ni iranti;
  2. Irọrun ti afẹyinti ati ẹda.

Awọn konsi ti Redis fun wa:

  1. Ko si awọn iṣowo gidi. A gbiyanju lati ṣe afiwe wọn ni ipele ti ohun elo wa. Laanu, eyi ko ṣiṣẹ daradara nigbagbogbo ati pe o nilo kikọ koodu eka pupọ.
  2. Iye data ti wa ni opin nipasẹ iye iranti. Bi iye data ti n pọ si, iranti yoo dagba, ati, ni ipari, a yoo ṣiṣẹ sinu awọn abuda ti apẹẹrẹ ti o yan, eyiti o wa ninu AWS nilo idaduro iṣẹ wa lati yi iru apẹẹrẹ pada.
  3. O jẹ dandan lati ṣetọju ipele lairi kekere nigbagbogbo, nitori. a ni nọmba ti o tobi pupọ ti awọn ibeere. Ipele idaduro to dara julọ fun wa jẹ 17-20 ms. Ni ipele 30-40 ms, a gba awọn idahun gigun si awọn ibeere lati ohun elo wa ati ibajẹ iṣẹ naa. Laanu, eyi ṣẹlẹ si wa ni Oṣu Kẹsan ọdun 2018, nigbati ọkan ninu awọn iṣẹlẹ pẹlu Redis fun idi kan gba lairi 2 igba diẹ sii ju igbagbogbo lọ. Lati yanju ọran naa, a da iṣẹ naa duro ni aarin-ọjọ fun itọju ti a ko ṣeto ati rọpo apẹẹrẹ Redis iṣoro naa.
  4. O rọrun lati gba aiṣedeede data paapaa pẹlu awọn aṣiṣe kekere ninu koodu ati lẹhinna lo akoko pupọ kikọ koodu lati ṣatunṣe data yii.

A ṣe akiyesi awọn konsi ati rii pe a nilo lati gbe si nkan ti o rọrun diẹ sii, pẹlu awọn iṣowo deede ati igbẹkẹle ti o kere si lairi. Iwadi ti a ṣe, ṣe itupalẹ ọpọlọpọ awọn aṣayan ati yan PostgreSQL.

A ti nlọ si ibi ipamọ data tuntun fun ọdun 1,5 tẹlẹ ati pe o ti gbe apakan kekere ti data naa, nitorinaa a n ṣiṣẹ ni nigbakannaa pẹlu Redis ati PostgreSQL. Alaye diẹ sii nipa awọn ipele ti gbigbe ati yi pada data laarin awọn apoti isura infomesonu ti kọ sinu ìwé ẹlẹgbẹ mi.

Nigba ti a kọkọ bẹrẹ gbigbe, ohun elo wa ṣiṣẹ taara pẹlu ibi ipamọ data ati wọle si oluwa Redis ati PostgreSQL. Iṣupọ PostgreSQL ni titunto si ati ẹda kan pẹlu ẹda asynchronous. Eyi ni bi ero data data ṣe dabi:
Iṣupọ Failover PostgreSQL + Patroni. iriri imuse

Ṣiṣe PgBouncer

Lakoko ti a nlọ, ọja naa tun n dagbasoke: nọmba awọn olumulo ati nọmba awọn olupin ti o ṣiṣẹ pẹlu PostgreSQL pọ si, ati pe a bẹrẹ si ni aini awọn asopọ. PostgreSQL ṣẹda ilana ti o yatọ fun asopọ kọọkan ati pe o nlo awọn orisun. O le mu nọmba awọn asopọ pọ si aaye kan, bibẹẹkọ aye wa lati gba iṣẹ data suboptimal. Aṣayan ti o dara julọ ni iru ipo bẹẹ yoo jẹ lati yan oluṣakoso asopọ ti yoo duro ni iwaju ipilẹ.

A ni awọn aṣayan meji fun oluṣakoso asopọ: Pgpool ati PgBouncer. Ṣugbọn akọkọ ko ṣe atilẹyin ipo iṣowo ti ṣiṣẹ pẹlu data data, nitorinaa a yan PgBouncer.

A ti ṣeto eto iṣẹ atẹle: ohun elo wa wọle si PgBouncer kan, lẹhin eyiti o jẹ awọn ọga PostgreSQL, ati lẹhin oluwa kọọkan jẹ ẹda kan pẹlu ẹda asynchronous.
Iṣupọ Failover PostgreSQL + Patroni. iriri imuse

Ni akoko kanna, a ko le fipamọ gbogbo iye data ni PostgreSQL ati iyara ti ṣiṣẹ pẹlu data jẹ pataki fun wa, nitorinaa a bẹrẹ sharding PostgreSQL ni ipele ohun elo. Eto ti a ṣalaye loke jẹ irọrun diẹ fun eyi: nigbati o ba ṣafikun shard PostgreSQL tuntun, o to lati ṣe imudojuiwọn iṣeto PgBouncer ati pe ohun elo le ṣiṣẹ lẹsẹkẹsẹ pẹlu shard tuntun.

PgBouncer ikuna

Eto yii ṣiṣẹ titi di akoko ti apẹẹrẹ PgBouncer nikan ku. A wa ni AWS, nibiti gbogbo awọn iṣẹlẹ n ṣiṣẹ lori ohun elo ti o ku lorekore. Ni iru awọn ọran bẹ, apẹẹrẹ kan gbe lọ si ohun elo tuntun ati ṣiṣẹ lẹẹkansi. Eyi ṣẹlẹ pẹlu PgBouncer, ṣugbọn ko si. Abajade isubu yii jẹ aini wiwa iṣẹ wa fun iṣẹju 25. AWS ṣeduro lilo ipadasẹhin ẹgbẹ olumulo fun iru awọn ipo, eyiti ko ṣe imuse ni orilẹ-ede wa ni akoko yẹn.

Lẹhin iyẹn, a ronu ni pataki nipa ifarada ẹbi ti PgBouncer ati awọn iṣupọ PostgreSQL, nitori iru ipo kan le ṣẹlẹ pẹlu apẹẹrẹ eyikeyi ninu akọọlẹ AWS wa.

A kọ ero ifarada ẹbi PgBouncer gẹgẹbi atẹle: gbogbo awọn olupin ohun elo wọle si Balancer Load Network, lẹhin eyiti awọn PgBouncers meji wa. PgBouncer kọọkan n wo oluwa PostgreSQL kanna ti shard kọọkan. Ti jamba AWS kan ba tun waye lẹẹkansi, gbogbo ijabọ ni a darí nipasẹ PgBouncer miiran. Ibaṣepọ Iwontunws.funfun Nẹtiwọọki ti pese nipasẹ AWS.

Eto yii jẹ ki o rọrun lati ṣafikun awọn olupin PgBouncer tuntun.
Iṣupọ Failover PostgreSQL + Patroni. iriri imuse

Ṣẹda Iṣupọ Ikuna PostgreSQL

Nigbati o ba yanju iṣoro yii, a ṣe akiyesi awọn aṣayan oriṣiriṣi: ikuna ti ara ẹni ti a kọ, repmgr, AWS RDS, Patroni.

Awọn iwe afọwọkọ ti ara ẹni

Wọn le ṣe atẹle iṣẹ ti oluwa ati, ni ọran ti ikuna rẹ, ṣe agbega ajọra si oluwa ati ṣe imudojuiwọn iṣeto PgBouncer.

Awọn anfani ti ọna yii jẹ ayedero ti o pọju, nitori pe o kọ awọn iwe afọwọkọ funrararẹ ati loye gangan bi wọn ṣe n ṣiṣẹ.

Konsi:

  • Olori le ma ti ku, dipo ikuna nẹtiwọọki kan le ti ṣẹlẹ. Failover, ko mọ eyi, yoo ṣe agbega ẹda si oluwa, lakoko ti oluwa atijọ yoo tẹsiwaju lati ṣiṣẹ. Bi abajade, a yoo gba awọn olupin meji ni ipa ti titunto si ati pe a ko ni mọ eyi ti wọn ni data imudojuiwọn tuntun. Ipo yii tun ni a npe ni pipin-ọpọlọ;
  • A fi wa silẹ laisi esi. Ninu iṣeto wa, titunto si ati ẹda kan, lẹhin yiyi pada, ẹda naa n gbe soke si oluwa ati pe a ko ni awọn ẹda mọ, nitorina a ni lati fi ẹda tuntun kun pẹlu ọwọ;
  • A nilo afikun ibojuwo ti iṣẹ ikuna, lakoko ti a ni 12 PostgreSQL shards, eyiti o tumọ si pe a ni lati ṣe atẹle awọn iṣupọ 12. Pẹlu ilosoke ninu nọmba awọn shards, o gbọdọ tun ranti lati ṣe imudojuiwọn ikuna naa.

Ikuna-kikọ ti ara ẹni dabi idiju pupọ ati pe o nilo atilẹyin ti kii ṣe bintin. Pẹlu iṣupọ PostgreSQL kan, eyi yoo jẹ aṣayan ti o rọrun julọ, ṣugbọn ko ṣe iwọn, nitorinaa ko dara fun wa.

Repmgr

Oluṣakoso Atunṣe fun awọn iṣupọ PostgreSQL, eyiti o le ṣakoso iṣẹ ti iṣupọ PostgreSQL kan. Ni akoko kanna, ko ni ikuna aifọwọyi lati inu apoti, nitorina fun iṣẹ iwọ yoo nilo lati kọ "apapọ" ti ara rẹ lori oke ojutu ti o pari. Nitorinaa ohun gbogbo le yipada paapaa idiju ju pẹlu awọn iwe afọwọkọ ti ara ẹni, nitorinaa a ko paapaa gbiyanju Repmgr.

Aws RDS

Ṣe atilẹyin ohun gbogbo ti a nilo, mọ bi a ṣe le ṣe awọn afẹyinti ati ṣetọju adagun awọn asopọ. O ni iyipada laifọwọyi: nigbati oluwa ba kú, ẹda naa di titunto si titun, ati AWS ṣe iyipada igbasilẹ dns si titunto si titun, nigba ti awọn ẹda le wa ni orisirisi awọn AZ.

Awọn alailanfani pẹlu aini awọn atunṣe to dara. Gẹgẹbi apẹẹrẹ ti atunṣe to dara: awọn apẹẹrẹ wa ni awọn ihamọ fun awọn asopọ tcp, eyiti, laanu, ko ṣee ṣe ni RDS:

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

Ni afikun, AWS RDS fẹrẹẹ lemeji bi idiyele bi idiyele apẹẹrẹ deede, eyiti o jẹ idi akọkọ fun fifisilẹ ojutu yii.

Patroni

Eyi jẹ awoṣe Python fun iṣakoso PostgreSQL pẹlu iwe ti o dara, ikuna aifọwọyi ati koodu orisun lori github.

Awọn anfani ti Patroni:

  • A ṣe apejuwe paramita iṣeto kọọkan, o han gbangba bi o ṣe n ṣiṣẹ;
  • Aifọwọyi failover ṣiṣẹ jade kuro ninu apoti;
  • Ti a kọ ni Python, ati pe bi awa tikararẹ ti kọ ọpọlọpọ ni Python, yoo rọrun fun wa lati koju awọn iṣoro ati, boya, paapaa ṣe iranlọwọ fun idagbasoke iṣẹ naa;
  • Ni kikun ṣakoso PostgreSQL, ngbanilaaye lati yi iṣeto pada lori gbogbo awọn apa ti iṣupọ ni ẹẹkan, ati pe ti iṣupọ naa nilo lati tun bẹrẹ lati lo iṣeto tuntun, lẹhinna eyi le ṣee ṣe lẹẹkansi nipa lilo Patroni.

Konsi:

  • Ko ṣe kedere lati inu iwe bi o ṣe le ṣiṣẹ pẹlu PgBouncer ni deede. Biotilẹjẹpe o ṣoro lati pe ni iyokuro, nitori iṣẹ-ṣiṣe ti Patroni ni lati ṣakoso PostgreSQL, ati bi awọn asopọ si Patroni yoo lọ jẹ iṣoro wa tẹlẹ;
  • Awọn apẹẹrẹ diẹ wa ti imuse ti Patroni lori awọn ipele nla, lakoko ti ọpọlọpọ awọn apẹẹrẹ ti imuse wa lati ibere.

Bi abajade, a yan Patroni lati ṣẹda iṣupọ ikuna.

Ilana imuse Patroni

Ṣaaju Patroni, a ni awọn shards PostgreSQL 12 ni iṣeto ti oluwa kan ati ẹda kan pẹlu ẹda asynchronous. Awọn olupin ohun elo wọle si awọn apoti isura infomesonu nipasẹ Nẹtiwọọki Load Balancer, lẹhin eyiti o jẹ awọn iṣẹlẹ meji pẹlu PgBouncer, ati lẹhin wọn ni gbogbo awọn olupin PostgreSQL.
Iṣupọ Failover PostgreSQL + Patroni. iriri imuse

Lati ṣe Patroni, a nilo lati yan iṣeto iṣupọ ibi ipamọ ti o pin kaakiri. Patroni ṣiṣẹ pẹlu awọn eto ibi ipamọ atunto pinpin bi etcd, Zookeeper, Consul. A kan ni iṣupọ Consul ti o ni kikun lori ọja, eyiti o ṣiṣẹ ni apapo pẹlu Vault ati pe a ko lo mọ. Idi nla kan lati bẹrẹ lilo Consul fun idi ipinnu rẹ.

Bawo ni Patroni ṣiṣẹ pẹlu Consul

A ni iṣupọ Consul kan, eyiti o ni awọn apa mẹta, ati iṣupọ Patroni, eyiti o ni oludari ati ẹda kan (ni Patroni, oluwa ni a pe ni oludari iṣupọ, ati pe awọn ẹrú ni a pe ni awọn ẹda). Apeere kọọkan ti iṣupọ Patroni nigbagbogbo nfi alaye ranṣẹ nipa ipo iṣupọ naa si Consul. Nitorinaa, lati ọdọ Consul o le rii nigbagbogbo iṣeto lọwọlọwọ ti iṣupọ Patroni ati tani oludari ni akoko yii.

Iṣupọ Failover PostgreSQL + Patroni. iriri imuse

Lati sopọ Patroni si Consul, o to lati kawe iwe aṣẹ osise, eyiti o sọ pe o nilo lati pato ogun kan ni ọna kika http tabi https, da lori bii a ṣe n ṣiṣẹ pẹlu Consul, ati ero asopọ, ni yiyan:

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

O wulẹ rọrun, ṣugbọn nibi awọn pitfalls bẹrẹ. Pẹlu Consul, a ṣiṣẹ lori asopọ to ni aabo nipasẹ https ati atunto asopọ wa yoo dabi eyi:

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

Ṣugbọn iyẹn ko ṣiṣẹ. Ni ibẹrẹ, Patroni ko le sopọ si Consul, nitori o gbiyanju lati lọ nipasẹ http lonakona.

Awọn koodu orisun ti Patroni ṣe iranlọwọ lati koju iṣoro naa. Ohun rere ni a kọ ni Python. O wa ni jade pe paramita ogun ko ni itọka ni eyikeyi ọna, ati pe ilana naa gbọdọ wa ni pato ni ero. Eyi ni bii bulọọki iṣeto iṣẹ fun ṣiṣẹ pẹlu Consul ṣe dabi fun wa:

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

consul-awoṣe

Nitorina, a ti yan ibi ipamọ fun iṣeto ni. Bayi a nilo lati ni oye bi PgBouncer yoo ṣe yipada iṣeto rẹ nigbati o ba yi adari pada ninu iṣupọ Patroni. Ko si idahun si ibeere yii ninu iwe, nitori. nibẹ, ni opo, ṣiṣẹ pẹlu PgBouncer ko ṣe apejuwe.

Ni wiwa ojutu kan, a rii nkan kan (Emi laanu ko ranti akọle) nibiti a ti kọ ọ pe Сonsul-awoṣe ṣe iranlọwọ pupọ ni sisopọ PgBouncer ati Patroni. Eyi jẹ ki a ṣe iwadii bi Consul-awoṣe ṣe n ṣiṣẹ.

O wa ni jade wipe Consul-awoṣe nigbagbogbo bojuto awọn iṣeto ni ti PostgreSQL iṣupọ ni Consul. Nigbati adari ba yipada, o ṣe imudojuiwọn iṣeto PgBouncer ati firanṣẹ aṣẹ kan lati tun gbejade.

Iṣupọ Failover PostgreSQL + Patroni. iriri imuse

Afikun nla ti awoṣe ni pe o wa ni ipamọ bi koodu, nitorinaa nigbati o ba ṣafikun shard tuntun, o to lati ṣe adehun tuntun ati imudojuiwọn awoṣe laifọwọyi, atilẹyin Awọn amayederun bi ipilẹ koodu.

Titun faaji pẹlu Patroni

Bi abajade, a ni eto iṣẹ wọnyi: +
Iṣupọ Failover PostgreSQL + Patroni. iriri imuse

Gbogbo awọn olupin ohun elo wọle si iwọntunwọnsi → awọn iṣẹlẹ meji ti PgBouncer wa lẹhin rẹ → lori apẹẹrẹ kọọkan, a ṣe ifilọlẹ Consul-awoṣe, eyiti o ṣe abojuto ipo ti iṣupọ Patroni kọọkan ati ṣe abojuto ibaramu ti atunto PgBouncer, eyiti o firanṣẹ awọn ibeere si oludari lọwọlọwọ ti kọọkan iṣupọ.

Idanwo ọwọ

A ṣiṣẹ ero yii ṣaaju ifilọlẹ lori agbegbe idanwo kekere ati ṣayẹwo iṣẹ ti yiyi pada laifọwọyi. Wọ́n ṣí pátákó náà, wọ́n gbé pátákó náà, wọ́n sì “pa” ní àkókò yẹn aṣáájú ìdìpọ̀ náà. Ni AWS, eyi rọrun bi tiipa apẹẹrẹ nipasẹ console.

Iṣupọ Failover PostgreSQL + Patroni. iriri imuse

Sitika naa pada sẹhin laarin awọn aaya 10-20, ati lẹhinna tun bẹrẹ lati gbe ni deede. Eyi tumọ si pe iṣupọ Patroni ṣiṣẹ ni deede: o yi adari pada, firanṣẹ alaye naa si Сonsul, ati Сonsul-awoṣe gbe alaye yii lẹsẹkẹsẹ, rọpo iṣeto PgBouncer ati firanṣẹ aṣẹ lati tun gbejade.

Bii o ṣe le ye labẹ ẹru giga ati jẹ ki o kere ju akoko idinku?

Ohun gbogbo ṣiṣẹ daradara! Ṣugbọn awọn ibeere tuntun wa: Bawo ni yoo ṣe ṣiṣẹ labẹ ẹru giga? Bii o ṣe le yara ati lailewu yi ohun gbogbo jade ni iṣelọpọ?

Ayika idanwo lori eyiti a ṣe idanwo fifuye ṣe iranlọwọ fun wa lati dahun ibeere akọkọ. O jẹ aami kanna patapata si iṣelọpọ ni awọn ofin ti faaji ati pe o ti ṣe ipilẹṣẹ data idanwo ti o fẹrẹ dogba ni iwọn didun si iṣelọpọ. A pinnu lati kan “pa” ọkan ninu awọn ọga PostgreSQL lakoko idanwo ati wo kini o ṣẹlẹ. Ṣugbọn ṣaaju pe, o ṣe pataki lati ṣayẹwo yiyi laifọwọyi, nitori lori agbegbe yii a ni ọpọlọpọ awọn shards PostgreSQL, nitorinaa a yoo gba idanwo ti o dara julọ ti awọn iwe afọwọkọ iṣeto ṣaaju iṣelọpọ.

Awọn iṣẹ-ṣiṣe mejeeji dabi ifẹ, ṣugbọn a ni PostgreSQL 9.6. Njẹ a le ṣe igbesoke lẹsẹkẹsẹ si 11.2?

A pinnu lati ṣe ni awọn igbesẹ 2: iṣagbega akọkọ si 11.2, lẹhinna ṣe ifilọlẹ Patroni.

Imudojuiwọn PostgreSQL

Lati ṣe imudojuiwọn ẹya PostgreSQL ni kiakia, lo aṣayan -k, ninu eyiti awọn ọna asopọ lile ti ṣẹda lori disk ati pe ko si iwulo lati daakọ data rẹ. Lori awọn ipilẹ ti 300-400 GB, imudojuiwọn naa gba iṣẹju 1.

A ni ọpọlọpọ awọn shards, nitorinaa imudojuiwọn nilo lati ṣee ṣe laifọwọyi. Lati ṣe eyi, a kowe iwe-iṣere Ansible ti o mu gbogbo ilana imudojuiwọn fun wa:

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

O ṣe pataki lati ṣe akiyesi nibi pe ṣaaju ki o to bẹrẹ igbesoke, o gbọdọ ṣe pẹlu paramita naa --ṣayẹwolati rii daju pe o le igbesoke. Iwe afọwọkọ wa tun ṣe iyipada awọn atunto fun iye akoko igbesoke naa. Iwe afọwọkọ wa ti pari ni awọn aaya 30, eyiti o jẹ abajade to dara julọ.

Lọlẹ Patroni

Lati yanju iṣoro keji, kan wo iṣeto Patroni. Ibi ipamọ osise ni iṣeto apẹẹrẹ pẹlu initdb, eyiti o jẹ iduro fun ipilẹṣẹ data data tuntun nigbati o bẹrẹ Patroni ni akọkọ. Ṣugbọn niwọn igba ti a ti ni ibi ipamọ data ti o ti ṣetan, a nìkan yọ apakan yii kuro ni iṣeto ni.

Nigba ti a bẹrẹ fifi Patroni sori iṣupọ PostgreSQL ti o wa tẹlẹ ati ṣiṣe rẹ, a sare sinu iṣoro tuntun kan: awọn olupin mejeeji bẹrẹ bi adari. Patroni ko mọ nkankan nipa ipo ibẹrẹ ti iṣupọ naa o gbiyanju lati bẹrẹ awọn olupin mejeeji bi awọn iṣupọ lọtọ meji pẹlu orukọ kanna. Lati yanju iṣoro yii, o nilo lati paarẹ ilana naa pẹlu data lori ẹrú naa:

rm -rf /var/lib/postgresql/

Eyi nilo lati ṣee ṣe lori ẹrú nikan!

Nigbati ajọra ti o mọ ba ti sopọ, Patroni ṣe oludari ipilẹ-pada ati mu pada si ẹda, ati lẹhinna mu ipo lọwọlọwọ ni ibamu si awọn akọọlẹ wal.

Iṣoro miiran ti a pade ni pe gbogbo awọn iṣupọ PostgreSQL jẹ orukọ akọkọ nipasẹ aiyipada. Nigbati iṣupọ kọọkan ko mọ nkankan nipa ekeji, eyi jẹ deede. Ṣugbọn nigbati o ba fẹ lo Patroni, lẹhinna gbogbo awọn iṣupọ gbọdọ ni orukọ alailẹgbẹ kan. Ojutu ni lati yi orukọ iṣupọ pada ni iṣeto PostgreSQL.

fifuye igbeyewo

A ti ṣe ifilọlẹ idanwo kan ti o ṣe adaṣe iriri olumulo lori awọn igbimọ. Nigbati ẹru naa ba de aropin iye ojoojumọ wa, a tun ṣe idanwo kanna ni deede, a pa apẹẹrẹ kan pẹlu oludari PostgreSQL. Iṣiṣe aifọwọyi ṣiṣẹ bi a ti ṣe yẹ: Patroni yi olori pada, Consul-awoṣe ṣe imudojuiwọn iṣeto PgBouncer ati firanṣẹ aṣẹ kan lati tun gbejade. Gẹgẹbi awọn aworan wa ni Grafana, o han gbangba pe awọn idaduro wa ti awọn aaya 20-30 ati iye kekere ti awọn aṣiṣe lati awọn olupin ti o ni nkan ṣe pẹlu asopọ si data data. Eyi jẹ ipo deede, iru awọn iye bẹẹ jẹ itẹwọgba fun ikuna wa ati pe dajudaju o dara julọ ju akoko iṣẹ lọ.

Mu Patroni wa si iṣelọpọ

Bi abajade, a ṣe agbekalẹ eto atẹle yii:

  • Gbe Consul-awoṣe si awọn olupin PgBouncer ati ifilọlẹ;
  • Awọn imudojuiwọn PostgreSQL si ẹya 11.2;
  • Yi orukọ iṣupọ pada;
  • Bibẹrẹ Ẹgbẹ Patroni.

Ni akoko kanna, ero wa gba wa laaye lati ṣe aaye akọkọ ti o fẹrẹẹ jẹ nigbakugba, a le yọ PgBouncer kọọkan kuro ni iṣẹ ni titan ati gbejade ati ṣiṣe apẹrẹ consul-apẹẹrẹ lori rẹ. Nitorina a ṣe.

Fun imuṣiṣẹ ni kiakia, a lo Ansible, niwọn igba ti a ti ni idanwo gbogbo awọn iwe-iṣere tẹlẹ lori agbegbe idanwo kan, ati akoko ipaniyan ti iwe afọwọkọ ni kikun jẹ lati awọn iṣẹju 1,5 si 2 iṣẹju fun shard kọọkan. A le yi ohun gbogbo jade ni titan si shard kọọkan laisi idaduro iṣẹ wa, ṣugbọn a yoo ni lati pa PostgreSQL kọọkan fun awọn iṣẹju pupọ. Ni ọran yii, awọn olumulo ti data wọn wa lori shard yii ko le ṣiṣẹ ni kikun ni akoko yii, ati pe eyi ko ṣe itẹwọgba fun wa.

Ọna jade ninu ipo yii ni itọju ti a gbero, eyiti o waye ni gbogbo oṣu mẹta. Eyi jẹ ferese kan fun iṣẹ ti a ṣeto, nigba ti a ba tii iṣẹ wa silẹ patapata ti a ṣe igbesoke awọn apẹẹrẹ data data wa. O ku ọsẹ kan titi ti window atẹle, ati pe a pinnu lati duro ati mura siwaju. Lakoko akoko idaduro, a tun ni aabo fun ara wa: fun kọọkan PostgreSQL shard, a gbe ẹda apoju kan dide ni ọran ti ikuna lati tọju data tuntun, ati ṣafikun apẹẹrẹ tuntun fun shard kọọkan, eyiti o yẹ ki o di ẹda tuntun ninu iṣupọ Patroni, ki o má ba ṣe aṣẹ kan lati pa data rẹ. Gbogbo eyi ṣe iranlọwọ lati dinku eewu aṣiṣe.
Iṣupọ Failover PostgreSQL + Patroni. iriri imuse

A tun bẹrẹ iṣẹ wa, ohun gbogbo ṣiṣẹ bi o ti yẹ, awọn olumulo tẹsiwaju lati ṣiṣẹ, ṣugbọn lori awọn aworan a ṣe akiyesi ẹru giga ti ko ṣe deede lori awọn olupin Consul.
Iṣupọ Failover PostgreSQL + Patroni. iriri imuse

Kilode ti a ko rii eyi ni agbegbe idanwo? Iṣoro yii ṣapejuwe daradara pe o jẹ dandan lati tẹle Awọn amayederun bi ipilẹ koodu ati ṣatunṣe gbogbo awọn amayederun, lati awọn agbegbe idanwo si iṣelọpọ. Bibẹẹkọ, o rọrun pupọ lati gba iṣoro ti a ni. Kini o ti ṣẹlẹ? Consul akọkọ han lori iṣelọpọ, ati lẹhinna lori awọn agbegbe idanwo, bi abajade, lori awọn agbegbe idanwo, ẹya ti Consul ga ju iṣelọpọ lọ. O kan ninu ọkan ninu awọn idasilẹ, jijo Sipiyu kan ni ipinnu nigbati o n ṣiṣẹ pẹlu awoṣe-afọwọṣe. Nitorinaa, a kan imudojuiwọn Consul, nitorinaa yanju iṣoro naa.

Tun Patroni bẹrẹ iṣupọ

Sibẹsibẹ, a ni iṣoro tuntun kan, eyiti a ko fura paapaa. Nigbati o ba n ṣe imudojuiwọn Consul, a kan yọkuro node Consul lati iṣupọ nipa lilo aṣẹ aṣẹ iṣojuuwọn → Patroni sopọ si olupin Consul miiran → ohun gbogbo ṣiṣẹ. Ṣugbọn nigba ti a de apẹẹrẹ ti o kẹhin ti iṣupọ Consul ti o firanṣẹ aṣẹ aṣẹ iṣojuuwọn si i, gbogbo awọn iṣupọ Patroni tun bẹrẹ, ati ninu awọn akọọlẹ a rii aṣiṣe atẹle naa:

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>

Iṣijọpọ Patroni ko lagbara lati gba alaye nipa iṣupọ rẹ ati tun bẹrẹ.

Lati wa ojutu kan, a kan si awọn onkọwe Patroni nipasẹ ọrọ kan lori github. Wọn daba awọn ilọsiwaju si awọn faili atunto wa:

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

A ni anfani lati tun ṣe iṣoro naa lori agbegbe idanwo ati idanwo awọn aṣayan wọnyi nibẹ, ṣugbọn laanu wọn ko ṣiṣẹ.

Iṣoro naa ṣi wa lai yanju. A gbero lati gbiyanju awọn ojutu wọnyi:

  • Lo aṣoju Consul lori apẹẹrẹ iṣupọ Patroni kọọkan;
  • Fix oro ni koodu.

A loye ibi ti aṣiṣe naa ti waye: iṣoro naa ṣee ṣe lilo akoko aifọwọyi, eyiti ko bori nipasẹ faili iṣeto ni. Nigbati olupin Consul ti o kẹhin ti yọkuro kuro ninu iṣupọ, gbogbo iṣupọ Consul duro fun diẹ ẹ sii ju iṣẹju kan lọ, nitori eyi, Patroni ko le gba ipo iṣupọ ati tun bẹrẹ gbogbo iṣupọ patapata.

O da, a ko pade awọn aṣiṣe eyikeyi diẹ sii.

Awọn abajade ti lilo Patroni

Lẹhin ifilọlẹ aṣeyọri ti Patroni, a ṣafikun ẹda afikun ni iṣupọ kọọkan. Ni bayi ninu iṣupọ kọọkan ni irisi iyeju kan wa: adari kan ati awọn ẹda meji, fun netiwọki ailewu ni ọran pipin-ọpọlọ nigbati o ba yipada.
Iṣupọ Failover PostgreSQL + Patroni. iriri imuse

Patroni ti n ṣiṣẹ lori iṣelọpọ fun diẹ sii ju oṣu mẹta lọ. Lakoko yii, o ti ṣakoso tẹlẹ lati ṣe iranlọwọ fun wa. Laipe, adari ọkan ninu awọn iṣupọ ku ni AWS, ikuna aifọwọyi ṣiṣẹ ati awọn olumulo tẹsiwaju lati ṣiṣẹ. Patroni ṣe iṣẹ-ṣiṣe akọkọ rẹ.

Akopọ kekere ti lilo Patroni:

  • Ease ti iṣeto ni ayipada. O to lati yi iṣeto naa pada lori apẹẹrẹ kan ati pe yoo fa soke si gbogbo iṣupọ. Ti o ba nilo atunbere lati lo iṣeto tuntun, lẹhinna Patroni yoo jẹ ki o mọ. Patroni le tun bẹrẹ gbogbo iṣupọ pẹlu aṣẹ ẹyọkan, eyiti o tun rọrun pupọ.
  • Aifọwọyi failover ṣiṣẹ ati pe o ti ṣakoso tẹlẹ lati ṣe iranlọwọ fun wa.
  • Imudojuiwọn PostgreSQL laisi akoko idaduro ohun elo. O gbọdọ kọkọ ṣe imudojuiwọn awọn ẹda si ẹya tuntun, lẹhinna yi adari pada ninu iṣupọ Patroni ki o ṣe imudojuiwọn oludari atijọ. Ni idi eyi, idanwo pataki ti ikuna aifọwọyi waye.

orisun: www.habr.com

Fi ọrọìwòye kun