Nur Hamim
Nur Hamim Anak desa yang gemar berkomunitas, suka menulis dan mencari hal baru seputar Unix/Linux dan Cloud. Saat ini sedang menempuh pendidikan S1 TI di Unindra dan kebetulan bekerja di PT Biznet GIO Nusantara

Cara Konfigurasi PostgreSQL 12 Replika Streaming di CentOS 8


Cara Konfigurasi PostgreSQL 12 Replika Streaming di CentOS 8

PostgreSQL salah satu databate yang power full yang dapat Anda gunakan sebagai pilihan yang tepat untuk database server.

PostgreSQL mempunyai beberapa solusi replikasi untuk support dan bangun aplikasi yang high-availability, scalable, fault-tolerant application, dan salah satunya Write Ahead Log (WAL) Shipping.

Untuk implementasi replikasi streaming di postgresql minimal ada 2 server/vm dimana satu server akan digunakan sebagai primary (master) dan satu server lagi digunakan sebagai standby (slave).

Secara default, replikasi streaming bersifat asynchronous di mana data ditulis ke server standby setelah transaksi dilakukan di server master, artinya akan ada sedikit penundaan antara melakukan transaksi di server master dan perubahan yang terlihat di server standby . Satu kelemahan dari pendekatan ini adalah jika server master mengalami crash, setiap transaksi yang tidak terikat mungkin tidak dapat direplikasi dan ini dapat menyebabkan kehilangan data.

Pada tutorial kali ini kami akan konfigurasi replikasi streaming master-standby (master – slave) dengan 2 server/vm detailnya sebagai berikut:

Name IP Kegunaan
pg1.nurhamim.my.id 192.168.10.21 Postgresql Primary
pg2.nurhamim.my.id 192.168.10.24 Postgresql Standby

# Instalasi PostgreSQL 12

Pertama yang harus Anda lakukan yaitu instalasi postgresql 12 di masing – masing node postgresql master dan standby.

Dikutip dari tutorial berikut: Cara Install PostgreSQL di CentOS 8 untuk instalasi postgreSQL 12 dapat mengguankan repository default yang sudah ada di CentOS 8 namun Anda juga dapat menambahkan repository manual postgreSQL di CentOS 8 seperti berikut.

Disable module postgresql default CentOS 8

1
2
[root@pg1 ~]# dnf -qy module disable postgresql
[root@pg1 ~]#

Install repository postgresql 12

1
2
[root@pg1 ~]#
[root@pg1 ~]# dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm

Install postgresql 12 menggunakan commmand berikut

1
2
[root@pg1 ~]#
[root@pg1 ~]# dnf install postgresql12 postgresql12-server -y

Inisiasi database postgresql

1
2
3
4
5
[root@pg1 ~]#
[root@pg1 ~]# /usr/pgsql-12/bin/postgresql-12-setup initdb
Initializing database ... OK

[root@pg1 ~]#

Start postgresql dan pastikan statusnya running

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@pg1 ~]#
[root@pg1 ~]# systemctl start postgresql-12
[root@pg1 ~]# systemctl status postgresql-12
● postgresql-12.service - PostgreSQL 12 database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql-12.service; disabled; vendor preset: disabled)
   Active: active (running) since Sun 2020-09-06 12:39:58 UTC; 45s ago
     Docs: https://www.postgresql.org/docs/12/static/
  Process: 6429 ExecStartPre=/usr/pgsql-12/bin/postgresql-12-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
 Main PID: 6434 (postmaster)
    Tasks: 8 (limit: 11328)
   Memory: 17.0M
   CGroup: /system.slice/postgresql-12.service
           β”œβ”€6434 /usr/pgsql-12/bin/postmaster -D /var/lib/pgsql/12/data/
           β”œβ”€6436 postgres: logger
           β”œβ”€6438 postgres: checkpointer
           β”œβ”€6439 postgres: background writer
           β”œβ”€6440 postgres: walwriter
           β”œβ”€6441 postgres: autovacuum launcher
           β”œβ”€6442 postgres: stats collector
           └─6443 postgres: logical replication launcher

