Write-ahead log là một tính năng của PostgreSQL database được dùng để log tất cả những thay đổi của database trước khi những thay đổi này được apply. Write-ahead log sẽ sử dụng một tập tin để ghi nhận những thay đổi của database theo một thứ tự nhất định. Nhờ vậy mà trong trường hợp gặp sự cố hay mất điện, dữ liệu sẽ không bị mất vì những thay đổi của database đã được ghi vào tập tin write-ahead log, PostgreSQL có thể dễ dàng restore dữ liệu dựa vào tập tin log này.
Logical decoding là một implementation của PostgreSQL dùng để decode nội dung của tập tin write-ahead log thành những dữ liệu hoặc SQL statement, để có thể được sử dụng bởi các bên thứ ba. Và Debezium, một công cụ về data change capture, sử dụng tính năng này để hiện thực việc hỗ trợ data change capture cho PostgreSQL đó các bạn! Trong bài viết này, mình sẽ hướng dẫn các bạn cách cấu hình write-ahead log của PostgreSQL sử dụng logical decoding để Debezium có thể capture data change của PostgreSQL database các bạn nhé!
Đầu tiên, các bạn có thể sử dụng câu SQL sau để kiểm tra hiện tại write-ahead log của PostgreSQL có giá trị như thế nào:
1 |
SELECT * from pg_settings where name = 'wal_level'; |
Hoặc các bạn cũng có thể một câu SQL khác, như sau:
1 |
SHOW wal_level |
cũng được.
Kết quả của mình như sau:
Có 3 giá trị của wal_level mà các bạn có thể set là minimal, replica và logical:
- minimal thì PostgreSQL sẽ remove tất cả các log ngoại trừ các thông tin cần thiết để PostgreSQL có thể recover nếu bị mất điện hoặc crash.
- replica thì PostgreSQL sẽ log đủ dữ liệu để hỗ trợ write-ahead log thực hiện việc archive và replication.
- logical thì PostgreSQL sẽ thêm các thông tin cần thiết để hỗ trợ cho tính năng logical decoding của PostgreSQL.
Với mục đích của từng level như trên, các bạn cũng có thể thấy, chúng ta cần cấu hình wal_level với giá trị logical, đúng không các bạn?
Để làm được điều này, các bạn hãy mở tập tin postgresql.conf trong thư mục cài đặt của PostgreSQL, tìm cấu hình về wal_level trong tập tin postgresql.conf này và change giá trị mặc định là replica sang giá trị logical các bạn nhé!
Của mình như sau:
Các bạn cũng cần phải cấu hình enable để sử dụng một logical decoding output plugin để plugin này có thể tạo ra một tập tin output mà Debezium có thể sử dụng được. Plugin này có thể là:
- decoderbufs ở địa chỉ https://github.com/debezium/postgres-decoderbufs. Các bạn cần build và cài đặt plugin này vì mặc định PostgreSQL không có sẵn.
- hoặc là pgoutput: một output plugin standard của PostgreSQL. Đây là một plugin có sẵn nên các bạn không cần phải làm gì thêm cả!
Các bạn có thể sử dụng pgoutput plugin bằng cách sửa giá trị của cấu hình shared_preload_libraries trong tập tin postgresql.conf như sau các bạn nhé:
1 |
shared_preload_libraries = 'pgoutput' |
Sau khi chỉnh sửa và lưu lại các thay đổi, các bạn cần restart lại PostgreSQL server để các thay đổi này có hiệu lực các bạn nhé!
Chạy lên một trong 2 câu SQL ở trên, các bạn sẽ thấy wal_level đã được gán giá trị là logical, như mình như sau:
Kiểm tra logical decoding output plugin sử dụng câu SQL:
1 |
SHOW shared_preload_libraries |
các bạn sẽ thấy kết quả như sau:
Như vậy là chúng ta đã cấu hình thành công data change capture sử dụng Debezium cho PostgreSQL database rồi đó các bạn!