DEV Community

Sihar Simbolon
Sihar Simbolon

Posted on • Edited on

Backup dan Replikasi PostgreSQL 12 menggunakan pgBackRest di CentOS 7

Berawal dari kesulitan saya mencari tutorial tentang backup dan replikasi postgresql menggunakan pgbackrest, akhir saya menemukan artikel tentang topik yang sama di dev.to yang ditulis oleh Mehdi Pourfar

Tutorial ini ditujukan untuk development saja.

Environment

CentOS 7.9
PostgreSQL 12.8
pgBackRest 2.35
Enter fullscreen mode Exit fullscreen mode

Server

pgprimary 172.16.16.160
pgreplica 172.16.16.161
pgbackup 172.16.16.162
Enter fullscreen mode Exit fullscreen mode

Instalasi software di server pgprimary, pgreplica dan pgbackup

# vi /etc/yum.repos.d/CentOS-Base.repo
Enter fullscreen mode Exit fullscreen mode

Tambahkan exclude=postgresql* di bagian [base] dan [updates]

[base]
...
exclude=postgresql*

#released updates
[updates]
...
exclude=postgresql*
Enter fullscreen mode Exit fullscreen mode

Setting selinux menjadi disabled di /etc/selinux/config

...
SELINUX=disabled
...
Enter fullscreen mode Exit fullscreen mode
sudo yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo yum install postgresql12-server postgresql12-contrib
sudo yum install epel-release
sudo yum install libzstd
sudo yum install pgbackrest
sudo systemctl enable postgresql-12
sudo /usr/pgsql-12/bin/postgresql-12-setup initdb
sudo systemctl start postgresql-12
Enter fullscreen mode Exit fullscreen mode

Create pgbackrest configuration di server pgprimary, pgreplica dan pgbackup

# mkdir -p -m 770 /var/log/pgbackrest
# chown postgres:postgres /var/log/pgbackrest
# mkdir -p /etc/pgbackrest
# mkdir -p /etc/pgbackrest/conf.d
# touch /etc/pgbackrest/pgbackrest.conf
# chmod 640 /etc/pgbackrest/pgbackrest.conf
# chown postgres:postgres /etc/pgbackrest/pgbackrest.conf
Enter fullscreen mode Exit fullscreen mode

Create pgbackrest repository di server pgbackup

# mkdir -p /var/lib/pgbackrest
# chmod 750 /var/lib/pgbackrest
# chown postgres:postgres /var/lib/pgbackrest
Enter fullscreen mode Exit fullscreen mode

Allow user postgres untuk ssh di masing-masing server

# nano /etc/ssh/sshd_config
Enter fullscreen mode Exit fullscreen mode

Pastikan user postgres ada di bagian AllowUsers dan PubkeyAuthentication yes

...
AllowUsers postgres
PubkeyAuthentication yes
...
Enter fullscreen mode Exit fullscreen mode

Restart system sshd

# systemctl restart sshd
Enter fullscreen mode Exit fullscreen mode

Generate public key dan copy key tersebut ke masing-masing server

di server pgprimary
$ ssh-keygen
$ ssh-copy-id postgres@172.16.16.161
$ ssh-copy-id postgres@172.16.16.162

di server pgreplica
$ ssh-keygen
$ ssh-copy-id postgres@172.16.16.160
$ ssh-copy-id postgres@172.16.16.162

di server pgbackup
$ ssh-keygen
$ ssh-copy-id postgres@172.16.16.160
$ ssh-copy-id postgres@172.16.16.161
Enter fullscreen mode Exit fullscreen mode

Setting postgresql.conf di pgprimary

archive_command = 'pgbackrest --stanza=clusterku archive-push %p'
archive_mode = on
listen_addresses = '*'
max_wal_senders = 3
wal_level = replica
Enter fullscreen mode Exit fullscreen mode

Setting pgbackrest di pgprimary
/etc/pgbackrest/pgbackrest.conf

[clusterku]
pg1-path=/var/lib/pgsql/12/data

[global]
repo1-host=172.16.16.162
repo1-host-user=postgres
Enter fullscreen mode Exit fullscreen mode

Restart service postgresql

# systemctl restart postgresql-12
Enter fullscreen mode Exit fullscreen mode

Setting pgbackrest di server pgbackup
/etc/pgbackrest/pgbackrest.conf

[clusterku]
pg1-host=172.16.16.160
pg1-host-user=postgres
pg1-path=/var/lib/pgsql/12/data                                                                                                               

[global]                                                                                                                                  
process-max=2
repo1-path=/var/lib/pgbackrest
repo1-retention-full=4
repo1-host-user=postgres
start-fast=y
Enter fullscreen mode Exit fullscreen mode

Create stanza di server pgbackup

$ pgbackrest --stanza=clusterku --log-level-console=info stanza-create
Enter fullscreen mode Exit fullscreen mode

Cek stanza yang sudah dicreate di server pgbackup pada server pgprimary dan pgreplica

$ pgbackrest --stanza=clusterku --log-level-console=info check

...
INFO: check command end: completed successfully (910ms)
Enter fullscreen mode Exit fullscreen mode

Lakukan backup di server pgbackup

$ pgbackrest --stanza=clusterku --log-level-console=info backup
...
 P00   INFO: expire command end: completed successfully (                                                                             10ms)
Enter fullscreen mode Exit fullscreen mode

Buat penjadwalan di server pgbackup agar backup stanza dilakukan secara periodik.

