PostgreSQL Replication Kurulum

Published 11-19-2021 00:00:00

Kurulum Öncesi

Hostname Ip Adres Görevi
master_pg 10.10.10.31 postgresql
replica_pg 10.10.10.32 postgresql

Tüm sunucuların kendi aralarında parolasız erişimi için ssh-key tanımlaması yapılmalıdır.

sudo su

ile yetki alınır.

passwd

ile root kullanıcısına parola tanımlanır.

nano /etc/ssh/sshd_config

bu dosyada açık değilse aşağıdaki satırlar açılır;

Port 22
PermitRootLogin yes
PasswordAuthentication yes

Daha sonra ssh servisi yeniden başlatılır;

systemctl restart ssh

Ardından key tanımlaması yapılır;

ssh-keygen

  Generating public/private rsa key pair.
  Enter file in which to save the key (/root/.ssh/id_rsa):
  Enter passphrase (empty for no passphrase):
  Enter same passphrase again:
  Your identification has been saved in /root/.ssh/id_rsa
  Your public key has been saved in /root/.ssh/id_rsa.pub
  The key fingerprint is:
  SHA256:/edppVq4WCKrwiLURGr+yugRvuR8/VL1bWlnqkgSx70 root@petcd
  The key's randomart image is:
  +---[RSA 3072]----+
  |                 |
  |   .             |
  |  o              |
  | o .    .o.      |
  |o.o    .Soo.. .  |
  |.o..   .o  o.* o.|
  |.+... .....E* *o |
  |B +ooo  oo.+ *o. |
  |oOo. .+o....+oo  |
  +----[SHA256]-----+

tanımlama sonrası oluşan ssh-key replica_pg sunucusuna kopyalanır;

ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.10.10.32

  root@10.10.10.31's password:
  Number of key(s) added: 1
  Now try logging into the machine, with:   "ssh 'root@10.10.10.31'"
  and check to make sure that only the key(s) you wanted were added.
Not: Arzu edilirse daha sonra sshd_config dosyasında parola ile erişim(PasswordAuthentication no) kapatılır.

Yukarıdaki işlemler replica_pg de tekrarlan oluşturulan ssh-key master_pg sunucusuna kopyalanır.

ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.10.10.31

PostgreSQL Kurulumu

Bu adımlar her iki sunucuda ayrı ayrı uygulanır;

apt install postgresql-12 postgresql-client-12 postgresql-contrib -y

Kurulum sonrası varsayılan olarak oluşan küme bilgileri aşağıdaki komut ile görüntülenir;

pg_lsclusters

Ver Cluster Port Status Owner    Data directory              Log file
12  main    5432 online postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log

Ardından aktif tüm PostgreSQL servisleri durdurulur;

systemctl stop postgresql.service && systemctl stop postgresql@12-main.service

Varsayılan küme silinir;

pg_dropcluster 12 main

yeni bir dizine küme oluşturulur;

pg_createcluster 12 main -D /data/patroni

Bu ana kadar ki işlemler her iki sunucuda yapıldıktan sonra replica sunucusunda;

rm -rf /data/patroni/*

dizininin altı silinir.

Master sunucuda;

systemctl start postgresql@12-main

Ardından postgres kullanıcısına geçilir;

su - postgres
postgres@master_pg:~$ psql

postgres=# alter system set listen_addresses TO '*';
ALTER SYSTEM

postgres=# create role replicauser with password '1234' REPLICATION LOGIN;
CREATE ROLE

postgres=# alter user postgres with password '1234';
ALTER ROLE

postgres=# \q

postgres@master_pg:~$ exit

Postgre kullanıcıs ile ilgili işler tamamlandıktan sonra;

nano /etc/postgresql/12/main/pg_hba.conf

dosyası açılarak aşağıdaki bilgiler tanımlanır.

host    replication     replicauser     10.10.10.32/32          trust
Not: host satırına postgres kullanıcısı ile tanımlanan replicauser kullanıcısı ve replica_pg ip adresi girilmelidir.

Daha sonra servis yeniden başlatılır;

systemctl restart postgresql@12-main

Replika sunucuda postgre kullanıcısına geçilir;

su - postgres
Aşağıdaki komutta “–host” kısmına master_pg ip adresi girilir
pg_basebackup --host=10.10.10.31 --pgdata=/data/patroni/ --username=replicauser --verbose --progress --wal-method=stream --write-recovery-conf --checkpoint=fast --create-slot --slot=replica

Komutun çıktısı aşağıdaki şekilde olmalıdır;

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 "replica"
24554/24554 kB (100%), 1/1 tablespace                                         
pg_basebackup: write-ahead log end point: 0/2000138
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: syncing data to disk ...
pg_basebackup: base backup completed

postgre kullanıcısından çıkış yapılır;

postgres@replica_pg: exit

PostgreSQL servisi başlatılır;

systemctl start postgresql@12-main

master_pg sunucuda replikasyonun düzgün çalıştığını kontrolü için;

su - postgres

psql

select * from pg_stat_replication;

komutu çalıştırılır;

pid  | usesysid |   usename   | application_name | client_addr  | client_hostname | client_port |         backend_start         | backend_xmin |   state   | sent_lsn  | write_lsn | 	flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state |          reply_time           
		------+----------+-------------+------------------+--------------+-----------------+-------------+-------------------------------+--------------+-----------+-----------+-----------+-----------+------------+-----------+-----------+------------+---------------+------------+-------------------------------
5285 |    16384 | replicauser | 12/main          | 10.10.10.32 |                 |       38876 | 2021-11-11 14:01:22.818062+00 |              | streaming | 0/3000060 | 0/3000060 | 0/3000060 | 0/3000060  |           |           |            |             0 | async      | 2021-11-11 14:02:03.118212+00
		(1 row)

Yukarıdaki bilgiler bize replikasyonun yapıldığını gösterir.

Kaynak: En sağlam kaynağım DBA Kemal UNCU :)