Daudzas komandas uzskata, ka viņu PostgreSQL ir augsti pieejams, jo tām ir straumēšanas replika. Tas ir spēkā līdz trijiem naktī, kad primārais serveris nokrīt un kādam ar roku jāpaaugstina replika, jāpārvirza katra lietotne un jāizdomā, ko darīt ar veco primāro, kad tas atgriežas. Replika dod datu kopiju. Augsta pieejamība ir viss, kas ap šo kopiju notiek automātiski.
Kas augstas pieejamības risinājumam jāspēj
- Uzticami noteikt kļūmi — nepaaugstinot repliku pie katra īslaicīga tīkla traucējuma.
- Izvēlēties tieši vienu jaunu primāro. Divi primārie, kas vienlaikus pieņem rakstīšanu — split-brain —, ir daudz sliktāk par īsu pārtraukumu.
- Pārvirzīt klientu satiksmi uz jauno primāro, nemainot lietotņu konfigurāciju.
- Atgriezt veco primāro kā repliku, kad tas atkopjas.
- Nezaudēt apstiprinātus datus vai vismaz zaudēt tikai zināmu, saskaņotu apjomu.
Kā to dara Patroni
Patroni ir aģents, kas darbojas blakus PostgreSQL katrā datubāzes mezglā un to pārvalda. Mezgli koordinējas caur sadalīto konfigurācijas krātuvi — etcd, Consul, ZooKeeper vai Kubernetes API. Pašreizējais primārais tur līdera atslēgu ar īsu derīguma laiku un to nepārtraukti atjauno. Ja atslēga beidzas, veselās replikas sacenšas par to, un tiek paaugstināta visjaunākā. Primārais, kas zaudē saziņu ar konfigurācijas krātuvi, pats sevi pazemina — tieši tas pasargā no split-brain.
Arī konfigurācijas krātuvei jābūt augsti pieejamai: darbiniet trīs (vai piecus) dalībniekus atsevišķos serveros, ideāli — dažādās pieejamības zonās, lai, vienam izkrītot, saglabātos kvorums.
Maršrutēšana: kā lietotnes atrod primāro
Pārslēgšanās ir noderīga tikai tad, ja klienti tai seko. Patroni katrā mezglā nodrošina REST API, ko var pārbaudīt slodzes balansētājs, piemēram, HAProxy: galapunkts /primary atbild ar panākumu tikai pašreizējā līdera mezglā, /replica — tikai veselās replikās. Lietotnes pieslēdzas balansētājam, nekad tieši datubāzes serverim. Tajā pašā ceļā parasti atrodas arī savienojumu pūls, piemēram, PgBouncer. Alternatīvas ir peldoša virtuālā IP adrese, ko pārvalda vip-manager, vai Kubernetes servisi, ja strādājat Kubernetes vidē.
Izlemiet, cik datu varat zaudēt
Ar asinhrono replikāciju pārslēgšanās var zaudēt pēdējās transakcijas, ko vecais primārais apstiprināja, bet vēl nebija nosūtījis. Patroni iestatījums maximum_lag_on_failover neļauj paaugstināt repliku, kas pārāk atpalikusi. Ja nevarat pieļaut nekādu apstiprinātu transakciju zudumu, synchronous_mode liek katrai transakcijai gaidīt sinhrono repliku — uz rakstīšanas aizkaves rēķina un ar tādu repliku skaitu, lai viena mezgla kļūme neapstādinātu rakstīšanu.
Vecā primārā atgriešana
Pēc pārslēgšanās vecā primārā dati ir atšķīrušies, un tas nevar vienkārši pievienoties atpakaļ. Patroni var izmantot pg_rewind, lai attītu to līdz atšķiršanās punktam un palaistu kā repliku, — tas ir daudz ātrāk nekā pārbūvēt no nulles. pg_rewind prasa wal_log_hints = on vai datu kontrolsummas, tāpēc ieslēdziet vienu no tiem, veidojot klasteri, nevis pēc pirmā incidenta.
Biežākā nepilnība, ko atrodam, nemaz nav datubāzes slānī. Patroni paaugstina jauno primāro krietni mazāk nekā minūtē, bet lietotne tur vaļā vecos savienojumus vai kešo DNS un pamana izmaiņas tikai pēc desmit minūtēm. Mēriet pārslēgšanos no lietotāja skatpunkta, nevis pēc datubāzes žurnāla.
Notestējiet, pirms tas vajadzīgs
Netestēta pārslēgšanās ir tikai hipotēze. Veiciet plānotu pārslēgšanos ar patronictl switchover, pēc tam neplānotos gadījumus: apturiet PostgreSQL primārajā, izslēdziet mezglu, atslēdziet tā tīklu un izslēdziet vienu konfigurācijas krātuves dalībnieku. Mēriet, cik ilgi rakstīšana nav pieejama un vai lietotnes atkopjas pašas. Atkārtojiet pēc lielām izmaiņām — un periodiski arī produkcijā, zemas slodzes laikā.
Galvenās atziņas
- Straumēšanas replika ir datu kopija; augsta pieejamība ir automatizācija ap to.
- Patroni ar trīs dalībnieku etcd vai Consul klasteri nodrošina līdera izvēli un aizsardzību pret split-brain.
- Virziet klientus caur HAProxy vai virtuālo IP, izmantojot Patroni veselības pārbaudes, nekad uz fiksētu serveri.
- Izvēlieties starp asinhrono un sinhrono replikāciju atkarībā no tā, cik datu varat atļauties zaudēt.
- Testējiet pārslēgšanos pilnībā, ieskaitot to, cik ilgi atkopjas lietotne.