Sep 06 12:39:58 pg1.nurhamim.my.id systemd[1]: Starting PostgreSQL 12 database server...
Sep 06 12:39:58 pg1.nurhamim.my.id postmaster[6434]: 2020-09-06 12:39:58.878 UTC [6434] LOG: starting PostgreSQL 12.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.3.1 20191121 (Red Hat 8.3.1-5), 64-bit
Sep 06 12:39:58 pg1.nurhamim.my.id postmaster[6434]: 2020-09-06 12:39:58.879 UTC [6434] LOG: listening on IPv6 address "::1", port 5432
Sep 06 12:39:58 pg1.nurhamim.my.id postmaster[6434]: 2020-09-06 12:39:58.879 UTC [6434] LOG: listening on IPv4 address "127.0.0.1", port 5432
Sep 06 12:39:58 pg1.nurhamim.my.id postmaster[6434]: 2020-09-06 12:39:58.883 UTC [6434] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
Sep 06 12:39:58 pg1.nurhamim.my.id postmaster[6434]: 2020-09-06 12:39:58.893 UTC [6434] LOG: listening on Unix socket "/tmp/.s.PGSQL.5432"
Sep 06 12:39:58 pg1.nurhamim.my.id postmaster[6434]: 2020-09-06 12:39:58.913 UTC [6434] LOG: redirecting log output to logging collector process
Sep 06 12:39:58 pg1.nurhamim.my.id postmaster[6434]: 2020-09-06 12:39:58.913 UTC [6434] HINT: Future log output will appear in directory "log".
Sep 06 12:39:58 pg1.nurhamim.my.id systemd[1]: Started PostgreSQL 12 database server.
[root@pg1 ~]#

Silakan ulangi langkah diatas di node standby (pg2).

# Konfigurasi Replikasi Streaming

# Node Master / Node pg1

Login menggunakan user postgres dan set IP master dapat menerima koneksi dari client manapun seperti berikut

1
2
3
4
5
6
7
[root@pg1 ~]#
[root@pg1 ~]# su - postgres
Last login: Sun Sep 6 12:41:23 UTC 2020 on pts/0
[postgres@pg1 ~]$
[postgres@pg1 ~]$ psql -c "ALTER SYSTEM SET listen_addresses TO '*';"
ALTER SYSTEM
[postgres@pg1 ~]$

Perintah ALTER SYSTEM SET SQL sebuah fitur untuk mengubah parameter konfigurasi server langsung dengan kueri SQL. Konfigurasi disimpan di file postgresql.conf.auto yang terletak di root folder data (misalnya /var/lib/pgsql/12/data/) dan membaca tambahan untuk disimpan di postgresql.conf.

1
2
3
4
5
6
[postgres@pg1 ~]$ createuser --replication -P -e replicator
Enter password for new role:
Enter it again:
SELECT pg_catalog.set_config('search_path', '', false);
CREATE ROLE replicator PASSWORD 'md55c0c06847f1af7be7b811ce4cff39f72' NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN REPLICATION;
[postgres@pg1 ~]$

Keterangan:

-P: Digunakan untuk generate password
-e: Digunakan untuk membuat user

Silakan exit dari shell postgres

1
2
3
4
[postgres@pg1 ~]$
[postgres@pg1 ~]$ exit
logout
[root@pg1 ~]#

Menambahkan rule /var/lib/pgsql/12/data/pg_hba.conf dimana kita akan menambahkan IP server standy di sisi master

1
2
[root@pg1 ~]#
[root@pg1 ~]# vim /var/lib/pgsql/12/data/pg_hba.conf

Tambahkan satu rule replicator seperti dibawah ini

1
2
3
4
5
6
7
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all peer
host replication all 127.0.0.1/32 ident
host replication all ::1/128 ident

host replication replicator 192.168.10.24/27 md5

Noted: Silakan input IP server standby berseta prefix yang digunakan.

Jika sudah silakan simpan dan restart postgresql

1
2
3
[root@pg1 ~]#
[root@pg1 ~]# systemctl restart postgresql-12.service
[root@pg1 ~]#

# Node Stanby / Node pg2

Selanjutnya kita akan konfigurasi di node standy, pertama silakan stop terlebih dahulu postgresql nya

1
2
3
4
[root@pg2 ~]#
[root@pg2 ~]# systemctl stop postgresql-12.service
[root@pg2 ~]# su - postgres
[postgres@pg2 ~]$

Copy default konfigurasi postgresql yang berada di ../data dan silakan hapus semua file yang ada di /data

