PostgreSQL sareng setélan konsistensi nyerat khusus sambungan

Tarjamahan artikel ieu disiapkeun husus pikeun siswa tangtu "Database". Kabetot dina ngembangkeun arah ieu? Urang ngajak anjeun Buka Poé, dimana urang ngobrol di jéntré ngeunaan program, fitur tina format online, kompetensi jeung prospek karir nu await lulusan sanggeus latihan.

PostgreSQL sareng setélan konsistensi nyerat khusus sambungan

PostgreSQL sareng setélan konsistensi nyerat khusus sambungan
Di Compose, urang nganyahokeun seueur pangkalan data, anu masihan urang kasempetan pikeun langkung akrab sareng fungsionalitas sareng kakuranganana. Nalika urang diajar mikacinta fitur-fitur database anyar, sakapeung urang mimiti mikir kumaha saé upami fitur anu sami aya dina alat anu langkung dewasa anu parantos dianggo ku urang salami lami. Salah sahiji fitur anyar anu kuring hoyong tingali dina PostgreSQL nyaéta konsistensi nulis anu tiasa dikonfigurasi per sambungan dina sakumna klaster. Sareng tétéla, kami parantos ngagaduhan, sareng ayeuna kami hoyong bagikeun inpormasi ngeunaan kumaha anjeun tiasa nganggo éta.

Naha kuring peryogi éta?

Kumaha kluster kedah kalakuanana gumantung kana aplikasi anjeun. Candak, contona, aplikasi pamayaran tagihan. Anjeun peryogi konsistensi XNUMX% dina kluster, ku kituna anjeun kedah ngaktifkeun komitmen sinkron supados database anjeun ngantosan sadaya parobihan dilakukeun. Nanging, upami aplikasi anjeun mangrupikeun jaringan sosial anu ngembang gancang, maka anjeun panginten bakal resep réspon anu gancang tibatan konsistensi XNUMX%. Pikeun ngahontal ieu, anjeun tiasa nganggo commits Asynchronous dina klaster anjeun.

Minuhan kompromi

Anjeun kudu nyieun tradeoffs antara konsistensi data jeung kinerja. PostgreSQL ngajauhan konsistensi kusabab konfigurasi standar teras tiasa diprediksi sareng tanpa kejutan anu teu kaduga. Ayeuna hayu urang tingali kompromi.

Tradeoff 1: Performance

Upami klaster PostgreSQL henteu meryogikeun konsistensi, éta tiasa dijalankeun sacara asynchronously. Nu nulis dijieun pikeun pamimpin klaster, sarta apdet bakal dikirim ka réplika na sababaraha milliseconds engké. Nalika klaster PostgreSQL merlukeun konsistensi, éta kudu ngajalankeun sinkron. Tulisan bakal dilakukeun ka pamimpin klaster, anu bakal ngirim pembaruan kana réplika sareng ngantosan konfirmasi anu masing-masing parantos nyerat sateuacan ngirim konfirmasi ka klien anu ngamimitian nyerat yén éta suksés. Beda praktis antara pendekatan ieu nya éta métode Asynchronous merlukeun dua hop jaringan, sedengkeun métode sinkron merlukeun opat.

Tradeoff 2: Konsistensi

Hasilna upami gagal pamimpin dina dua pendekatan ieu ogé bakal béda. Upami padamelan dilaksanakeun sacara asynchronously, teras upami aya kasalahan sapertos kitu, henteu sadayana rékaman bakal dilakukeun ku réplika. Sabaraha bakal leungit? Gumantung kana aplikasi sorangan jeung efisiensi réplikasi. Nyiptakeun réplikasi bakal nyegah réplika janten pamimpin upami jumlah inpormasi di jerona 1 MB kirang ti pamimpin, nyaéta, dugi ka 1 MB rékaman berpotensi leungit nalika operasi Asynchronous.

Ieu henteu lumangsung dina modeu sinkron. Lamun pamimpin gagal, kabéh réplika diropéa, saprak sagala nulis dikonfirmasi dina pamimpin kudu dikonfirmasi dina réplika. Ieu konsistensi.

