Teks penyahkodan logik bagi komit dua fasa dalam PostgreSQL 14

Kemas kini: 2 Julai 2023

Teks penyahkodan logik bagi komit dua fasa dalam PostgreSQL 14

Pasukan Fujitsu OSS dan komuniti sumber terbuka PostgreSQL telah bekerjasama untuk menambah fungsi menyahsulit komit dua fasa dalam replikasi logik dalam PG14. Mari kita lihat apakah ciri ini?

latar belakang

Komit dua fasa ialah mekanisme di mana transaksi dilakukan dalam dua fasa. Biasanya digunakan dalam pangkalan data yang diedarkan untuk memastikan konsistensi. Dua fasa urus niaga ialah fasa PERSEDIAAN dan fasa COMMIT/ROLLBACK. Perintah yang dihantar dalam dua fasa dalam PG ialah:

SEDIAKAN TRANSAKSI

KOMITED DISEDIAKAN

ROLLBACK DISEDIAKAN

PG sudah pun menyokong komit dua fasa dalam versi 8.0, dan versi 10.0 menyokong replikasi logik. Walau bagaimanapun, komit dua fasa tidak pernah disokong dalam replikasi logik. Perintah PREPARE TRANSACTION, COMMIT PREPARED dan ROLLBACK PREPARED telah disokong dalam satu contoh, tetapi apabila arahan ini perlu disalin secara logik ke mesin siap sedia, ia tidak lagi mengekalkan makna asal. Perintah PREPARE TRANSACTION dianggap sebagai NOP dan tidak dinyahkod sama sekali. Perintah COMMIT PREPARED dianggap sebagai COMMIT dan arahan ROLLBACK PREPARED dianggap sebagai ABORT.

Apakah itu komit dua fasa

Komit dua fasa ialah protokol komit atom yang membantu mengekalkan konsistensi antara pangkalan data yang diedarkan. Komit biasa yang menyediakan atomicity dalam pangkalan data tidak mencukupi untuk menyediakan konsistensi bagi transaksi merentas pangkalan data. Untuk menggambarkan masalah ini, mari kita berikan contoh:

1) John mempunyai 300$ di Bank A

2) Mark mempunyai 100$ dalam Bank B

3) John mahu memindahkan 100$ kepada Mark

Semasa transaksi, anda perlu mengeluarkan 100$ dari Bank A ke Bank B. Pada akhir urus niaga, sepatutnya ada 200$. Jika mana-mana transaksi gagal pada bila-bila masa semasa proses pemindahan, status akaun hendaklah dipulihkan kepada keadaan sebelum pemindahan dimulakan. Urus niaga mungkin gagal atas pelbagai sebab. Jika sebarang gangguan berlaku sebelum transaksi dilakukan, transaksi akan ditarik balik. Dalam contoh kami, jika gangguan berlaku apabila akaun John ditolak, maka akaun John tentang port gangguan tidak seharusnya dikurangkan. Beginilah cara komit mudah mengekalkan konsistensi dalam pangkalan data.

Tetapi kami menganggap situasi sedemikian, iaitu, urus niaga yang memotong 100$ daripada akaun John berjaya dalam satu penyerahan, tetapi urus niaga yang menambah 100$ pada akaun Mark di Bank B gagal dan ditarik balik. Selepas operasi ini selesai, walaupun akaun John telah didebitkan, Mark tidak akan menerima jumlah tersebut. 100$ hilang. Apabila berurusan dengan transaksi yang diedarkan, komitmen mudah mungkin gagal.

Langkah demi langkah pelaksanaan transaksi yang diedarkan

Untuk komit dua fasa, salah satu pangkalan data bertindak sebagai penyelaras transaksi yang diedarkan.

Peringkat 1

Pangkalan data mula menggunakan transaksi, dan kemudian menyediakan. Ia menghantar transaksi yang disediakan ke pangkalan data lain dalam bentuk menyediakan mesej. Pangkalan data kedua mendapat mesej Sediakan, dan kemudian menyediakan transaksi. Sediakan melibatkan perubahan dalam transaksi, tetapi tidak melakukan. Data kotor ditulis ke cakera untuk kegigihan. Setelah semua pangkalan data telah menyediakan transaksi, dan semua maklumat tentang transaksi disimpan pada cakera, fasa penyediaan selesai.

Peringkat 2

Seterusnya, penimbang tara memulakan fasa komit. Jika pangkalan data kedua gagal menyediakan urus niaga atas sebab tertentu, penimbang tara memulakan fasa rollback. Oleh itu, bergantung pada sama ada penyediaan berjaya, urus niaga itu sama ada dilakukan atau ditarik balik. Gangguan dalam fasa komit akhir boleh dipulihkan, kerana transaksi penyediaan yang diperlukan telah ditulis ke cakera dan boleh digunakan semula.

Komit dua fasa tidak berkaitan dengan pangkalan data satu contoh, tetapi ia relevan apabila data direplikasi merentas berbilang tika pangkalan data.

Sangat penting untuk menyokong komit dua fasa dalam replikasi logik.

Gambaran Keseluruhan Berfungsi

Sebelum versi PG14, transaksi replikasi logik telah dinyahkod dan direplikasi hanya selepas transaksi dilakukan. Ini adalah untuk mengelakkan transaksi replikasi akhirnya akan dibatalkan.

