PostgreSQL 14'te iki aşamalı işlemin mantıksal kod çözme metni

Güncelleme: 2 Temmuz 2023

PostgreSQL 14'te iki aşamalı işlemin mantıksal kod çözme metni

Fujitsu OSS ekibi ve PostgreSQL açık kaynak topluluğu, PG14'te mantıksal çoğaltmada iki aşamalı işlemin şifresini çözme işlevini eklemek için işbirliği yaptı. Bu özelliğin ne olduğuna bir göz atalım mı?

arka fon

İki aşamalı taahhüt, işlemlerin iki aşamada gerçekleştirildiği bir mekanizmadır. Tutarlılığı sağlamak için genellikle dağıtılmış veritabanlarında kullanılır. İşlemin iki aşaması HAZIRLIK aşaması ve KABUL/GERİ ALMA aşamasıdır. PG'de iki aşamada sunulan komutlar şunlardır:

İŞLEM HAZIRLA

TAAHHÜT HAZIRLANDI

GERİ DÖNÜŞ HAZIRLANDI

PG, sürüm 8.0'da iki aşamalı işlemeyi zaten desteklemektedir ve sürüm 10.0, mantıksal çoğaltmayı desteklemektedir. Ancak mantıksal çoğaltmada iki aşamalı kayıt hiçbir zaman desteklenmemiştir. PREPARE TRANSACTION, COMMIT PREPARED ve ROLLBACK PREPARED komutları tek örnekte desteklenmiştir ancak bu komutların mantıksal olarak yedek makineye kopyalanması gerektiğinde artık orijinal anlamını korumazlar. PREPARE TRANSACTION komutu bir NOP olarak kabul edilir ve hiçbir şekilde kodu çözülmez. COMMIT PREPARED komutu COMMIT olarak kabul edilir ve ROLLBACK PREPARED komutu ABORT olarak kabul edilir.

İki aşamalı taahhüt nedir

İki aşamalı taahhüt, dağıtılmış veritabanları arasında tutarlılığın korunmasına yardımcı olan atomik bir taahhüt protokolüdür. Veritabanı içinde atomiklik sağlayan sıradan taahhütler, veritabanları arası işlemlerde tutarlılık sağlamak için yeterli değildir. Bu sorunu açıklamak için bir örnek verelim:

1) John'un A Bankasında 300$'ı var

2) Mark'ın Banka B'de 100'ü var

3) John, Mark'a 100$ transfer etmek istiyor

İşlem sırasında A Bankasından B Bankasına 100$ çekmeniz gerekiyor. İşlem sonunda 200$ olması gerekiyor. Transfer işleminin herhangi bir anında herhangi bir işlem başarısız olursa hesap durumu, transfer başlamadan önceki durumuna geri getirilmelidir. İşlem çeşitli nedenlerden dolayı başarısız olabilir. İşlem gerçekleştirilmeden önce herhangi bir kesinti meydana gelirse işlem geri alınır. Örneğimizde John'un hesabından kesinti yapılırken bir kesinti meydana gelirse, o zaman John'un kesinti portundaki hesabının azaltılmaması gerekir. Basit bir taahhüt, veritabanındaki tutarlılığı bu şekilde korur.

Ama biz böyle bir durumu ele alıyoruz, yani John'un hesabından 100$ düşüren işlem tek gönderimde başarılı olurken Mark'ın B Bankasındaki hesabına 100$ ekleyen işlem başarısız oluyor ve geri alınıyor. Bu işlem bittikten sonra John'un hesabından borç çekilmiş olmasına rağmen Mark bu tutarı alamayacaktır. 100$ ortadan kayboldu. Dağıtılmış işlemlerle uğraşırken basit bir taahhüt başarısız olabilir.

Dağıtılmış işlemlerin adım adım yürütülmesi

İki aşamalı taahhüt için veritabanlarından biri dağıtılmış işlemlerin koordinatörü olarak görev yapar.

Sahne 1

Bir veritabanı işlemleri uygulamaya başlar ve ardından hazırlanır. Hazırlanan işlemleri diğer veritabanlarına hazırlık mesajları şeklinde gönderir. İkinci veritabanı Hazırla mesajını alır ve ardından işlemi hazırlar. Hazırlık, işlemdeki değişiklikleri içerir ancak taahhüt etmez. Kirli veriler kalıcı olması için diske yazılır. Tüm veritabanları işlemi hazırladıktan ve işlemle ilgili tüm bilgiler diskte saklandıktan sonra hazırlık aşaması tamamlanır.

Sahne 2

Daha sonra hakem taahhüt aşamasını başlatır. İkinci veritabanı herhangi bir nedenle işlemi hazırlayamazsa hakem geri alma aşamasını başlatır. Bu nedenle, hazırlığın başarılı olup olmamasına bağlı olarak işlem ya taahhüt edilir ya da geri alınır. Gerekli hazırlık işlemi diske yazıldığından ve yeniden uygulanabildiğinden, son taahhüt aşamasındaki kesinti kurtarılabilir.

İki aşamalı taahhüt, tek örnekli veritabanlarıyla ilgili değildir ancak veriler birden fazla veritabanı örneğinde çoğaltıldığında geçerlidir.

Mantıksal çoğaltmada iki aşamalı kesinleştirmeyi desteklemek çok önemlidir.

İşlevsel Genel Bakış

PG14 sürümünden önce, mantıksal çoğaltma işlemlerinin kodu çözülür ve yalnızca işlem tamamlandıktan sonra kopyalanırdı. Bunun amacı, çoğaltma işleminin sonunda iptal edilebilmesini önlemektir.

Taahhüt sırasında işlemin kodunu çöz