Paripolah sinkron asup akal dina aplikasi tagihan dimana konsistensi ngagaduhan kaunggulan anu jelas dina perdagangan antara konsistensi sareng kinerja. Hal anu paling penting pikeun aplikasi sapertos kitu nyaéta data anu valid. Ayeuna pikir ngeunaan jaringan sosial dimana tugas utama pikeun ngajaga perhatian pamaké ku ngabales requests gancang-gancang. Dina hal ieu, kinerja kalayan pangsaeutikna hop jaringan sareng kirang ngantosan commits bakal janten prioritas. Tapi, tradeoff antara kinerja sareng konsistensi sanés ngan ukur anu anjeun kedah pikirkeun.

Trade-off 3: kacilakaan

Penting pisan pikeun ngartos kumaha kluster kalakuanana nalika gagal. Mertimbangkeun kaayaan dimana hiji atawa leuwih réplika gagal. Nalika commits diprosés asynchronously, pamimpin bakal neruskeun fungsi, nyaeta, narima jeung prosés nulis, tanpa ngantosan réplika leungit. Nalika réplika balik deui ka kluster, aranjeunna nyekel pamimpin. Kalayan réplikasi sinkron, upami réplika henteu ngabales, maka pamimpin moal gaduh pilihan sareng bakal teras ngantosan konfirmasi komitmen dugi ka réplika balik deui ka kluster sareng tiasa nampi sareng ngalakukeun tulisan.

Hiji sambungan per transaksi?

Unggal aplikasi peryogi jinis kombinasi konsistensi sareng kinerja anu béda. Kacuali, tangtosna, éta mangrupikeun aplikasi anu mayar tagihan, anu urang bayangkeun leres-leres konsisten, atanapi aplikasi jejaring sosial anu ampir ephemeral. Dina sadaya kasus anu sanés, bakal aya waktos nalika sababaraha operasi kedah sinkron sareng sababaraha kedah henteu sinkron. Anjeun panginten henteu hoyong sistem ngantosan dugi pesen anu dikirim ka obrolan parantos komitmen, tapi upami pamayaran diolah dina aplikasi anu sami, maka anjeun kedah ngantosan.

Sadaya kaputusan ieu, tangtosna, dilakukeun ku pamekar aplikasi. Ngadamel kaputusan anu leres ngeunaan iraha nganggo unggal pendekatan bakal ngabantosan anjeun maksimalkeun kluster anjeun. Kadé pamekar nu bisa pindah antara aranjeunna dina tingkat SQL pikeun sambungan jeung transaksi.

Mastikeun kontrol dina prakna

Sacara standar, PostgreSQL nyayogikeun konsistensi. Ieu dikawasa ku parameter server synchronous_commit. Sacara standar éta dina posisi on, tapi gaduh tilu pilihan sanés: local, remote_write atawa off.

Nalika netepkeun parameter ka off kabéh commits sinkron dieureunkeun, sanajan dina sistem lokal. Parameter lokal nangtukeun mode sinkron pikeun sistem lokal, tapi nulis ka réplika dipigawé asynchronously. Remote_write mana malah salajengna: nyerat ka réplika dijieun asynchronously, tapi dipulangkeun nalika replica geus narima nulis tapi teu ditulis ka disk.

Ku tempo rentang sadia tina pilihan, urang milih hiji kabiasaan jeung, tetep dina pikiran nu on - ieu rékaman sinkron, urang bakal milih local pikeun commits Asynchronous ngaliwatan jaringan, bari ninggalkeun commits lokal sinkron.

Ayeuna, kami bakal nyarioskeun ka anjeun kumaha nyetél ieu sakedap, tapi bayangkeun yén kami parantos nyetél synchronous_commit в local pikeun server. Urang wondered lamun éta mungkin pikeun ngarobah parameter synchronous_commit dina laleur, jeung tétéla éta teu ngan mungkin, aya malah dua cara pikeun ngalakukeun ieu. Anu kahiji nyaéta nyetél sési sambungan anjeun sapertos kieu:

