GNU/Linux >> Belajar Linux >  >> Debian

Cara mengatur Replikasi Streaming PostgreSQL dengan Slot Replikasi di Debian 10

PostgreSQL adalah sistem manajemen basis data relasional (RDBMS) yang kuat dan kaya fitur. Ini gratis dan open-source, dan telah dikembangkan sejak tahun 1996. Postgres menawarkan berbagai cara pengarsipan dan replikasi data, salah satunya adalah streaming replikasi. Dalam mode ini, instance utama (master) menangani database aktif utama dan menjalankan operasi. Instans sekunder (slave) menyalin semua perubahan dari primer, mempertahankan salinan identik dari database aktif. Server sekunder juga dapat menerima kueri hanya-baca. Jika primer gagal, server sekunder dapat keluar dari mode siaga dan beroperasi sebagai master baru (ini disebut failover).

Replikasi PostgreSQL biasanya mengandalkan write-ahead logging (WAL), proses logging perubahan data sebelum menulisnya ke disk. Catatan WAL ini kemudian disalin ke node kedua sebagai file (pengiriman log berbasis file), atau langsung dialirkan antar node (replikasi streaming). Dalam kebanyakan kasus, yang terakhir mengurangi penundaan untuk perubahan pada node master yang akan diterima oleh node siaga.

Masalah dengan menggunakan replikasi streaming tanpa pengiriman log berbasis file adalah bahwa server sekunder mungkin kehilangan beberapa catatan WAL jika primer membuangnya terlalu cepat. Sejumlah parameter konfigurasi dapat mengurangi risiko ini tetapi seringkali disertai dengan biaya penyimpanan yang tidak perlu. Solusinya adalah slot replikasi, fitur yang disediakan oleh Postgres yang memastikan server utama hanya membuang catatan WAL setelah diterima oleh node siaga.

Kami akan menyiapkan replikasi streaming dengan slot replikasi pada dua node Debian 10.

Persyaratan

  • Dua instance Debian 10 identik.
  • Akses root ke kedua instance.
  • Variabel lingkungan $EDITOR harus disetel pada kedua instance.

Langkah 1:Menginstal PostgreSQL

Perbarui dan reboot kedua node:

apt update
apt upgrade -y
reboot

Instal Postgres di kedua node dan pastikan PostgreSQL diaktifkan dan dijalankan:

apt install -y postgresql
systemctl enable --now [email protected]

CATATAN:Saat memperbarui PostgreSQL, memperbarui standby terlebih dahulu adalah opsi yang lebih aman menurut dokumentasinya.

Langkah 2:Konfigurasi Awal

Secara default, PostgreSQL hanya mendengarkan pada antarmuka loopback dan tidak dapat diakses secara eksternal. Ubah alamat pendengar di kedua node dengan mengedit postgresql.conf:

$EDITOR /etc/postgresql/11/main/postgresql.conf

Temukan baris berikut:

#listen_addresses = 'localhost'

Ubah ke:

listen_addresses = 'node_ip_address,127.0.0.1'

Jika kedua node berbagi jaringan lokal yang sama, Anda dapat menggunakan alamat pribadi untuk node_ip_address, meskipun Postgres tidak akan dapat diakses internet. Jika tidak, gunakan alamat publik.

Simpan perubahan lalu mulai ulang kedua instance:

systemctl restart [email protected]

Langkah 3:Konfigurasi Master

Langkah ini hanya berlaku untuk server utama/master.

Buka terminal Postgres:

sudo -u postgres psql

Simpul siaga akan menggunakan pengguna untuk terhubung ke master. Buat:

postgres=# CREATE ROLE replicator LOGIN REPLICATION ENCRYPTED PASSWORD 'replicator_password';

Kemudian buat slot replikasi dan keluar:

postgres=# SELECT * FROM pg_create_physical_replication_slot('replicator');
postgres=# \q

Demi kesederhanaan, peran dan slot replikasi diberi nama "replikator", meskipun tidak harus identik.

Selanjutnya, buat entri di pg_hba.conf untuk memungkinkan pengguna replikator terhubung dari standby ke master. Buka:

$EDITOR /etc/postgresql/11/main/pg_hba.conf

Tambahkan baris berikut sampai akhir:

host	replication	replicator	standby_ip_address/32		md5

Mulai ulang instance master:

systemctl restart [email protected]

Langkah 4:Pencadangan dasar

Perintah dalam langkah ini harus dijalankan di server sekunder/slave.

Pertama, hentikan Postgres pada simpul sekunder:

systemctl stop [email protected]

Cadangkan direktori data lama:

mv /var/lib/postgresql/11/main/ /var/lib/postgresql/11/main.bak

Gunakan perintah berikut untuk mengkloning direktori data master ke slave:

pg_basebackup -h master_ip_address -U replicator -D /var/lib/postgresql/11/main/ -P --password --slot replicator

