Văn bản giải mã logic của cam kết hai pha trong PostgreSQL 14

Cập nhật: 2/2023/XNUMX

Văn bản giải mã logic của cam kết hai pha trong PostgreSQL 14

Nhóm Fujitsu OSS và cộng đồng mã nguồn mở PostgreSQL đã hợp tác để thêm chức năng giải mã cam kết hai giai đoạn trong bản sao lôgic trong PG14. Hãy cùng xem tính năng này là gì?

lý lịch

Cam kết hai giai đoạn là một cơ chế trong đó các giao dịch được cam kết trong hai giai đoạn. Thường được sử dụng trong cơ sở dữ liệu phân tán để đảm bảo tính nhất quán. Hai giai đoạn của giao dịch là giai đoạn CHUẨN BỊ và giai đoạn CAM KẾT / QUAY LẠI. Các lệnh được gửi trong hai giai đoạn trong PG là:

CHUẨN BỊ GIAO DỊCH

CAM KẾT ĐÃ CHUẨN BỊ

CHUẨN BỊ ROLLBACK ĐÃ CHUẨN BỊ

PG đã hỗ trợ cam kết hai pha trong phiên bản 8.0 và phiên bản 10.0 hỗ trợ sao chép hợp lý. Tuy nhiên, cam kết hai pha chưa bao giờ được hỗ trợ trong việc tái tạo hợp lý. Các lệnh PREPARE TRANSACTION, COMMIT PREPARED và ROLLBACK PREPARED đã được hỗ trợ trong một trường hợp duy nhất, nhưng khi các lệnh này cần được sao chép một cách hợp lý vào máy chờ, chúng không còn giữ nguyên ý nghĩa ban đầu. Lệnh PREPARE TRANSACTION được coi như một NOP và hoàn toàn không được giải mã. Lệnh COMMIT PREPARED được coi là COMMIT và lệnh ROLLBACK PREPARED được coi là ABORT.

Cam kết hai giai đoạn là gì

Cam kết hai pha là một giao thức cam kết nguyên tử giúp duy trì tính nhất quán giữa các cơ sở dữ liệu phân tán. Các cam kết thông thường cung cấp tính nguyên tử trong cơ sở dữ liệu không đủ để cung cấp tính nhất quán cho các giao dịch cơ sở dữ liệu chéo. Để minh họa vấn đề này, chúng ta hãy đưa ra một ví dụ:

1) John có 300 đô la trong Ngân hàng A

2) Mark có 100 $ trong Ngân hàng B

3) John muốn chuyển 100 đô la cho Mark

Trong quá trình giao dịch, bạn cần rút 100 đô la từ Ngân hàng A sang Ngân hàng B. Khi kết thúc giao dịch, cần có 200 đô la. Nếu bất kỳ giao dịch nào không thành công bất kỳ lúc nào trong quá trình chuyển tiền, trạng thái tài khoản cần được khôi phục về trạng thái trước khi bắt đầu chuyển tiền. Giao dịch có thể không thành công vì nhiều lý do khác nhau. Nếu bất kỳ sự gián đoạn nào xảy ra trước khi giao dịch được thực hiện, giao dịch sẽ được khôi phục lại. Trong ví dụ của chúng tôi, nếu gián đoạn xảy ra khi tài khoản của John bị trừ đi, thì tài khoản của John về cổng gián đoạn sẽ không bị giảm đi. Đây là cách một cam kết đơn giản duy trì tính nhất quán trong cơ sở dữ liệu.

Nhưng chúng tôi xem xét một tình huống như vậy, đó là, giao dịch trừ 100 đô la từ tài khoản của John thành công trong một lần gửi, nhưng giao dịch thêm 100 đô la vào tài khoản của Mark ở Ngân hàng B không thành công và bị lùi lại. Sau khi thao tác này kết thúc, mặc dù tài khoản của John đã được ghi nợ nhưng Mark sẽ không nhận được số tiền. 100 $ đã biến mất. Khi xử lý các giao dịch phân tán, một cam kết đơn giản có thể không thành công.