Nyahkod transaksi pada komit

Replikasi logik PG14 menyokong perintah PREPARE TRANSACTION, COMMIT PREPARED dan ROOLBACK PREPARED. Apabila arahan PREPARE TRANSACTION dinyahkod, transaksi dinyahkod dan disalin. PREPARE TRANSACTION memulakan ulang urus niaga dan penyahkodan seperti COMMIT dalam WAL SENDER.

Transaksi penyahkodan semasa penyediaan

Kami juga menentukan panggilan balik pemalam baharu untuk membenarkan pemalam penyahkodan logik menyokong penyerahan dua fasa.

Panggil balik

menggambarkan

penapis_sediakan_cb

Benarkan pemalam menapis urus niaga yang tidak perlu dinyahkodkan semasa menyediakan mengikut GID yang digunakan dalam arahan SEDIAKAN TRANSAKSI

mula_sediakan_cb

Permulaan Sediakan transaksi

sediakan_cb

Dipanggil apabila arahan PREPARE TRANSACTION dinyahkod

komited_bersedia_cb

Dipanggil apabila arahan COMMIT PREPARED dinyahkod

rollback_disediakan_cb

Dipanggil apabila arahan ROLLBACK PREPARED dinyahkod

Pengubahsuaian pemalam

ujian_penyahkodan

Pemalam ialah pemalam keluaran penyahkodan logik, sebagai contoh untuk membantu pengguna membangunkan pemalam penyahkod logik mereka sendiri. test_decoding menerima WAL melalui mekanisme penyahkodan logik dan menyahkodnya menjadi perwakilan teks bagi operasi yang dilakukan.

Ia telah diubah suai untuk dapat menggunakan fungsi panggil balik dua peringkat baharu dan transaksi nyahkod semasa penyediaan

pengubahsuaian API

pg_cipta_logik_replikasi_slot()

API menambah pilihan baharu untuk menentukan sama ada slot menyokong komit dua fasa. Pemalam keluaran boleh menggunakan slot replikasi dengan pilihan dua fasa untuk menyokong komit dua fasa.

pg_cipta_logik_replikasi_slot(nama slot_nama, nama pemalam [, boolean sementara, boolean dua_fasa ] )

Kajian kes

Mari lihat cara untuk mengesan output yang dinyahkod bagi transaksi komit dua fasa:

1) Buat slot replikasi

Gunakan test_decoding sebagai pemalam keluaran, dan masukkan benar supaya slot menyokong penyerahan dan penyahkodan dua peringkat.

postgres=# PILIH * DARI pg_cipta_logik_replikasi_slot('regresi_slot', 'ujian_penyahkod', palsu, benar);

slot_nama | lsn

-----------------+-----------

regresi_slot | 0/16B1970

(1 baris)

2) Buat jadual

postgres=# BUAT data JADUAL(kunci utama bersiri id, teks data);

BUAT JADUAL

3) Mengesan kandungan keluaran yang dinyahkod bagi menyediakan transaksi dan melakukan transaksi

postgres=# BERMULA;

postgres=*# MASUKKAN KE DALAM data(data) NILAI('5');

postgres=*# SEDIAKAN TRANSAKSI 'ujian_disediakan1';

postgres=# PILIH * DARI pg_logik_slot_dapatkan_perubahan('regresi_slot', NULL, NULL);

lsn | xid | data

-----------+-------------------

0/1689DC0 | 529 | BERMULA 529

0/1689DC0 | 529 | jadual awam.data: INSERT: id[integer]:3 data[teks]:'5'

0/1689FC0 | 529 | SEDIAKAN TRANSAKSI 'ujian_disediakan1', txid 529

(3 baris)

postgres=# KOMIT DISEDIAKAN 'ujian_disediakan1';

postgres=# pilih * daripada pg_logical_slot_dapatkan_perubahan('regresi_slot', NULL, NULL);

lsn | xid | data

-----------+-------------------

0/168A060 | 529 | KOMIT DISEDIAKAN 'ujian_disediakan1', txid 529

(4 baris)

postgres=# pilih * daripada data;

id | data

----+------

1 | 5

(1 baris)

masa depan

Perubahan PG14 kepada fungsi ini mempunyai infrastruktur sisi penyahkod yang membenarkan penyerahan penyahkodan dua peringkat semasa penyediaan. Kami juga mengubah suai pemalam test_decoding untuk memanfaatkan infrastruktur ini.

Langkah seterusnya ialah melaksanakan sokongan dua peringkat kepada pemalam penyahkod logik terbesar dalam PG-pemalam pgoutput. Pemalam ini menyokong mod PUBLISHER/SUBSCRIBER replikasi logik. Ia adalah pemalam yang paling banyak digunakan dalam replikasi logik. Pasukan Fujitsu OSS sedang bekerjasama dengan komuniti sumber terbuka untuk menambahkan ciri ini pada PG15.

Untuk transaksi dua fasa dalam pangkalan data yang diedarkan, PG juga perlu menyokong: mesin siap sedia memberitahu hos bahawa PREPARE telah gagal dan memulakan pemulangan semula. Mekanisme maklum balas ini tidak disokong dalam PG dan merupakan salah satu hala tuju untuk penambahbaikan pada masa hadapan.

  Links:

6mbi25l-120

rm500uz-2j