Anda akan dimintai kata sandi. Masukkan kata sandi yang Anda pilih untuk peran replikator selama pembuatannya di master. Setelah transfer selesai, berikan kepemilikan direktori data kepada pengguna postgres:

chown -R postgres:postgres /var/lib/postgresql/11/main

Langkah 5:Konfigurasi Siaga

Langkah ini hanya berlaku untuk server sekunder/slave.

Aktifkan mode siaga panas di postgresql.conf:

$EDITOR /etc/postgresql/11/main/postgresql.conf

Temukan dan batalkan komentar pada baris berikut:

#hot_standby = on

Buat file recovery.conf di direktori data Postgres:

$EDITOR /var/lib/postgresql/11/main/recovery.conf

Aktifkan mode siaga:

standby_mode = 'on'

Setel parameter koneksi replikasi menggunakan kredensial yang dibuat di master:

primary_conninfo = 'host=master_ip_address port=5432 user=replicator password=replicator_password'

Tetapkan nama slot replikasi yang Anda buat di master:

primary_slot_name = 'replicator'

Setel jalur ke file pemicu failover:

trigger_file = '/var/lib/postgresql/11/main/failover.trigger'

Jika parameter trigger_file disetel, Postgres akan keluar dari mode siaga dan memulai operasi normal sebagai server utama saat file pemicu ini dibuat. Parameter ini tidak diperlukan.

Setelah membuat recovery.conf, berikan kepemilikan kepada pengguna postgres:

chown postgres:postgres /var/lib/postgresql/11/main/recovery.conf

Anda sekarang dapat memulai Postgres:

systemctl start [email protected]

Sekarang dalam mode siaga dan harus mereplikasi setiap transaksi baru.

Pengujian

Menguji Replikasi

Untuk menguji replikasi, lakukan tindakan tulis apa pun pada master. Misalnya, buat database baru di master:

sudo -u postgres psql -c "CREATE DATABASE replitest"

Tunggu beberapa detik lalu daftarkan database pada slave:

sudo -u postgres psql -c "\l"

Anda akan melihat bahwa database repost memang direplikasi oleh server standby:

List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 replitest | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

Menguji Kegagalan

CATATAN:Pengujian failover seperti yang ditunjukkan di sini akan memerlukan pengaturan ulang server siaga setelah failover.

Karena Postgres dalam mode siaga, Anda seharusnya tidak dapat melakukan operasi tulis apa pun pada node sekunder sebelum failover. Misalnya, jalankan perintah berikut:

sudo -u postgres psql -c "CREATE DATABASE test"

Perintah harus gagal:

ERROR:  cannot execute CREATE DATABASE in a read-only transaction

Untuk memberi sinyal failover, buat file pemicu yang ditentukan dalam recovery.conf

touch /var/lib/postgresql/11/main/failover.trigger

Tunggu beberapa detik, lalu coba lakukan operasi tulis. Misalnya:

sudo -u postgres psql -c "CREATE DATABASE test2"

Karena Postgres tidak lagi beroperasi sebagai siaga, operasi akan berhasil. Postgres juga akan mengganti nama file recovery.conf Anda menjadi recovery.done, dan akan menghapus file pemicu.

Untuk kembali ke standby, hentikan Postgres pada node sekunder (sebelumnya):

systemctl stop [email protected]

Setel ulang direktori data:

mv /var/lib/postgresql/11/main/ /var/lib/postgresql/11/main.2.bak
pg_basebackup -h master_ip_address -U replicator -D /var/lib/postgresql/11/main/ -P --password --slot replicator
chown -R postgres:postgres /var/lib/postgresql/11/main

Dan buat ulang recovery.conf:

cp /var/lib/postgresql/11/main.2.bak/recovery.done /var/lib/postgresql/11/main/recovery.conf

Terakhir, mulai ulang Postgres:

systemctl start [email protected]

Instans sekunder sekarang kembali ke mode siaga. Anda mungkin ingin menguji ulang replikasi pada saat ini.

Selesai

Hapus database yang tidak perlu pada master node, misalnya:

sudo -u postgres psql
postgres=# DROP DATABASE replitest;

Dan hapus direktori data lama di node siaga Anda:

rm /var/lib/postgresql/11/main.bak -r
rm /var/lib/postgresql/11/main.2.bak -r

Debian
  1. Cara Mengatur Replikasi Sinkron MariaDB Galera Multi-Master menggunakan Debian 10

  2. Cara Menginstal PostgreSQL 11/10 di Debian 9 &Debian 8

  3. Cara Setup IP Failover dengan KeepAlived di Ubuntu &Debian

  1. Cara Setup Server Rsyslog di Debian 11

  2. Cara Setup Opencart dengan LAMP (PHP, Apache, Mariadb) di Debian 11

  3. Cara menginstal Drupal dengan PostgreSQL di VPS Debian 8

  1. Cara mengatur vsftpd di Debian

  2. Cara Menginstal PostgreSQL di Debian 11 / Debian 10

  3. Cara mengatur server surat dengan Exim4 dan DBMail di Debian 7 VPS