PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Partisi Replikasi Logis Dengan PostgreSQL 13

Setiap rilis PostgreSQL hadir dengan beberapa peningkatan fitur utama, tetapi yang sama menariknya adalah setiap rilis juga meningkatkan fitur sebelumnya.

Karena PostgreSQL 13 dijadwalkan akan segera dirilis, inilah saatnya untuk memeriksa fitur dan peningkatan apa yang diberikan komunitas kepada kami. Salah satu peningkatan tanpa noise tersebut adalah “Peningkatan replikasi logis untuk partisi”.

Mari kita pahami peningkatan fitur ini dengan contoh yang sedang berjalan.

Terminologi

Dua istilah yang penting untuk memahami fitur ini adalah:

  • Tabel partisi
  • Replikasi Logis

Tabel Partisi

Cara membagi meja besar menjadi beberapa bagian fisik untuk mendapatkan manfaat seperti:

  • Peningkatan kinerja kueri
  • Pembaruan lebih cepat
  • Pemuatan dan penghapusan massal lebih cepat
  • Mengatur data yang jarang digunakan pada drive disk yang lambat

Beberapa keuntungan ini dicapai dengan cara pemangkasan partisi (yaitu perencana kueri menggunakan definisi partisi untuk memutuskan apakah akan memindai partisi atau tidak) dan fakta bahwa sebuah partisi lebih mudah dimasukkan ke dalam memori yang terbatas dibandingkan dengan meja besar.

Sebuah tabel dipartisi berdasarkan:

  • Daftar
  • Hash
  • Rentang

Replikasi Logis 

Sesuai namanya, ini adalah metode replikasi di mana data direplikasi secara bertahap berdasarkan identitasnya (mis. kunci). Ini tidak mirip dengan WAL atau metode replikasi fisik di mana data dikirim byte-by-byte.

Berdasarkan pola Publisher-Subscriber, sumber data perlu menentukan penerbit sedangkan target harus terdaftar sebagai pelanggan. Kasus penggunaan yang menarik untuk ini adalah:

  • Replikasi selektif (hanya sebagian dari database)
  • Penulisan simultan ke dua contoh database tempat data direplikasi
  • Replikasi antara sistem operasi yang berbeda (misalnya Linux dan Windows)
  • Keamanan berbutir halus pada replikasi data 
  • Memicu eksekusi saat data tiba di sisi penerima 

Replikasi Logis untuk Partisi

Dengan manfaat replikasi dan partisi logis, ini adalah kasus penggunaan praktis untuk memiliki skenario di mana tabel yang dipartisi perlu direplikasi di dua instance PostgreSQL.

Berikut adalah langkah-langkah untuk menetapkan dan menyoroti peningkatan yang dilakukan di PostgreSQL 13 dalam konteks ini.

Penyiapan

Pertimbangkan penyiapan dua simpul untuk menjalankan dua instance berbeda yang berisi tabel yang dipartisi:

Langkah-langkah pada Instance_1 adalah seperti di bawah ini setelah login pada 192.168.56.101 sebagai pengguna postgres :

$ initdb -D ${HOME}/pgdata-1

$ echo "listen_addresses = '192.168.56.101'"  >> ${HOME}/pgdata-1/postgresql.conf

$ echo "wal_level = logical"                  >> ${HOME}/pgdata-1/postgresql.conf

$ echo "host postgres all 192.168.56.102/32 md5" >> ${HOME}/pgdata-1/pg_hba.conf

$ pg_ctl -D ${HOME}/pgdata-1 -l logfile start

Setelan 'wal_level' disetel secara khusus ke 'logis' untuk menunjukkan bahwa replikasi logis akan digunakan untuk mereplikasi data dari instance ini. File konfigurasi 'pg_hba.conf' juga telah dimodifikasi untuk memungkinkan koneksi dari 192.168.56.102.

# CREATE TABLE stock_sales

( sale_date date not null, unit_sold  int, unit_price int )

  PARTITION BY RANGE ( sale_date );

# CREATE TABLE stock_sales_y2017 PARTITION OF stock_sales

  FOR VALUES FROM ('2017-01-01') TO ('2018-01-01'); 

# CREATE TABLE stock_sales_y2018 PARTITION OF stock_sales

  FOR VALUES FROM ('2018-01-01') TO ('2019-01-01');

# CREATE TABLE stock_sales_default

  PARTITION OF stock_sales DEFAULT;

Meskipun peran postgres dibuat secara default pada database Instance_1, pengguna terpisah juga harus dibuat yang memiliki akses terbatas – yang membatasi ruang lingkup hanya untuk tabel tertentu.

# CREATE ROLE rep_usr WITH REPLICATION LOGIN PASSWORD 'rep_pwd';

# GRANT CONNECT ON DATABASE postgres TO rep_usr;

# GRANT USAGE ON SCHEMA public TO rep_usr;

# GRANT SELECT ON ALL TABLES IN SCHEMA public to rep_usr;

Penyiapan yang hampir serupa diperlukan di Instance_2

$ initdb -D ${HOME}/pgdata-2

