Postgresql de replikasyon

Servetbulut
Turknet DBA
Published in
3 min readMar 17, 2021

--

Bu replicasyonu Ubuntu 20.04 ve postgresql 13 için yapılmıştır. Ancak postgresql 10 dan sonraki sürümleri ve linux nun diğer versiyonları için de uygulayabilirsiniz.

postgresql10 dan eski sürümleri için ssh ayarlanması gerekiyor.

ilk önce postgresql.conf dosyalarını ayarlamakla başlıyoruz.

#Master(192.168.190.129)

#Secondary(192.168.190.130)

Ana postgres sunucumuzda(192.168.190.129) postgresql.conf dosyasını açalım.

#Master
sudo nano /etc/postgresql/13/main/postgresql.conf

ve aşağıdaki ayarlamayı yapalım burada bizim ana server ipsi 192.168.190.129 olduğu için onu listen_addresses kısmına ekliyoruz.

#Master
listen_addresses = ‘*,192.168.190.129’

ve port kısmınıda enable edelim.

#Master
port = 5432

aşağılarda wal_level kısmını da enable edip logical yazalım.

#Master
wal_level =logical

aşağıda ki parametleri de enable ediyoruz.

#Master
max_wal_senders = 10 # max number of walsender processes
# (change requires restart)
wal_keep_size = 0 # in megabytes; 0 disables
wal_sender_timeout = 60s # in milliseconds; 0 disables
max_replication_slots = 10 # max number of replication slots
synchronous_standby_names = ''# standby servers that provide syncrep

ve postgresql.conf dosyasında ki ayarlarımız bu kadar bunları da kaydedip çıkıyoruz. Yaptığımız bu değişiklerin çoğusu servisi restart gerektirir, postgresql servisimizi restart ediyoruz.

#Master
systemctl restart postgresql

Ve benzer şekilde bu ayarlamaları replica yapacağımız sunucuda da(192.168.190.130) yapıyoruz.Sadece buraya replica sunucumuzun ip siniz yazalım diğerleri aynı şekilde yapabilirsiniz

#Secondary
listen_addresses = ‘*,192.168.190.130’

Bunları da kaydedip servisimi restart yapıyoruz.

daha sonra ana sunucuda ki pg_hba.conf dosyasını ayarlayacağız.

Dosyamızı açalım.

#Master
sudo nano /etc/postgresql/13/main/pg_hba.conf

Ve ana sunucuda aşağıdaki parametreleri ekleyelim.

#Master
host all all 192.168.190.130/32 md5

Burada 192.168.190.130 olarak yazdığımız ip replica yapacağımız sunucunun ip olduğu için onu ekliyoruz. Bunu da kaydedip çıkıyoruz. Yine servisimizi restart edelim.

Aynı şekilde replica sunucusunda daki pg_hba.conf da bu ayarlamaları yapalım. Ve aşağıdaki parametreyi ekleyelim.

#Secondary
host all all 192.168.190.129/32 md5

Kaydedelim ve servisi restart edelim.

#Secondary
systemctl restart postgresql

Ana sunucumuza geri dönüp;

#Master
sudo ufw allow from 192.168.190.130 to any port 5432

ve tekrar sunucumuzu restart edelim.

#Secondary
sudo systemctl restart postgresql

aşağıdaki komutları iki sunucumuzda çalıştıralım.

#Master
sudo -u postgres psql
#Secondary
sudo -u postgres psql

Her iki taraftada dbleri ekliyoruz.

#Master
CREATE DATABASE deneme;
#Secondary
CREATE DATABASE deneme;

dbleri geçiş yapalım. \c ile connect olacağımız dbyi seçiyoruz.

#Master
\c deneme
#Secondary
\c deneme

ve her iki sunucuya da tabloları ekleyelim.Tablomuzda pk olduğundan emin olalım.

#Master
CREATE TABLE test
(
id SERIAL,
urun TEXT,
fiyat DECIMAL,
CONSTRAINT test_pkey PRIMARY KEY (id)
);
#Secondary
CREATE TABLE test
(
id SERIAL,
urun TEXT,
fiyat DECIMAL,
CONSTRAINT test_pkey PRIMARY KEY (id)
);

Yine her iki tarafa da user’ı açıp o db deki tüm yetkileri veriyoruz.

#Master
CREATE ROLE testuser WITH REPLICATION LOGIN PASSWORD ‘test123’;
GRANT ALL PRIVILEGES ON DATABASE deneme TO testuser;GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO testuser;#Secondary
CREATE ROLE testuser WITH REPLICATION LOGIN PASSWORD ‘test123’;
GRANT ALL PRIVILEGES ON DATABASE deneme TO testuser;GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO testuser;

Ana sunucuya bir publication ekliyoruz ve tablomuzu replicaya dahil ediyoruz.

#Master
CREATE PUBLICATION test_publication;
ALTER PUBLICATION test_publication ADD TABLE test;

replica sunucuya geçiyoruz ve subscription oluşturuyoruz.

#Secondary
CREATE SUBSCRIPTION test_subscription CONNECTION ‘host=192.168.190.129 port=5432 password=test123 user=testuser dbname=deneme’ PUBLICATION test_publication;

daha sonra ana sunucumuza dönüp aşağıdaki kodu çalıştırıyoruz.

#Master
INSERT INTO test (urun, fiyat) VALUES (‘test1’, 124.50), (‘test2’, 61.20), (‘test3’, 9.80);

şimdi replica da test edelim.

#Secondary
SELECT * FROM test;

Not: Subscription başlattıktan sonra eklenen tablolar replica olmuyor onun için tüm tabloları ekledikten sonra subscription başlatmalıyız. Eğer olurda yeni bir tablo eklemek istersek replicasyonu yıkıp yeniden yapmamız gerekiyor.

--

--