Thực hiện từng bước các giao dịch phân tán

Đối với cam kết hai giai đoạn, một trong các cơ sở dữ liệu đóng vai trò là người điều phối các giao dịch phân tán.

Giai đoạn 1

Một cơ sở dữ liệu bắt đầu áp dụng các giao dịch, và sau đó chuẩn bị. Nó gửi các giao dịch đã chuẩn bị đến các cơ sở dữ liệu khác dưới dạng các thông điệp chuẩn bị. Cơ sở dữ liệu thứ hai nhận thông báo Chuẩn bị, sau đó chuẩn bị giao dịch. Chuẩn bị liên quan đến những thay đổi trong giao dịch, nhưng không cam kết. Dữ liệu bẩn được ghi vào đĩa để duy trì. Khi tất cả cơ sở dữ liệu đã chuẩn bị giao dịch và tất cả thông tin về giao dịch được lưu trữ trên đĩa, thì giai đoạn chuẩn bị đã hoàn tất.

Giai đoạn 2

Tiếp theo, trọng tài bắt đầu giai đoạn cam kết. Nếu cơ sở dữ liệu thứ hai không thể chuẩn bị giao dịch vì một số lý do, trọng tài sẽ bắt đầu giai đoạn khôi phục. Do đó, tùy thuộc vào việc chuẩn bị có thành công hay không, giao dịch được cam kết hoặc lùi lại. Sự gián đoạn trong giai đoạn cam kết cuối cùng có thể được phục hồi, vì giao dịch chuẩn bị bắt buộc đã được ghi vào đĩa và có thể được áp dụng lại.

Cam kết hai pha không liên quan đến cơ sở dữ liệu đơn phiên bản, nhưng nó có liên quan khi dữ liệu được sao chép qua nhiều phiên bản cơ sở dữ liệu.

Điều rất quan trọng là hỗ trợ cam kết hai giai đoạn trong việc tái tạo hợp lý.

Tổng quan về chức năng

Trước phiên bản PG14, các giao dịch sao chép hợp lý chỉ được giải mã và sao chép sau khi giao dịch được cam kết. Điều này là để tránh giao dịch sao chép cuối cùng có thể bị hủy bỏ.

Giải mã giao dịch khi cam kết

Bản sao hợp lý của PG14 hỗ trợ các lệnh PREPARE TRANSACTION, COMMIT PREPARED và ROOLBACK PREPARED. Khi lệnh CHUẨN BỊ GIAO DỊCH được giải mã, giao dịch sẽ được giải mã và sao chép. CHUẨN BỊ GIAO DỊCH bắt đầu phát lại và giải mã giao dịch giống như COMMIT trong WAL SENDER.

Giải mã giao dịch trong quá trình chuẩn bị

Chúng tôi cũng đã xác định một lệnh gọi lại trình cắm mới để cho phép các trình cắm thêm giải mã logic hỗ trợ gửi hai giai đoạn.

Gọi lại

mô tả

lọc_chuẩn bị_cb

Cho phép plugin lọc các giao dịch không cần giải mã khi chuẩn bị theo GID được sử dụng trong lệnh CHUẨN BỊ GIAO DỊCH

bắt đầu_chuẩn bị_cb

Bắt đầu Chuẩn bị giao dịch

chuẩn bị

Được gọi khi lệnh CHUẨN BỊ GIAO DỊCH được giải mã

cam kết_chuẩn bị_cb

Được gọi khi lệnh COMMIT PREPARED được giải mã

rollback_chuẩn bị_cb

Được gọi khi lệnh ROLLBACK PREPARED được giải mã

Sửa đổi trình cắm

kiểm tra, giải mã

Trình cắm này là trình cắm đầu ra giải mã hợp lý, là một ví dụ để giúp người dùng phát triển trình cắm thêm giải mã hợp lý của riêng họ. test_decoding nhận WAL thông qua một cơ chế giải mã logic và giải mã nó thành một biểu diễn văn bản của hoạt động được thực hiện.

