Streaming Replikasyon kurulumu

Bu kurulumda herhangi bir yazılım kullanılmamıştır. Postgresql’in gömülü gelen
özellikleri aktif edilmiştir.
db1 makinesi primary/master rolünde ve hem yazma hem de okuma işlemlerine açık
olacak.
db2 sunucusu standby/slave rolünde ve sadece okumalara açık olacak.

Primary sunucudaki adımlar (db1)

Adım 1

# klasörler oluşturulup haklar verilir.
sudo mkdir -p /RA/archive/
sudo mkdir -p /RA/backup
sudo chown -R postgres:postgres /RA

Adım 2

# Veritabanındaki ayarlar
alter system set listen_addresses = '*';
alter system set wal_level = 'replica';
alter system set archive_mode = 'on';
alter system set archive_command = 'test ! -f /RA/archive/%f &&
cp %p /RA/archive/%f';
alter system set hot_standby = 'on';

# Ayarların aktif olması için restart edilir.
sudo systemctl restart postgresql

Adım 3

#Replikasyon kullanıcısı oluşturulur.
create user repuser replication login encrypted password 'sifreniz' connection limit -1;

Adım 4

# Network erişim izinleri verilir.
vim /etc/postgresql/13/main/pg_hba.conf
host   replication   repuser   192.168.56.91/32   md5
host   replication   repuser   192.168.56.92/32   md5

# Ayarların geçerli olması için
psql -c "select pg_reload_conf()"

Standby sunucudaki adımlar (db2)

Adım 1

# Hali hazırda çalışan bir instance varsa durdurulup veritabanı (cluster) silinir.
pg_dropcluster --stop 13 main
rm -rf /var/lib/postgresql/13/main/*

#Klasörler yeniden oluşturulup haklar verilir.
chmod -R 750 /var/lib/postgresql/13/main

Not: Dedike standby olduğu için diğer cluster’lar siliniyor. Standby ile başka cluster/
instance olmasına/çalışmasına engel değildir. Sadece farklı dizinde ve portta olması
yeterli.

Adım 2

# Network erişim izinleri verilir.
vim /etc/postgresql/13/main/pg_hba.conf
host   replication   repuser   192.168.56.91/32   md5
host   replication   repuser   192.168.56.92/32   md5

Adım 3

pg_basebackup -D /var/lib/postgresql/13/main -U repuser -W \
--port=5432 \
--checkpoint=fast \
-h 192.168.56.91 -v -P \
--wal-method=stream \
--write-recovery-conf

Primary sunucudan base backup alınır.

Adım 4

sudo systemctl start postgresql@13-main.service

Not: Eğer slot kullanılmak istenirse aşağıdaki gibi slot oluşturmak gerekir ve yedek
alırken de slot parametresi kullanılmalıdır. Adım 3’teki gibi yedek aldı iseniz bu adıma
gerek yoktur. Bilgi amaçlı verimiştir.

# Primary’ de slot oluşturulur.
select * from pg_create_physical_replication_slot('db1');
select * from pg_create_physical_replication_slot('db2');
# Sorgulama
select slot_name, restart_lsn from pg_replication_slots;
pg_basebackup -D /var/lib/postgresql/13/main \
-X stream \
--write-recovery-conf \
--slot=db2 \
--dbname=”host=192.168.56.91
user=repuser port=5432”

Test edilir.
Primary sunucuda veritabanı ve tablo oluşturulup, standby da sorgulanır.

create database test ;
\c test
create sequence ekip_seq start with 1 increment by 1 no
maxvalue minvalue 1 cache 1;
create table ekip (
ekip_id numeric primary key default nextval('kip_
seq'::regclass),
isim text not null,
şirket text not null,
dogum_yil numeric not null,
dogum_ay numeric not null,
dogum_gun numeric not null
);

# insert test veri
insert into ekip (isim, şirket, dogum_yil, dogum_ay, dogum_gun)
values ('Ahmed','dataera',1983,03,20);
insert into ekip (isim, şirket, dogum_yil, dogum_ay, dogum_gun)
values ('Mehmed','dataera',1990,08,12);
commit ;

Standby sunucuda kontrol edilir.

psql -d test
est=# select * from ekip ;
ekip_id | isim | şirket | dogum_yil | dogum_ay | dogum_gun
---------+--------+---------+-----------+----------+-----------
3 | Ahmed  | dataera | 1983 | 3 | 20
4 | Mehmed | dataera | 1990 | 8 | 12
(2 rows)

Görüldüğü üzere 2 kayıt standby sunucuya replike edilmiş.

select pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 row)

Standby sunucunun recovery modda olduğu görülür.

Monitoring ve Öneriler

Primary


select * from pg_stat_replication;

Standby


select * from pg_stat_wal_receiver;
  • Standby ve Primary sunucu aynı donanım ve kaynaklara sahip olması önerilir.
  • Mümkün olduğunca tüm ayarlar aynı olmalı.
  • Hostname, veritabanı ve stanza (pgbackrest) isimleri karışıklığa neden olmayacak
    şekilde, anlaşılır verilmeli.
  • Sunucuların NTP ayarları yapılmalı ve saatleri kontrol edilmeli.
  • Zabbix vb. monitoring araçları ve scriplerle sürekli monitor edilmeli, standby
    sunucuların geride kalması durumunda bir alarm mekanizması kurulmalı. Internette
    script bulunabileceği gibi mail ile talepte bulunursanız biz de paylaşabiliriz.

Not:
“FATAL: could not receive data from WAL stream: ERROR:
requested WAL segment 000000……… has already been removed “

Gibi bir hata alınırsa arşivlenmiş WAL dosyasını standby sunucuda $PGDATA/pg_wal
dosyasına kopyalanması yeterlidir.

scp /RA/archive/0000…. db2:/var/lib/postgresql/13/main/pg_wal/

Kategori seçin...