SET SESSION synchronous_commit TO ON;  
// Your writes go here

Sadaya tulisan anu salajengna dina sési bakal ngaku nyerat kana réplika sateuacan mulangkeun hasil anu positif ka klien anu disambungkeun. Iwal tangtu anjeun ngarobah setelan synchronous_commit deui. Anjeun tiasa ngaleungitkeun bagian SESSION dina paréntah sabab bakal di nilai standar.

Metodeu kadua anu saé nalika anjeun ngan ukur hoyong mastikeun yén anjeun nampi réplikasi sinkron pikeun transaksi tunggal. Dina seueur basis data generasi NoSQL, konsép transaksi henteu aya, tapi aya dina PostgreSQL. Dina hal ieu anjeun ngamimitian urus lajeng nyetél synchronous_commit в on saméméh executing entri pikeun urus. COMMIT bakal ngalakukeun transaksi nganggo nilai parameter naon waé synchronous_commit, anu disetél dina waktos éta, sanaos langkung saé nyetél variabel di payun pikeun mastikeun pamekar anu sanés ngartos yén tulisan henteu asinkron.

BEGIN;  
SET LOCAL synchronous_commit TO ON;  
// Your writes go here
COMMIT;  

Sadaya transaksi commits ayeuna bakal dikonfirmasi sakumaha ditulis ka réplika saméméh database mulih respon positif kana klien disambungkeun.

Nyetél PostgreSQL

Sateuacan ieu, urang ngabayangkeun sistem PostgreSQL sareng synchronous_commit, dipasang di local. Pikeun ngajantenkeun ieu realistis dina sisi server, anjeun kedah nyetél dua pilihan konfigurasi server. Hiji deui parameter synchronous_standby_names bakal datang kana sorangan nalika synchronous_commit bakal di on. Éta nangtukeun réplika mana anu cocog pikeun komitmen sinkron, sareng kami bakal nyetél éta *, nu bakal hartosna yén sakabéh réplika aub. Nilai-nilai ieu biasana dikonpigurasi dina file konfigurasi ku nambahkeun:

synchronous_commit = local  
synchronous_standby_names='*'

Ku netepkeun parameter synchronous_commit kana harti local, urang nyieun sistem dimana disk lokal tetep sinkron, tapi replica jaringan commits anu Asynchronous sacara standar. Kacuali, tangtosna, urang mutuskeun pikeun ngajantenkeun komitmen ieu sinkron, sapertos anu dipidangkeun di luhur.

Lamun geus nuturkeun perkembangannya Proyék gubernur, Anjeun meureun geus nempo sababaraha parobahan panganyarna (1, 2), anu ngamungkinkeun para pangguna Gubernur pikeun nguji parameter ieu sareng ngawas konsistensina.

Sababaraha kecap deui...

Ngan saminggu ka tukang, kuring bakal nyarios yén mustahil pikeun nyaluyukeun PostgreSQL sacara saé. Éta nalika Kurt, anggota tim platform Compose, negeskeun yén kasempetan sapertos kitu aya. Anjeunna calmed objections kuring sarta kapanggih dina dokuméntasi PostgreSQL handap:

PostgreSQL sareng setélan konsistensi nyerat khusus sambungan

Setelan ieu bisa dirobah iraha wae. Paripolah pikeun transaksi naon waé ditangtukeun ku setélan anu aya dina waktos komitmen. Ku alatan éta, mungkin jeung mangpaat pikeun sababaraha transaksi bunuh synchronously jeung batur asynchronously. Contona, maksakeun hiji multistatement urus sangkan commits asynchronously lamun nilai standar tina parameter sabalikna, set SET LOCAL synchronous_commit TO OFF dina hiji transaksi.

Kalayan modifikasi leutik ieu kana file konfigurasi, kami masihan pangguna kontrol kana konsistensi sareng pagelaranana.

sumber: www.habr.com

Tambahkeun komentar