PostgreSQL lan setelan konsistensi nulis khusus sambungan

Terjemahan artikel disiapake khusus kanggo siswa kursus kasebut "Database". Tertarik ngembangake arah kasebut? Kita ngajak sampeyan Open Day, ing ngendi kita ngomong kanthi rinci babagan program, fitur format online, kompetensi lan prospek karir sing nunggu lulusan sawise latihan.

PostgreSQL lan setelan konsistensi nulis khusus sambungan

PostgreSQL lan setelan konsistensi nulis khusus sambungan
Ing Compose, kita ngatasi akeh database, sing menehi kesempatan kanggo dadi luwih akrab karo fungsi lan kekurangane. Nalika kita sinau kanggo tresna fitur saka database anyar, kita sok-sok wiwit mikir carane apik iku bakal yen fitur padha ana ing pribadi luwih diwasa kita wis digunakake kanggo dangu. Salah sawijining fitur anyar sing pengin dakdeleng ing PostgreSQL yaiku konsistensi nulis sing bisa dikonfigurasi saben sambungan ing kabeh kluster. Lan ternyata, kita wis duwe, lan dina iki kita pengin nuduhake informasi babagan carane sampeyan bisa nggunakake.

Apa aku kudu?

Kepiye kluster kudu tumindak gumantung saka aplikasi sampeyan. Njupuk, contone, app pembayaran tagihan. Sampeyan mbutuhake konsistensi XNUMX% ing kluster, dadi sampeyan kudu ngaktifake komit sinkron supaya database ngenteni kabeh owah-owahan. Nanging, yen aplikasi sampeyan minangka jaringan sosial sing tuwuh kanthi cepet, mula sampeyan bakal luwih seneng nanggapi kanthi cepet tinimbang konsistensi XNUMX%. Kanggo nggayuh iki, sampeyan bisa nggunakake komit asinkron ing kluster sampeyan.

Ketemu kompromi

Sampeyan kudu nggawe tradeoffs antarane konsistensi data lan kinerja. PostgreSQL pindhah saka konsistensi amarga konfigurasi standar banjur bisa diprediksi lan tanpa kejutan sing ora dikarepake. Saiki ayo ndeleng kompromi.

Tradeoff 1: Kinerja

Yen kluster PostgreSQL ora mbutuhake konsistensi, bisa mlaku kanthi ora sinkron. Nulis digawe kanggo pimpinan kluster, lan nganyari bakal dikirim menyang replika sawetara milliseconds mengko. Nalika kluster PostgreSQL mbutuhake konsistensi, kudu mlaku bebarengan. Nulis bakal digawe kanggo pimpinan kluster, sing bakal ngirim nganyari kanggo replika lan ngenteni konfirmasi sing saben wis ditulis sadurunge ngirim konfirmasi kanggo klien sing miwiti nulis sing sukses. PrabΓ©dan praktis ing antarane pendekatan kasebut yaiku metode asinkron mbutuhake rong hop jaringan, dene metode sinkron mbutuhake papat.

Tradeoff 2: Konsistensi

Asil yen ana kegagalan pimpinan ing rong pendekatan kasebut uga bakal beda. Yen karya dileksanakake asynchronously, banjur yen ana kesalahan kuwi, ora kabeh cathetan bakal setya dening replika. Pira bakal ilang? Gumantung ing aplikasi dhewe lan efisiensi replikasi. Nyipta rΓ©plikasi bakal nyegah tiron saka dadi pimpinan yen jumlah informasi ing iku 1 MB kurang saka ing pimpinan, sing, nganti 1 MB cathetan bisa duweni potensi ilang sak operasi bedo.

Iki ora kedadeyan ing mode sinkron. Yen pimpinan gagal, kabeh replika dianyari, wiwit sembarang nulis dikonfirmasi ing pimpinan kudu dikonfirmasi ing replika. Iki konsistensi.

Prilaku sinkron ndadekake pangertèn ing aplikasi tagihan sing konsistensi nduweni kauntungan sing jelas ing antarane konsistensi lan kinerja. Sing paling penting kanggo aplikasi kasebut yaiku data sing bener. Saiki pikirake babagan jaringan sosial sing tugas utama yaiku njaga perhatian pangguna kanthi nanggapi panjaluk kanthi cepet. Ing kasus iki, kinerja karo lompatan jaringan luwih sithik lan kurang ngenteni komitmen bakal dadi prioritas. Nanging, tradeoff antarane kinerja lan konsistensi ora mung siji sampeyan kudu mikir.

Trade-off 3: Kacilakan

Penting banget kanggo mangerteni carane kluster tumindak nalika gagal. Coba kahanan nalika siji utawa luwih replika gagal. Nalika komit diproses kanthi asinkron, pimpinan bakal terus tumindak, yaiku, nampa lan proses nulis, tanpa ngenteni replika sing ilang. Nalika replika bali menyang kluster, padha nyekel pimpinan. Kanthi replikasi sinkron, yen replika ora nanggapi, pimpinan ora duwe pilihan lan bakal terus ngenteni konfirmasi komitmen nganti replika bali menyang kluster lan bisa nampa lan nindakake nulis.

Siji sambungan saben transaksi?

Saben aplikasi mbutuhake jinis kombinasi konsistensi lan kinerja sing beda. Kajaba, mesthine, aplikasi sing mbayar tagihan, sing kita bayangake pancen konsisten, utawa aplikasi jejaring sosial sing meh ora ana. Ing kabeh kasus liyane, bakal ana wektu nalika sawetara operasi kudu sinkron lan sawetara kudu ora sinkron. Sampeyan bisa uga ora pengin sistem ngenteni nganti pesen sing dikirim menyang chatting wis setya, nanging yen pembayaran wis diproses ing aplikasi padha, sampeyan kudu ngenteni.

