PolarDB for PostgreSQL memungkinkan proses replikasi fisik dan logis membaca log write-ahead logging (WAL) langsung dari buffer WAL, sehingga mengubah operasi baca I/O menjadi salinan memori. Pendekatan ini secara signifikan mengurangi amplifikasi I/O akibat banyaknya proses replikasi, menghemat bandwidth untuk membaca log WAL, serta menurunkan latensi baca—yang pada gilirannya mengurangi latensi replikasi secara keseluruhan.
Latar Belakang
Pada PostgreSQL native, replikasi dibagi menjadi replikasi fisik dan replikasi logis.
Replikasi fisik: menyinkronkan data antara node primary dan standby dengan mentransfer isi log WAL.
Replikasi logis: menyinkronkan data antara node publisher dan subscriber dengan mentransfer perubahan logis yang didekode dari log WAL.
Satu instans PostgreSQL yang sedang berjalan dapat memiliki beberapa tautan replikasi fisik dan logis secara bersamaan. Setiap tautan memiliki proses WAL sender terkait yang membaca log WAL dari penyimpanan, menguraikannya, lalu mengirimkannya ke sistem downstream melalui jaringan. Kemajuan replikasi setiap tautan bersifat independen.
Karena kemajuan replikasi setiap tautan bersifat independen, setiap proses replikasi harus membaca, memproses, dan mengirim seluruh kumpulan log WAL. Ketika terdapat banyak tautan replikasi, bandwidth baca untuk log WAL bisa beberapa kali lebih tinggi daripada bandwidth tulis. Hal ini mengonsumsi banyak operasi input/output per detik (IOPS). Saat sebuah instans berada di bawah tekanan I/O tinggi, volume besar operasi baca log WAL dapat mengganggu I/O baca/tulis operasi bisnis reguler, sehingga memperlambat operasi bisnis dan meningkatkan latensi replikasi.
Pada PostgreSQL asli, saat log WAL dihasilkan, log tersebut pertama-tama ditulis ke buffer WAL. Kemudian, proses latar belakang atau proses reguler menuliskannya ke penyimpanan. Ruang dalam buffer WAL digunakan kembali secara siklik. Oleh karena itu, buffer WAL menyimpan log WAL terbaru—yaitu log yang paling mungkin digunakan oleh proses replikasi.
PolarDB for PostgreSQL mendukung pembacaan log WAL langsung dari buffer WAL, bahkan jika log tersebut telah ditulis ke disk tetapi masih tersedia di buffer. Optimasi ini mengubah operasi baca I/O dari proses replikasi menjadi operasi salinan memori, sehingga secara signifikan mengurangi amplifikasi I/O baca akibat banyaknya proses replikasi, menghemat bandwidth untuk membaca log WAL, serta menurunkan latensi baca log WAL—yang pada gilirannya mengurangi latensi replikasi.
Cakupan
Fitur ini tersedia untuk versi berikut dari PolarDB for PostgreSQL:
PostgreSQL 18 (versi mesin minor 2.0.18.0.1.0 atau lebih baru)
PostgreSQL 17 (versi mesin minor 2.0.17.2.1.0 atau lebih baru)
PostgreSQL 16 (versi mesin minor 2.0.16.6.2.0 atau lebih baru)
PostgreSQL 15 (versi mesin minor 2.0.15.12.4.0 atau lebih baru)
PostgreSQL 14 (versi mesin minor 2.0.14.13.27.0 atau lebih baru)
Anda dapat melihat nomor versi mesin minor di Konsol atau dengan menjalankan pernyataan SHOW polardb_version;. Jika versi mesin minor tidak memenuhi persyaratan, Anda dapat melakukan upgrade versi mesin minor.
Penggunaan
Anda dapat mengaktifkan fitur ini untuk proses replikasi dengan mengatur parameter polar_enable_read_from_wal_buffers ke nilai on. Nilai default-nya adalah on. Untuk informasi lebih lanjut tentang cara mengatur parameter kluster, lihat Set cluster parameters.
Anda dapat menggunakan ekstensi polar_monitor untuk memeriksa statistik hit saat membaca log WAL dari buffer WAL.
Buat ekstensi polar_monitor.
CREATE EXTENSION IF NOT EXISTS polar_monitor;Periksa statistik hit saat membaca log WAL dari buffer WAL.
SELECT * FROM polar_stat_walsnd_xlog_read();Perintah tersebut mengembalikan hasil yang mirip dengan berikut:
pid | hit | hit_bytes | prefetched | prefetched_bytes | read | read_bytes ---------+------+-----------+------------+------------------+------+------------ 3865685 | 2175 | 251583064 | 0 | 0 | 82 | 10628128 3865751 | 2173 | 251582792 | 0 | 0 | 82 | 10628400 (2 rows)
Tabel berikut menjelaskan bidang yang dikembalikan.
Kolom | Tipe Data | Deskripsi |
pid | INTEGER | ID proses (PID) dari proses replikasi. |
hit | BIGINT | Jumlah operasi baca I/O yang langsung mengenai buffer WAL. |
hit_bytes | BIGINT | Jumlah byte yang dibaca oleh operasi I/O yang langsung mengenai buffer WAL. |
prefetched | BIGINT | Jumlah operasi baca I/O yang mengenai cache memori setelah log WAL dipra-ambil dari penyimpanan secara batch. |
prefetched_bytes | BIGINT | Jumlah byte yang dibaca oleh operasi I/O yang mengenai cache memori setelah log WAL dipra-ambil dari penyimpanan secara batch. |
read | BIGINT | Jumlah operasi baca I/O yang membaca log WAL dari penyimpanan. |
read_bytes | BIGINT | Jumlah byte log WAL yang dibaca dari penyimpanan. |