$ crontab -e
Enter fullscreen mode Exit fullscreen mode

Pada script berikut ini berisi backup full yang dilakukan di hari minggu dan backup diferensial di hari lainnya

30 06  *   *   0     pgbackrest --type=full --stanza=clusterku backup
30 06  *   *   1-6   pgbackrest --type=diff --stanza=clusterku backup
Enter fullscreen mode Exit fullscreen mode

Create user replikasi pada server pgprimary

# su – postgres
$ createuser --replication -P -e replicator
$ exit
Enter fullscreen mode Exit fullscreen mode

Izinkan user replicator diakses dari jaringan server pgreplica dan pgbackup

...
host    replication     replicator      172.16.16.0/24          md5
Enter fullscreen mode Exit fullscreen mode

Restart postgresql di server pgbackup

# systemctl restart postgresql-12
Enter fullscreen mode Exit fullscreen mode

Lakukan konfigurasi pgbackrest pada server pgreplica
/etc/pgbackrest/pgbackrest.conf

[clusterku]
pg1-path=/var/lib/pgsql/12/data
recovery-option=primary_conninfo=host=172.16.16.160 port=5432 user=replicator application_name=replica1

[global]
repo1-host=172.16.16.162
repo1-host-user=postgres
Enter fullscreen mode Exit fullscreen mode

Buat file .pgpass di home directory postgres yang berisi berikut

172.16.16.160:5432:replication:replicator:yourpassword
Enter fullscreen mode Exit fullscreen mode

Lakukan penarikan data postgresql dari server pgprimary di server pgreplica

# systemctl stop postgresql-12
# su - postgres
$ pgbackrest --stanza=clusterku --delta --type=standby --log-level-console=info restore
$ exit
# systemctl start postgresql-12
Enter fullscreen mode Exit fullscreen mode

Selesai

Tambahan
Restore database menggunakan pgbackrest ke waktu tertentu pada server pgprimary

# systemctl stop postgresql-12
# su - postgres
$ pgbackrest --stanza=clusterku --delta --type=time "--target=2021-10-08 09:28:23.201731+07" --target-action=promote restore
$ exit
# systemctl start postgresql-12
Enter fullscreen mode Exit fullscreen mode

Jika dilakukan restore pada server pgprimary, maka perlu dilakukan backup pada server pgbackup dan restore pada server pgreplica (karena saat di lakukan restore pada server pgprimary, sinkronisasi server pgreplica ke server pgprimary hilang).

backup pada server pgbackup

pgbackrest --stanza=clusterku --log-level-console=info backup
Enter fullscreen mode Exit fullscreen mode

restore pada server pgreplica

# systemctl stop postgresql-12
# su - postgres
$ pgbackrest --stanza=clusterku --delta --type=standby restore
$ exit
# systemctl start postgresql-12
Enter fullscreen mode Exit fullscreen mode

Data di server pgreplica menjadi sesuai dengan data di server pgprimary

Langkah-langkah promote server pgreplica menjadi pgprimary

  • sesuaikan konfigurasi pgbackrest di server pgprimary baru (161). Beri tanda # (comment) pada bagian recovery-option
[clusterku]
pg1-path=/var/lib/pgsql/12/data
#recovery-option=primary_conninfo=host=172.16.16.160 port=5432 user=replicator application_name=replica1

[global]
repo1-host=172.16.16.162
repo1-host-user=postgres
Enter fullscreen mode Exit fullscreen mode

Restore pgbackrest di server pgprimary yang baru

# systemctl stop postgresql-12
# su - postgres
$ pgbackrest --stanza=clusterku --delta --type=immediate --target-action=promote restore
$ exit
# systemctl start postgresql-12
Enter fullscreen mode Exit fullscreen mode
  • sesuaikan konfigurasi pgbackrest di server pgbackup
[clusterku]
#rubah ip address di pg1-host dari ip 160 ke 161
pg1-host=172.16.16.161
pg1-host-user=postgres
pg1-path=/var/lib/pgsql/12/data

[global]
process-max=2
repo1-path=/var/lib/pgbackrest
repo1-retention-full=4
repo1-retention-diff=6
repo1-host-user=postgres
start-fast=y
Enter fullscreen mode Exit fullscreen mode
  • lakukan backup di server pgbackup
# su - postgres
$ pgbackrest --stanza=clusterku --log-level-console=info backup
$ exit
Enter fullscreen mode Exit fullscreen mode
  • buat konfigurasi .pgpass di server pgreplica baru (160)
$ touch .pgpass
$ chmod 600 .pgpass
$ nano .pgpass
Enter fullscreen mode Exit fullscreen mode
172.16.16.161:5432:replication:replicator:your_password
Enter fullscreen mode Exit fullscreen mode
  • tambahkan bagian recovery-option di konfigurasi pgbackrest server pgreplica
[clusterku]
...
recovery-option=primary_conninfo=host=172.16.16.161 port=5432 user=replicator application_name=replica1
...
Enter fullscreen mode Exit fullscreen mode
  • stop service postgresql dan lakukan restore
# systemctl stop postgresql-12
# su - postgres
$ pgbackrest --stanza=clusterku --delta --type=standby restore
$ exit
# systemctl start postgresql-12
Enter fullscreen mode Exit fullscreen mode
  • test lakukan perubahan data di server pgprimary baru (161) dan cek apakah data di server pgreplica baru(160) ikut berubah

Top comments (0)