Arhitektūra

PostgreSQL savienojumu pūls ar PgBouncer: praktisks ceļvedis

Kļūdas "too many connections", atmiņas trūkums un lēna pieslēgšanās parasti ārstējamas vienādi — ar savienojumu pūlu. Kā darbojas PgBouncer, kuru pūla režīmu izvēlēties, kā noteikt pūla izmēru un no kādām lamatām izvairīties.

· 10 min lasīšanai · AG Data komanda

Agrāk vai vēlāk gandrīz katra augoša PostgreSQL instalācija saskaras ar vienu un to pašu kļūdu: FATAL: sorry, too many clients already. Instinktīvs risinājums ir palielināt max_connections. Parasti tas situāciju pasliktina. Īstais risinājums ir PostgreSQL savienojumu pūls, un visplašāk izmantotais rīks tam ir PgBouncer — neliels, vienam uzdevumam paredzēts starpniekserveris, kas ļauj tūkstošiem lietotņu savienojumu koplietot dažus desmitus reālu datubāzes savienojumu.

Kāpēc PostgreSQL vajag savienojumu pūlu

PostgreSQL izmanto modeli "viens process uz savienojumu": katrs klienta savienojums serverī saņem savu aizmugursistēmas procesu. Šī arhitektūra ir noturīga, taču katrs process patērē atmiņu un CPU plānošanu, un jauna savienojuma atvēršana — autentifikācija, procesa palaišana, kataloga kešatmiņas — aizņem milisekundes, nevis mikrosekundes. Noklusējuma max_connections vērtība ir 100 ne bez iemesla.

Mūsdienu lietotnes situāciju pasliktina. Katra lietotnes instance, darba process, cron uzdevums un bezservera funkcija uztur savu savienojumu pūlu, tāpēc desmit konteineriem ar pūlu pa 20 jau vajag 200 savienojumu — lielākā daļa no tiem lielākoties dīkstāvē. Dīkstāves savienojumi nav bez maksas: tie aizņem atmiņu, un liels aizmugursistēmas procesu skaits padara dažas iekšējās darbības, piemēram, momentuzņēmumu iegūšanu, dārgākas visiem.

Pūls pārrauj saikni starp "klientu skaitu" un "datubāzes procesu skaitu". Lietotnes pieslēdzas PgBouncer tā, it kā tas būtu PostgreSQL; PgBouncer tām piešķir reālu servera savienojumu tikai tad, kad tas patiešām vajadzīgs.

Trīs pūla režīmi

PgBouncer dokumentācija apraksta trīs režīmus. Pareizā izvēle ir svarīgākais lēmums, ko pieņemsiet:

Vairumam tīmekļa lietotņu transakciju pūls ir pareizā noklusējuma izvēle — ja lietotne ar to ir saderīga.

Kas nedarbojas transakciju režīmā

Tā kā viena klienta secīgas transakcijas var izpildīties uz dažādiem servera savienojumiem, viss, kas balstās uz sesijas stāvokli, nav drošs. Saskaņā ar PgBouncer funkciju tabulu transakciju režīmā nedarbojas:

Protokola līmeņa sagatavotie vaicājumi — tie, ko vairums draiveru izveido automātiski — arī gadiem bija problēma. Kopš PgBouncer 1.21, kas iznāca 2023. gada oktobrī, tie transakciju režīmā tiek atbalstīti, ja max_prepared_statements ir iestatīts uz vērtību, kas nav nulle. Ja izmantojat vecāku PgBouncer, jaunināšana bieži ir vienkāršāka nekā katra draivera pārkonfigurēšana.

Praktiska pieeja: izmantojiet divus pūlus. Parastā lietotnes plūsma iet caur transakciju režīma pūlu; dažas komponentes, kurām patiešām vajag sesijas — uz LISTEN balstīts darba process, migrāciju rīks, ilgi administrēšanas uzdevumi —, pieslēdzas caur nelielu sesijas režīma pūlu vai tieši PostgreSQL.

Pūla izmēra noteikšana

Galveno PgBouncer iestatījumu nav daudz:

Datubāzes serveris paralēli var izpildīt tikai tik vaicājumu, cik ļauj tā CPU kodoli un I/O jauda. OLTP slodzēm saprātīgs sākumpunkts ir pūls, kas dažas reizes pārsniedz CPU kodolu skaitu; virs tā papildu savienojumi galvenokārt palielina konkurenci. Sāciet ar mazu pūlu, mēriet un palieliniet to tikai tik ilgi, kamēr caurlaidspēja turpina augt. Atcerieties, ka PostgreSQL max_connections jābūt lielākam par visu pūlu summu plus rezervi administratoriem, replikācijai un monitoringam.

PgBouncer monitorings

PgBouncer ir administrēšanas konsole: pieslēdzieties virtuālajai datubāzei pgbouncer un izpildiet SHOW POOLS; un SHOW STATS;. Īpaši sekojiet:

Ilgas vai "idle in transaction" sesijas ir klasisks veids, kā iztukšot transakciju pūlu: katra no tām aizņem servera savienojumu. PostgreSQL iestatījums idle_in_transaction_session_timeout pasargā pūlu no aizmirstām transakcijām. Ja lēni ir paši vaicājumi, sāciet ar mūsu PostgreSQL lēno vaicājumu optimizācijas kontrolsarakstu.

Kur darbināt PgBouncer

Pārvaldītajiem pakalpojumiem ir savi ekvivalenti, piemēram, Amazon RDS Proxy, un pastāv arī alternatīvas, kā Pgpool-II, Odyssey un PgCat. PgBouncer joprojām ir noklusējuma izvēle, jo tas ir mazs, ātrs, labi izprotams un labi dara vienu darbu.

Galvenās atziņas

PostgreSQL PgBouncer Savienojumu pūls Veiktspēja
Sadarbība ar mums

PostgreSQL sasniedz savienojumu limitu?

Mēs projektējam un pielāgojam PostgreSQL savienojumu pūlus — no viena PgBouncer viena servera priekšā līdz augstas pieejamības klasteriem ar pūliem.

Sazināties Vairāk no emuāra