POSTGRESQL STREAM REPLICATION & CASCADE REPLICATION

Bir tane Master, bu masterdan beslenen bir replika ve bu replikadan stream olarak beslenen bir replica daha kurulumunu ve konfigürasyonunu yapacağız. Postgresql 12.4 major sürümü üzerinde bu işlemleri gerçekleştireceğiz;

ROLEIP
Master192.168.182.121
Replica-1192.168.182.152
Cascade Replica192.168.182.153

Postgresql Cascade replika kurulumu için aşağıdaki adımları her üç sunucu için de yapıyoruz.

# yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

--Major version indirdiğimiz için tüm komponentlerin sonuna major versiyonunu belirtiyoruz belirtmezsek en güncel olanını alacaktir.

# yum install postgresql12-12.4 postgresql12-server-12.4 postgresql12-contrib-12.4 -y

--Postgresql custom directory istiyorsak aşağıdaki şekilde yapılandırma yapmalıyız.

# systemctl edit postgresql-12.service

[Service]
Environment=PGDATA=/postgres/pgsql/12/data


--custom directory yapılandırmayı kontrol edelim

# cat /etc/systemd/system/postgresql-12.service.d/override.conf
[Service]
Environment=PGDATA=/postgres/pgsql/12/data

--postgres user bash_profile dosyamızı düzenleyelim 

if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

[ -f /etc/profile ] && source /etc/profile
[ -f /var/lib/pgsql/.pgsql_profile ] && source /var/lib/pgsql/.pgsql_profile

#PostgreSQL Server Environment Variable Settings.
export LD_LIBRARY_PATH=/usr/pgsql-12/bin
export PATH=/usr/pgsql-12/bin:$PATH
export PGDATA=/postgres/pgsql/12/data


--yapılandırmayı aktifleştirelim

# systemctl daemon-reload

--Veritabanımızı initial hale getirelim;

# /usr/pgsql-12/bin/postgresql-12-setup initdb

--Postgres servislerini enable yaparak sonrasında çalıştıralım

# systemctl enable postgresql-12
# systemctl start postgresql-12

--Postgres userına geçerek psql komut satırından gelen istekleri dinlemesi için aşağıdaki komutu çalıştıralım;

# su - postgres
$ psql
postgres=# ALTER SYSTEM SET listen_addresses TO '*';

Replika veritabanlarındaki postgresql servisleri durdurup master tarafındaki konfigürasyonu yapalım;

--psql komut satrırından replica yapacak schemayı oluşturalım;

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

--rolü kontrol edelim

postgres=# \du
                                    List of roles
 Role name  |                         Attributes                         | Member of
------------+------------------------------------------------------------+-----------
 postgres   | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 replicator | Replication                                                | {}

pg_hba dosyasından erişim izinleriminizi verelim;

$ pwd
/postgres/pgsql/12/data
$ vi pg_hba.conf
--dosyaya aşağıdaki satırlar eklenir.
host    all     all     0.0.0.0/0       trust
host    replication     replicator      192.168.182.152/32       trust

$ vş postgresql.conf
wal_level = logical
wal_log_hints = on
max_wal_senders = 8
max_wal_size = 1GB
hot_standby = on

--Bu ayarların geçerli olabilmesi için

postgres=# SELECT pg_reload_conf();
 pg_reload_conf
----------------
 t
(1 row)


--veya

systemctl reload postgresql-12

Master kısmı test ortamı için hazırlandı arzu eilirse içerisine bir kaç schema , tablespace vs oluşturulabilir,

CREATE ROLE frkdb WITH
LOGIN
SUPERUSER
INHERIT
CREATEDB
CREATEROLE
NOREPLICATION
ENCRYPTED PASSWORD 'Welcome1';

*********

CREATE TABLESPACE tbs_frkdb
OWNER frkdb
LOCATION '/postgres/pgsql/12/data/pg_tblspc/tbs_frkdb';

********
--Normalde data dizinin içerisine tablespace oluşturulmaz ancak olduğu durumlarda ne oluyor diye biz --bu şekilde bir yapılandırma yapıyoruz.

CREATE TABLESPACE tbs_frkdb
OWNER frkdb
LOCATION '/postgres/pgsql/12/data/pg_tblspc/tbs_frkdb';

******

CREATE DATABASE frkdb
WITH
OWNER = frkdb
ENCODING = 'UTF8'
LC_COLLATE = 'en_US.UTF-8'
LC_CTYPE = 'en_US.UTF-8'
TABLESPACE = tbs_frkdb
CONNECTION LIMIT = -1;

Şimdi replica kısımlarını yapılandıralım, replica veritabanlarını kurmuştuk zaten, postgresql servisleri çalışıyorsa durduralım.

# systemctl stop postgresql-12

data sizinleriin altı tamamen silinir, pg_basebackup kızmasın diye. data altında oluşturulmuş bir tablespace varsa (normalde olmaması beklenir) bunun için farklı bir yola dizin oluşturup tablespace maping yapılacaktır.

# pwd
/postgres/pgsql/12/data
# rm -rf *
# su - postgres

