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