$ echo "listen_addresses = '192.168.56.102'"  >> ${HOME}/pgdata-2/postgresql.conf

$ pg_ctl -D ${HOME}/pgdata-2 -l logfile start

Perlu dicatat bahwa karena Instance_2 tidak akan menjadi sumber data untuk node lain, pengaturan wal_level serta file pg_hba.conf tidak memerlukan pengaturan tambahan. Tak perlu dikatakan, pg_hba.conf mungkin perlu diperbarui sesuai kebutuhan produksi.

Replikasi Logis tidak mendukung DDL, kita juga perlu membuat struktur tabel di Instance_2. Buat tabel yang dipartisi menggunakan pembuatan partisi di atas untuk membuat struktur tabel yang sama di Instance_2 juga.

Pengaturan Replikasi Logis

Pengaturan replikasi logis menjadi lebih mudah dengan PostgreSQL 13. Hingga PostgreSQL 12 strukturnya seperti di bawah ini:

Dengan PostgreSQL 13, publikasi partisi menjadi lebih mudah. Lihat diagram di bawah ini dan bandingkan dengan diagram sebelumnya:

Dengan pengaturan yang mengamuk dengan 100-an dan 1000-an tabel yang dipartisi – perubahan kecil ini menyederhanakan banyak hal.

Dalam PostgreSQL 13, pernyataan untuk membuat publikasi semacam itu adalah:

CREATE PUBLICATION rep_part_pub FOR TABLE stock_sales 

WITH (publish_via_partition_root);

Parameter konfigurasi publish_via_partition_root baru di PostgreSQL 13, yang memungkinkan node penerima memiliki hierarki daun yang sedikit berbeda. Hanya pembuatan publikasi pada tabel yang dipartisi di PostgreSQL 12, akan mengembalikan pernyataan kesalahan seperti di bawah ini:

ERROR:  "stock_sales" is a partitioned table

DETAIL:  Adding partitioned tables to publications is not supported.

HINT:  You can add the table partitions individually.

Mengabaikan batasan PostgreSQL 12, dan melanjutkan dengan menggunakan fitur ini di PostgreSQL 13, kami harus menetapkan pelanggan di Instance_2 dengan pernyataan berikut:

CREATE SUBSCRIPTION rep_part_sub CONNECTION 'host=192.168.56.101 port=5432 user=rep_usr password=rep_pwd dbname=postgres' PUBLICATION rep_part_pub;

Memeriksa apakah Benar-Benar Berfungsi

Kita sudah cukup banyak menyelesaikan seluruh penyiapan, tetapi mari kita jalankan beberapa pengujian untuk melihat apakah semuanya berfungsi.

Pada Instance_1, masukkan beberapa baris untuk memastikan bahwa baris-baris tersebut muncul ke dalam beberapa partisi:

# INSERT INTO stock_sales (sale_date, unit_sold, unit_price) VALUES ('2017-09-20', 12, 151);# INSERT INTO stock_sales (sale_date, unit_sold, unit_price) VALUES ('2018-07-01', 22, 176);

# INSERT INTO stock_sales (sale_date, unit_sold, unit_price) VALUES ('2016-02-02', 10, 1721);

Periksa data di Instance_2:

# SELECT * from stock_sales; 

sale_date  | unit_sold | unit_price

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

 2017-09-20 |    12 |    151

 2018-07-01 |    22 |    176

 2016-02-02 |    10 |   1721

Sekarang mari kita periksa apakah replikasi logis berfungsi meskipun simpul daun tidak sama di sisi penerima.

Tambahkan partisi lain di Instance_1 dan masukkan catatan:

# CREATE TABLE stock_sales_y2019

      PARTITION OF stock_sales 

     FOR VALUES FROM ('2019-01-01') to ('2020-01-01');

# INSERT INTO stock_sales VALUES(‘2019-06-01’, 73, 174 );

Periksa data di Instance_2:

# SELECT * from stock_sales;

 sale_date  | unit_sold | unit_price

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

 2017-09-20 |    12 |    151

 2018-07-01 |    22 |    176

 2016-02-02 |    10 |   1721

 2019-06-01 |    73 |   174

Fitur Partisi Lainnya di PostgreSQL 13

Ada juga perbaikan lain di PostgreSQL 13 yang berhubungan dengan partisi, yaitu:

  1. Peningkatan dalam Gabung antar tabel yang dipartisi
  2. Tabel yang dipartisi sekarang mendukung SEBELUM pemicu tingkat baris

Kesimpulan

Saya pasti akan memeriksa dua fitur mendatang yang disebutkan di atas di kumpulan blog saya berikutnya. Sampai saat itu bahan untuk dipikirkan – dengan kekuatan gabungan dari partisi dan replikasi logis, apakah PostgreSQL berlayar lebih dekat ke pengaturan master-master?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengubah semua kepemilikan objek dalam skema tertentu di PostgreSQL?

  2. Urutan PostgreSQL berdasarkan kolom lain

  3. LOWER() – Konversikan ke Huruf Kecil di PostgreSQL

  4. Cara Bekerja Dengan Database PostgreSQL

  5. Membuat Modul Baru menggunakan PostgreSQL Create Extension