Kabeh keputusan kasebut, mesthi, digawe dening pangembang aplikasi. Nggawe keputusan sing tepat babagan kapan nggunakake saben pendekatan bakal mbantu sampeyan ngoptimalake klompok sampeyan. Iku penting sing pangembang bisa ngalih ing antarane wong-wong mau ing tingkat SQL kanggo sambungan lan kanggo transaksi.

Njamin kontrol ing laku

Kanthi gawan, PostgreSQL nyedhiyakake konsistensi. Iki dikontrol dening parameter server synchronous_commit. Kanthi gawan iku ing posisi on, nanging nduweni telung opsi liyane: local, remote_write utawa off.

Nalika nyetel parameter kanggo off kabeh komit sinkron mandegake, malah ing sistem lokal. Parameter lokal nemtokake mode sinkron kanggo sistem lokal, nanging nulis kanggo replika dileksanakake asynchronously. Remote_write dadi malah luwih: nulis kanggo rΓ©plika digawe asynchronously, nanging bali nalika tiron wis ditampa nulis nanging wis ora ditulis menyang disk.

Miturut considering sawetara kasedhiya saka opsi, kita milih prilaku lan, mbudidaya sing on - iki rekaman sinkron, kita bakal milih local kanggo asynchronous commits liwat jaringan, nalika ninggalake lokal commits sinkron.

Saiki, kita bakal pitutur marang kowe carane nyetel iki ing wayahe, nanging bayangake yen kita wis nyetel synchronous_commit Π² local kanggo server. Kita kepingin weruh yen bisa ngganti parameter kasebut synchronous_commit ing fly, lan iku ora mung bisa, malah ana rong cara kanggo nindakake iki. Pisanan yaiku nyetel sesi sambungan sampeyan kaya ing ngisor iki:

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

Kabeh tulisan sakteruse ing sesi kasebut bakal ngakoni nulis menyang replika sadurunge ngasilake asil positif menyang klien sing disambungake. Kajaba manawa sampeyan ngganti setelan synchronous_commit maneh. Sampeyan bisa ngilangi bagean SESSION ing printah amarga bakal ing Nilai standar.

Cara kapindho apik yen sampeyan mung pengin mesthekake yen sampeyan entuk replikasi sinkron kanggo transaksi siji. Ing akeh database generasi NoSQL konsep transaksi ora ana, nanging ing PostgreSQL. Ing kasus iki sampeyan miwiti transaksi lan banjur nyetel synchronous_commit Π² on sadurunge nglakokake entri kanggo transaksi. COMMIT bakal nindakake transaksi nggunakake sembarang nilai parameter synchronous_commit, sing disetel ing wektu kasebut, sanajan luwih becik nyetel variabel ing ngarep kanggo mesthekake pangembang liyane ngerti yen tulisan ora asinkron.

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

Kabeh transaksi transaksi saiki bakal dikonfirmasi minangka ditulis kanggo replika sadurunge database ngasilake respon positif kanggo klien sing disambungake.

Nggawe PostgreSQL

Sadurunge iki, kita mbayangno sistem PostgreSQL karo synchronous_commit, dipasang ing local. Kanggo nggawe iki nyata ing sisih server, sampeyan kudu nyetel rong opsi konfigurasi server. Siji parameter liyane synchronous_standby_names bakal teka dhewe nalika synchronous_commit bakal mlebu on. Iki nemtokake replika sing layak kanggo komit sinkron, lan kita bakal nyetel *, sing tegese kabeh replika melu. Nilai kasebut biasane dikonfigurasi ing file konfigurasi kanthi nambahake:

synchronous_commit = local  
synchronous_standby_names='*'

Kanthi nyetel parameter synchronous_commit menyang makna local, kita nggawe sistem ngendi disk lokal tetep sinkron, nanging replika jaringan commit ora sinkron minangka standar. Kajaba, mesthine, kita mutusake nggawe komitmen kasebut sinkron, kaya sing dituduhake ing ndhuwur.

Yen sampeyan wis ngetutake pembangunan Proyek gubernur, sampeyan bisa uga wis weruh sawetara owah-owahan anyar (1, 2), sing ngidini pangguna Gubernur nyoba paramèter kasebut lan ngawasi konsistensi.

Sawetara tembung liyane ...

Mung seminggu kepungkur, aku bakal ngandhani yen ora bisa nyetel PostgreSQL kanthi apik. Nalika iku Kurt, anggota tim platform Compose, negesake manawa ana kesempatan kasebut. Dheweke nenangake bantahanku lan ditemokake ing dokumentasi PostgreSQL ing ngisor iki:

PostgreSQL lan setelan konsistensi nulis khusus sambungan

Setelan iki bisa diganti kapan wae. Prilaku kanggo transaksi apa wae ditemtokake dening setelan sing ditrapake nalika nindakake. Mulane, bisa uga migunani kanggo sawetara transaksi sing bisa ditindakake kanthi sinkron lan kanggo wong liya kanthi ora sinkron. Contone, kanggo meksa siji multistatement transaksi kanggo nggawe commits asynchronously nalika Nilai standar saka parameter ngelawan, nyetel SET LOCAL synchronous_commit TO OFF ing transaksi.

Kanthi modifikasi cilik iki kanggo file konfigurasi, kita menehi pangguna kontrol babagan konsistensi lan kinerja.

Source: www.habr.com

Add a comment