--mapping yapılacak tablespace dizini olşuturulur owner postgresql ve izin 700 olmalıdır.
$ mkdir tbs_frkdb
$ chmod 700 tbs_frkdb/
$ ll
total 0
drwx------ 2 postgres postgres 6 Nov  3 10:22 data
drwx------ 2 postgres postgres 6 Nov  3 10:24 tbs_frkdb

pg_basebackup -h 192.168.182.121 -U replicator -p 5432 --tablespace-mapping=/postgres/pgsql/12/data/pg_tblspc/tbs_frkdb=/postgres/pgsql/12/tbs_frkdb -D $PGDATA -Fp -Xs -P -R

WARNING:  could not read symbolic link "pg_tblspc/tbs_frkdb": Invalid argument
33518/33518 kB (100%), 2/2 tablespaces


--postgresql.auto.conf içeriğini kontrol et

$ pwd
/postgres/pgsql/12/data
$ cat postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
listen_addresses = '*'
primary_conninfo = 'user=replicator passfile=''/var/lib/pgsql/.pgpass'' host=192.168.182.121 port=5432 sslmode=prefer sslcompression=0 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'

--standby.signal dosyası oluşmuş mu? kontrol et

$ ls standby.signal
standby.signal

--Postgresql Servisleri başlatılır

# systemctl start postgresql-12

İlk replica kurulumu tamamlandı, şimdi bu replicadan beslenen bir replica daha oluşturacağız. Bunun için farklı bir konfigürasyon gerekmiyor, 192.168.182.152 sunucumuz master gibi davrancak bunun replicası ise 192.168.182.153 olacak.

192.168.182.152 makinesinde ilgili izinleri verelim;

--pg_hba.conf dosyasına aşağıdakileri ekleyelim.

host    all     all     0.0.0.0/0       trust
host    replication     replicator      0.0.0.0/32       trust
host    replication     replicator      192.168.182.153/32       trust

postgres=# SELECT pg_reload_conf();
 pg_reload_conf
----------------
 t
(1 row)

Cascade Replica Sunucusu için konfigürasyonu yapalım; ( 192.168.182.153 )

--Custom dizinimiz ayarlayalım;

# systemctl edit postgresql-12.service

[Service]
Environment=PGDATA=/postgres/pgsql/12/data

# systemctl daemon-reload

--postgres user için bash_profile 

f [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

[ -f /etc/profile ] && source /etc/profile
[ -f /var/lib/pgsql/.pgsql_profile ] && source /var/lib/pgsql/.pgsql_profile

#PostgreSQL Server Environment Variable Settings.
export LD_LIBRARY_PATH=/usr/pgsql-12/bin
export PATH=/usr/pgsql-12/bin:$PATH
export PGDATA=/postgres/pgsql/12/data

--data diznini temzileyelim;

$ cd $PGDATA
$ pwd
/postgres/pgsql/12/data
$ rm -rf *


--tablespace dizinini oluşturalım;
$ mkdir tbs_frkdb
$ chmod 700 tbs_frkdb/

$ pg_basebackup -h 192.168.182.152 -U replicator -p 5432 -D $PGDATA -Fp -Xs -P -R
WARNING:  could not read symbolic link "pg_tblspc/tbs_frkdb": Invalid argument
33521/33521 kB (100%), 2/2 tablespaces

$ cd /postgres/pgsql/12/data/
$ vi postgresql.auto.conf

--Koyu olan kısmı siliyoruz..

# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
listen_addresses = '*'
primary_conninfo = 'user=replicator passfile=''/var/lib/pgsql/.pgpass'' host=192.168.182.121 port=5432 sslmode=prefer sslcompression=0 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'
primary_conninfo = 'user=replicator passfile=''/var/lib/pgsql/.pgpass'' host=192.168.182.152 port=5432 sslmode=prefer sslcompression=0 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'

--ardından postgres servislerini çalıştıryoruz...

# systemctl start postgresql-12

Testlerimizi gerçekleştirelim.

--Masterdan

postgres=# select * from pg_stat_replication;
  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
-------+----------+------------+------------------+-----------------+-----------------+-------------+-------------------------------+--------------+-----------+-----------+-----------+-----------+------------+-----------+-----------
+------------+---------------+------------+-------------------------------
 13105 |    16384 | replicator | walreceiver      | 192.168.182.152 |                 |       58758 | 2021-11-03 11:45:53.240321+03 |              | streaming | 0/3000148 | 0/3000148 | 0/3000148 | 0/3000148  |           |
|            |             0 | async      | 2021-11-03 12:30:46.879242+03
(1 row)


--1.Replicadan

postgres=# select * from pg_stat_replication;
  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
-------+----------+------------+------------------+-----------------+-----------------+-------------+-------------------------------+--------------+-----------+-----------+-----------+-----------+------------+-----------+-----------
+------------+---------------+------------+-------------------------------
 14053 |    16384 | replicator | walreceiver      | 192.168.182.153 |                 |       34206 | 2021-11-03 12:30:00.877699+03 |              | streaming | 0/3000148 | 0/3000148 | 0/3000148 | 0/3000148  |           |
|            |             0 | async      | 2021-11-03 12:32:10.278451+03
(1 row)