PostgreSQL Streaming Replication

Yüsranur Tanrıverdi
3 min readApr 25, 2023

--

Veritabanı bağlamında “replication” bir veritabanının kopyasının oluşturulmasıdır. PostgreSQL’de streaming replication ve logical replication olmak üzere iki temel replication yöntemi bulunur. Logical replication, primary sunucudan standby sunucuya dosya tabanlı log gönderimi mantığıyla çalışır. Bu yazıda streaming replication mantığına ve yapılandırılmasına odaklanılmıştır.

PostgreSQL veritabanında yüksek erişilebilirliğin sağlanması için streaming replication önemli bir adımdır. Primary sunucuda bir transaction gerçekleştiğinde transaction loglar, WAL dosyalarına yazılması beklenmeden standby sunucuya aktarılır. Bu sayede standby sunucu dosya tabanlı log gönderimine göre daha güncel kalır. Streaming replication varsayılan olarak asenkrondur, bu yüzden primary sunucuda bir transaction işleminin gerçekleşmesi ve bunun standby sunucuda görünür hale gelmesi arasında küçük bir gecikme olabilir. Yinede bu gecikme dosya tabanlı log gönderimine göre daha küçüktür.

Streaming replication’ın logical replicationdan farkı primary_conninfo parametresidir. Wal kayıtlarının standby sunucuya aktarılmasını sağlayan primary_conninfo parametresi, standby sunucunun primary sunucuya bağlanması için kullanılan bağlantı bilgilerini içerir. Sunucular arasında başarılı bir şekilde bağlantı kurulduğunda; primary sunucuda walsender process’i, standby sunucuda walreceiver process’i çalışmaya başlar. Walsender wal kayıtlarının standby sunucuya gönderilmesinden sorumludur. Walreceiver ise primary sunucudan standby sunucuya gelen WAL kayıtlarının WAL dosyalarına kaydedilmesinden sorumludur.

Primary_conninfo parametresi PostgreSQL 12'ye kadar recovery.conf yapılandırma dosyası içinde yer almaktaydı. PostgreSQL 12 ile recovery.conf dosyası kaldırıldı ve yerine sunucunun standby modda çalışmasını sağlayan standby.signal dosyası getirildi. Recovery.conf dosyasında bulunan standby_mode paremetresi tamamen kaldırıldı diğer parametreler ise postgresql.conf dosyasına taşındı.

PostgreSQL 14 Streaming Replication Kurulum

Oracle Linux 8 işletim sistemi üzerine PostgreSQL 14 kurulu Master ve Standby olmak üzere iki sunucu mevcut.

Master Sunucu IP: 192.168.154.156
Standby Sunucu IP: 192.168.154.157

Master Sunucuda Yapılacak İşlemler:

postgresql.conf dosyasında aşağıdaki değişiklikler yapılır.

listen_address= '*'
archive_mode = on
archive_command = 'cp %p /pgdata/14/backups/archive/%f'
wal_level = replica
max_wal_senders= 3
max_replication_slots = 4

Arşiv deposu oluşturulur.

mkdir -p /pgdata/14/backups/archive
chmod 750 /pgdata/14/backups/archive
chown postgres:postgres /pgdata/14/backups/archive

postgresql.conf dosyasında yaptığımız değişikliklerin geçerli olması için PostgreSQL servisi restart edilir.

systemctl restart postgresql-14.service

Standby sunucunun master sunucu üzerinde bağlanacağı replikasyon kullanıcısı oluşturulur.

CREATE ROLE replication WITH REPLICATION PASSWORD 'pass' LOGIN

Replication kullanıcısının standby sunucuya erişimi için ve sunucunun dışarıdan gelen tüm bağlantıları dinlemesi için pg_hba.conf dosyasında aşağıdaki düzenlemeler yapılır.

host  replication     replication     192.168.154.157/32        scram-sha-256
# IPv4 local connections:
host all all 0.0.0.0/0 scram-sha-256

pg_hba.conf dosyasındaki değişikliklerin geçerli olması için PostgreSQL servisi reload edilir.

systemctl reload postgresql-14.service

Standby Sunucuda Yapılacak İşlemler:

PostgreSQL servisi durdurulur.

systemctl stop postgresql-14.service

Data dizini boşaltılır.

mv /pgdata/14/data/ /pgdata/14/data_old/

Master sunucudan backup alınır.

pg_basebackup -h 192.168.154.156 -D /pgdata/14/data -U replication -R -v -P -X stream 

PostgreSQL servisi başlatılır.

systemctl start postgresql-14.service

Master sunucuda aşağıdaki sorguyla replication kontrolü yapılabilir.

select * from pg_stat_replication;

Standby sunucuda ağaşıdaki sorguyla recovery modun açık olup olmadığı kontrol edilebilir.

SHOW in_hot_standby;

Umarım faydalı bir içerik olmuştur. Sorularınız olursa bana LinkedIn hesabımdan ulaşabilirsiniz.

--

--