Terjemahan artikel disiapake khusus kanggo siswa kursus kasebut
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
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
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
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