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/