1
2
3
4
[postgres@pg2 ~]$
[postgres@pg2 ~]$ cp -R /var/lib/pgsql/12/data /var/lib/pgsql/12/data_orig
[postgres@pg2 ~]$ rm -rf /var/lib/pgsql/12/data/*
[postgres@pg2 ~]$

Melakukan backup data yang ada di server master ke standy menggunakan pg_basebackup seperti berikut

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[postgres@pg2 ~]$
[postgres@pg2 ~]$ pg_basebackup -h 192.168.10.21 -D /var/lib/pgsql/12/data -U replicator -v -P -R -X stream -C -S pgstandby1
Password:
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/2000028 on timeline 1
pg_basebackup: starting background WAL receiver
pg_basebackup: created replication slot "pgstandby1"
25553/25553 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/2000100
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: syncing data to disk ...
pg_basebackup: base backup completed
[postgres@pg2 ~]$

Keterangan:

-h : Menentukan host yang merupakan server master.
-D : Menentukan direktori data.
-U : Menentukan pengguna koneksi.
-P : Memungkinkan pelaporan kemajuan.
-v : Mengaktifkan mode verbose.
-R : Mengaktifkan pembuatan konfigurasi pemulihan: Membuat file standby.signal dan menambahkan pengaturan koneksi ke postgresql.auto.conf di bawah direktori data.
-X : Digunakan untuk menyertakan file log depan tulis (file WAL) yang diperlukan dalam cadangan. Nilai aliran berarti mengalirkan WAL saat cadangan dibuat.
-C : Memungkinkan pembuatan slot replikasi yang diberi nama oleh opsi -S sebelum memulai pencadangan.
-S : Menentukan nama slot replikasi.

Ketika proses backup selesai, direktori data baru di server master akan terlihat di server standby seperti berikut:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[postgres@pg2 ~]$
[postgres@pg2 ~]$ ls -lah /var/lib/pgsql/12/data/
total 64K
drwx------ 20 postgres postgres 4.0K Sep 6 13:05 .
drwx------ 5 postgres postgres 68 Sep 6 13:02 ..
-rw------- 1 postgres postgres 224 Sep 6 13:05 backup_label
drwx------ 5 postgres postgres 41 Sep 6 13:05 base
-rw------- 1 postgres postgres 30 Sep 6 13:05 current_logfiles
drwx------ 2 postgres postgres 4.0K Sep 6 13:05 global
drwx------ 2 postgres postgres 32 Sep 6 13:05 log
drwx------ 2 postgres postgres 6 Sep 6 13:05 pg_commit_ts
drwx------ 2 postgres postgres 6 Sep 6 13:05 pg_dynshmem
-rw------- 1 postgres postgres 4.5K Sep 6 13:05 pg_hba.conf
-rw------- 1 postgres postgres 1.6K Sep 6 13:05 pg_ident.conf
drwx------ 4 postgres postgres 68 Sep 6 13:05 pg_logical
drwx------ 4 postgres postgres 36 Sep 6 13:05 pg_multixact
drwx------ 2 postgres postgres 6 Sep 6 13:05 pg_notify
drwx------ 2 postgres postgres 6 Sep 6 13:05 pg_replslot
drwx------ 2 postgres postgres 6 Sep 6 13:05 pg_serial
drwx------ 2 postgres postgres 6 Sep 6 13:05 pg_snapshots
drwx------ 2 postgres postgres 6 Sep 6 13:05 pg_stat
drwx------ 2 postgres postgres 6 Sep 6 13:05 pg_stat_tmp
drwx------ 2 postgres postgres 6 Sep 6 13:05 pg_subtrans
drwx------ 2 postgres postgres 6 Sep 6 13:05 pg_tblspc
drwx------ 2 postgres postgres 6 Sep 6 13:05 pg_twophase
-rw------- 1 postgres postgres 3 Sep 6 13:05 PG_VERSION
drwx------ 3 postgres postgres 60 Sep 6 13:05 pg_wal
drwx------ 2 postgres postgres 18 Sep 6 13:05 pg_xact
-rw------- 1 postgres postgres 325 Sep 6 13:05 postgresql.auto.conf
-rw------- 1 postgres postgres 26K Sep 6 13:05 postgresql.conf
-rw------- 1 postgres postgres 0 Sep 6 13:05 standby.signal
[postgres@pg2 ~]$

Jika di lihat di sisi master saat ini server slave sudah tereplikasi dan running dalam mode β€œHot Standby” dan silakan lihat slot replikasi di sisi server master akan ada menjadi pgstandby1

1
2
3
4
5
6
7
8
9
10
11
[root@pg1 ~]#
[root@pg1 ~]# su - postgres
Last login: Sun Sep 6 12:59:31 UTC 2020 on pts/0
[postgres@pg1 ~]$
[postgres@pg1 ~]$ psql -c "SELECT * FROM pg_replication_slots;"
 slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn
------------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------
 pgstandby1 | | physical | | | f | f | | | | 0/2000000 |
(1 row)

[postgres@pg1 ~]$

Untuk melihat pengaturan koneksi yang ditambahkan di file postgresql.auto.conf, gunakan perintah cat seperti berikut

1
2
3
4
5
6
7
8
[root@pg2 ~]#
[root@pg2 ~]# cat /var/lib/pgsql/12/data/postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
listen_addresses = '*'
primary_conninfo = 'user=replicator password=secret2020 host=192.168.10.21 port=5432 sslmode=prefer sslcompression=0 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'
primary_slot_name = 'pgstandby1'
[root@pg2 ~]#

Selanjutnya silakan start kembali postgresql Anda

1
2
3
[root@pg2 ~]#
[root@pg2 ~]# systemctl start postgresql-12
[root@pg2 ~]#

# Testing Replikasi Streaming

Setelah koneksi berhasil dibuat antara master dan standby, Anda akan melihat proses penerima WAL di server master dengan status streaming, Anda dapat cek menggunakan menamolikan pg_stat_wal_receiver.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@pg2 ~]#
[root@pg2 ~]# su - postgres
Last login: Sun Sep 6 13:02:18 UTC 2020 on pts/0
[postgres@pg2 ~]$
[postgres@pg2 ~]$ psql -c "\x" -c "SELECT * FROM pg_stat_wal_receiver;"
Expanded display is on.
-[RECORD 1]---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
pid | 6195
status | streaming
receive_start_lsn | 0/3000000
receive_start_tli | 1
received_lsn | 0/3000148
received_tli | 1
last_msg_send_time | 2020-09-06 13:11:01.147516+00
last_msg_receipt_time | 2020-09-06 13:11:01.149703+00
latest_end_lsn | 0/3000148
latest_end_time | 2020-09-06 13:11:01.147516+00
slot_name | pgstandby1
sender_host | 192.168.10.21
sender_port | 5432
conninfo | user=replicator password= ******** dbname=replication host=192.168.10.21 port=5432 fallback_application_name=walreceiver sslmode=prefer sslcompression=0 gssencmode=prefer krbsrvname=postgres target_session_attrs=any

[postgres@pg2 ~]$

Dan proses pengirim WAL yang sesuai di master / server utama dengan status streaming dan sync_state async, silakan cek hasil dari pg_stat_replication

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[postgres@pg1 ~]$
[postgres@pg1 ~]$ psql -c "\x" -c "SELECT * FROM pg_stat_replication;"
Expanded display is on.
-[RECORD 1]----+------------------------------
pid | 7323
usesysid | 16384
usename | replicator
application_name | walreceiver
client_addr | 192.168.10.24
client_hostname |
client_port | 59766
backend_start | 2020-09-06 13:10:44.743067+00
backend_xmin |
state | streaming
sent_lsn | 0/3000148
write_lsn | 0/3000148
flush_lsn | 0/3000148
replay_lsn | 0/3000148
write_lag |
flush_lag |
replay_lag |
sync_priority | 0
sync_state | async
reply_time | 2020-09-06 13:12:01.308637+00

[postgres@pg1 ~]$

Selanjutnya test membuat database di master

1
2
3
4
5
6
7
8
9
[postgres@pg1 ~]$
[postgres@pg1 ~]$ psql
psql (12.4)
Type "help" for help.

postgres=#
postgres=# CREATE DATABASE belajarlinux;
CREATE DATABASE
postgres=#

Cek hasil nya di standby

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[postgres@pg2 ~]$
[postgres@pg2 ~]$ psql
psql (12.4)
Type "help" for help.

postgres=# \l
                                   List of databases
     Name | Owner | Encoding | Collate | Ctype | Access privileges
--------------+----------+----------+-------------+-------------+-----------------------
 belajarlinux | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
 postgres | 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)

postgres=#

Saat ini replikasi streaming sudah berjalan dengan semestinya, sebagai tambahan dan ini merupakan opsional jika Anda ingin set antara node master dan standy tidak menggunakan a_synchronous_melainkan synchronous dapat di lakukan dengan cara mengatur nya di sisi master

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[postgres@pg1 ~]$
[postgres@pg1 ~]$ psql -c "ALTER SYSTEM SET synchronous_standby_names TO '*';"
ALTER SYSTEM
[postgres@pg1 ~]$

[root@pg1 ~]#
[root@pg1 ~]# su - postgres
Last login: Sun Sep 6 13:07:41 UTC 2020 on pts/0
[postgres@pg1 ~]$
[postgres@pg1 ~]$ psql -c "\x" -c "SELECT * FROM pg_stat_replication;"
Expanded display is on.
-[RECORD 1]----+------------------------------
pid | 7323
usesysid | 16384
usename | replicator
application_name | walreceiver
client_addr | 192.168.10.24
client_hostname |
client_port | 59766
backend_start | 2020-09-06 13:10:44.743067+00
backend_xmin |
state | streaming
sent_lsn | 0/3000A08
write_lsn | 0/3000A08
flush_lsn | 0/3000A08
replay_lsn | 0/3000A08
write_lag |
flush_lag |
replay_lag |
sync_priority | 1
sync_state | sync
reply_time | 2020-09-06 13:19:13.295971+00

[postgres@pg1 ~]$

Perhatikan gambar diatas saat ini sync_state nya sudah menjadi sync .

Langkah terakhir reload postgresql

1
2
3
[root@pg1 ~]#
[root@pg1 ~]# systemctl reload postgresql-12.service
[root@pg1 ~]#

Selamat mencoba 😁

comments powered by Disqus