Nó đã được sửa đổi để có thể sử dụng chức năng gọi lại hai giai đoạn mới và giải mã giao dịch trong quá trình chuẩn bị

Sửa đổi API

pg_create_logical_replication_slot ()

API thêm một tùy chọn mới để chỉ định xem vị trí có hỗ trợ cam kết hai giai đoạn hay không. Plugin đầu ra có thể sử dụng một khe sao chép với tùy chọn hai giai đoạn để hỗ trợ cam kết hai giai đoạn.

pg_create_logical_replication_slot (slot_name name , plugin name [, boolean tạm thời , hai_phase boolean])

nghiên cứu trường hợp

Hãy xem cách phát hiện đầu ra được giải mã của giao dịch cam kết hai giai đoạn:

1) Tạo một khe sao chép

Sử dụng test_decoding làm trình cắm đầu ra và chuyển vào true để khe cắm hỗ trợ gửi và giải mã hai giai đoạn.

postgres = # SELECT * FROM pg_create_logical_replication_slot ('regression_slot' , 'test_decoding' , false , true) ;

slot_name | lsn

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

regression_slot | 0 / 16B1970

(1 hàng)

2) Tạo bảng

postgres = # TẠO dữ liệu BẢNG khóa chính nối tiếp id , văn bản dữ liệu) ;

TẠO BẢNG

3) Phát hiện nội dung đầu ra được giải mã của giao dịch chuẩn bị và giao dịch cam kết

postgres = # BEGIN ;

postgres = * # CHÈN VÀO dữ liệu (dữ liệu) GIÁ TRỊ ('5') ;

postgres = * # CHUẨN BỊ GIAO DỊCH 'test_prepared1' ;

postgres = # SELECT * FROM pg_logical_slot_get_changes ('regression_slot' , NULL , NULL) ;

dữ liệu lsn | xid |

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

0 / 1689DC0 | 529 | BẮT ĐẦU 529

0 / 1689DC0 | 529 | bảng public.data : INSERT : id [integer] : 3 data [text] : '5'

0 / 1689FC0 | 529 | CHUẨN BỊ GIAO DỊCH 'test_prepared1' , txid 529

(3 hàng)

postgres = # CAM KẾT CHUẨN BỊ 'test_prepared1' ;

postgres = # select * from pg_logical_slot_get_changes ('regression_slot' , NULL , NULL) ;

dữ liệu lsn | xid |

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

0 / 168A060 | 529 | CAM KẾT CHUẨN BỊ 'test_prepared1' , txid 529

(4 hàng)

postgres = # chọn * từ dữ liệu ;

dữ liệu id |

---- + ------

1 | 5

(1 hàng)

tương lai

Sự thay đổi của PG14 đối với chức năng này có cơ sở hạ tầng phía bộ giải mã cho phép gửi hai giai đoạn giải mã trong quá trình chuẩn bị. Chúng tôi cũng đã sửa đổi plugin test_decoding để tận dụng cơ sở hạ tầng này.

Bước tiếp theo là triển khai hỗ trợ hai giai đoạn cho plugin giải mã logic lớn nhất trong PG-the pgoutput plug-in. Trình cắm này hỗ trợ chế độ PUBLISHER / SUBSCRIBER sao chép lôgic. Nó là plug-in được sử dụng rộng rãi nhất trong sao chép logic. Nhóm Fujitsu OSS đang làm việc với cộng đồng nguồn mở để thêm tính năng này vào PG15.

Đối với giao dịch hai giai đoạn trong cơ sở dữ liệu phân tán, PG cũng cần hỗ trợ: máy dự phòng thông báo cho máy chủ lưu trữ rằng PREPARE đã không thành công và bắt đầu khôi phục. Cơ chế phản hồi này không được hỗ trợ trong PG và là một trong những hướng cải tiến trong tương lai.

  Liên kết:

6mbi25l-120

rm500uz-2h