PG14'ün mantıksal replikasyonu PREPARE TRANSACTION, COMMIT PREPARED ve ROOLBACK PREPARED komutlarını destekler. PREPARE TRANSACTION komutunun kodu çözüldüğünde, işlemin kodu çözülür ve kopyalanır. PREPARE TRANSACTION, WAL SENDER'daki COMMIT gibi işlem tekrarını ve kod çözmeyi başlatır.

Hazırlık sırasında işlemin kodunu çözme

Ayrıca mantıksal kod çözme eklentilerinin iki aşamalı gönderimi desteklemesine izin vermek için yeni bir eklenti geri çağrısı tanımladık.

Geri Arama

tanımlamak

filtrele_hazırla_cb

Eklentinin, PREPARE TRANSACTION komutunda kullanılan GID'ye göre hazırlanırken kodunun çözülmesi gerekmeyen işlemleri filtrelemesine izin verin

başla, hazırlan, cb

Hazırlama işleminin başlangıcı

hazırlamak_cb

PREPARE TRANSACTION komutunun kodu çözüldüğünde çağrılır

taahhüt et, hazırlandı, cb

COMMIT PREPARED komutunun kodu çözüldüğünde çağrılır

geri alma_hazırlandı_cb

ROLLBACK PREPARED komutunun kodu çözüldüğünde çağrılır

Eklenti değişikliği

test-kod çözme

Eklenti, kullanıcıların kendi mantıksal kod çözme eklentilerini geliştirmelerine yardımcı olmak amacıyla bir mantıksal kod çözme çıkış eklentisidir. test_decoding, WAL'yi mantıksal bir kod çözme mekanizması aracılığıyla alır ve kodunu, gerçekleştirilen işlemin metinsel temsiline dönüştürür.

Hazırlık sırasında yeni iki aşamalı geri arama işlevini ve kod çözme işlemini kullanabilmek için değiştirildi

API modifikasyonu

pg_oluşturma_mantıksal_çoğaltma_yuvası()

API, slotun iki aşamalı taahhüdü destekleyip desteklemediğini belirtmek için yeni bir seçenek ekler. Çıkış eklentisi, iki aşamalı işlemeyi desteklemek için iki aşamalı seçeneğe sahip bir çoğaltma yuvası kullanabilir.

pg_oluştur_mantıksal_çoğaltma_yuva(yuva_ad adı, eklenti adı [,geçici boolean, iki_fazlı boolean ] )

Örnek olay

İki aşamalı taahhüt işleminin kodu çözülmüş çıktısının nasıl tespit edileceğini görelim:

1) Bir çoğaltma yuvası oluşturun

Çıkış eklentisi olarak test_decoding'i kullanın ve yuvanın iki aşamalı gönderme ve kod çözmeyi desteklemesi için true değerini iletin.

postgres=# SELECT * FROM pg_create_lojik_replication_slot('regresyon_slot', 'test_kod çözme',yanlış,doğru);

yuva_adı| lsn

- - - - - - - - - - - - - - - - - - - - -

regresyon_yuva | 0/16B1970

(1 satır)

2) Bir tablo oluşturun

postgres=# CREATE TABLE verileri(id seri birincil anahtarı, veri metni);

TABLO OLUŞTUR

3) Hazırlama işleminin ve işlemi tamamlamanın kodu çözülmüş çıktı içeriğini tespit edin

postgres=# BAŞLA;

postgres=*# INSERT INTO data(data) VALUES('5');

postgres=*# HAZIRLIK İŞLEMİ 'test_hazırlandı1';

postgres=# SELECT * FROM pg_lojik_slot_get_değişiklikler('regresyon_slot', NULL, NULL);

lsn | xid | veri

- - - - - - - - - - - - - - - - - - -

0/1689DC0 | 529 | BAŞLANGIÇ 529

0/1689DC0 | 529 | tablo genel.veri: INSERT: id[integer]:3 veri[metin]:'5'

0/1689FC0 | 529 | İŞLEMİ HAZIRLAMA 'test_hazırlandı1',txid 529

(3 satır)

postgres=# COMMIT HAZIRLANDI 'test_hazırlandı1';

postgres=# pg_lojik_slot_get_değişiklikler('regresyon_slot', NULL, NULL)'den * öğesini seçin;

lsn | xid | veri

- - - - - - - - - - - - - - - - - - - - - -

0/168A060 | 529 | KABUL HAZIRLANDI 'test_hazırlandı1', txid 529

(4 satır)

postgres=# verilerden * öğesini seçin;

kimlik | veri

------------------

1~5

(1 satır)

gelecek

PG14'ün bu işleve getirdiği değişiklik, hazırlık sırasında kod çözme işleminin iki aşamalı olarak sunulmasına olanak tanıyan kod çözücü tarafı bir altyapıya sahiptir. Bu altyapıdan faydalanmak için test_decoding eklentisini de değiştirdik.

Bir sonraki adım, PG'deki en büyük mantıksal kod çözme eklentisine (pgoutput eklentisi) iki aşamalı desteği uygulamaktır. Bu eklenti mantıksal çoğaltmanın PUBLISHER/SUBSCRIBER modunu destekler. Mantıksal çoğaltmada en yaygın kullanılan eklentidir. Fujitsu OSS ekibi, bu özelliği PG15'e eklemek için açık kaynak topluluğuyla birlikte çalışıyor.

Dağıtılmış veritabanındaki iki aşamalı işlem için PG'nin ayrıca desteklemesi gerekir: beklemedeki makine, ana bilgisayara PREPARE'ın başarısız olduğunu bildirir ve bir geri alma işlemini başlatır. Bu geri bildirim mekanizması PG'de desteklenmemektedir ve gelecekteki iyileştirme yönlerinden biridir.

  Bağlantılar:

6mbi25l-120

rm500uz-2h