Postgresql Master-Replica Kurulum
Postgresql kendi üzerinde veya ekstra toollar üzerinde çeşitli olarak replica yöntemi sağlar. Bu yazıda Streaming replica ile Postgresql üzerinden Master sunucusunda yazılan verileri, Replica sunucusuna aktarmak için yapılanma işlemini gerçekleştireceğiz.
İki farklı sunucuya ihtiyacımız olacak. Siz isteğinize birden fazla Replica sunucusu tanımlayabilirsiniz. Sunucularda Ubuntu 22.04 LTS ve Postgresql 15 kurulu olarak yapılandırma ile başlıyoruz. Postgresql 15 kurulumu için daha önceki yazıya ulaşabilirsiniz.
Bizim kullanıcağımız sunucu ipleri aşağıdaki gibidir. Sizde ayarları tanımlarken kendi sunucu ipleri ile değiştirmeyi unutmayın.
Master — 172.16.104.130
Replica — 172.16.104.131
Kullanıcı Tanımı, pg_hba.conf ve postgresql.conf Dosyalarının Düzenlenmesi
Buradaki işlemleri her iki sunucuda da yapmanız gerekmektedir.
İlk olarak Replica işlemi için kullanıcı tanımlıyoruz.
# Postgres kullanıcısına geçiş yapıyoruz.
su - postgres
# Psql giriş sağlıyoruz.
psql
# replica adında kullanıcı oluşturup replication özelliğini tanımlıyoruz.
create role replica with replication login;
# replica kullanıcısına bir şifre tanımlıyoruz.
alter user replica password '123456';
# Kullanıcıyı kontrol ediyoruz.
\du
# Postgresql postgresql.conf dosyasının nerede olduğu buluyoruz.
show config_file;
# Postgresql pg_hba.conf dosyasının nerede olduğu buluyoruz.
show hba_file;
# Psql den çıkış yapıyoruz.
\q
İkinci olarak sunucuların bir biri ile haberleşmesi için “pg_hba.conf” dosyasını düzenliyoruz.
# pg_hba.conf dosyasını düzenle.
nano /etc/postgresql/15/main/pg_hba.conf
# Aşağıdaki yetkilendirme tanımlarını giriyoruz.
host replication replica 172.16.104.130/32 md5
host replication replica 172.16.104.131/32 md5
# Kayıt edip çıkıyoruz.
Son olarak Replica işlemlerini aktifleştirmek ve yapılandırmak için “postgresql.conf” dosyasını düzenliyoruz.
# postgresql.conf dosyasını düzenle.
nano /etc/postgresql/15/main/postgresql.conf
# Aşağıdaki tanımları giriyoruz.
listen_addresses = '*'
wal_level = replica
wal_log_hints = on
max_wal_senders = 10
wal_keep_size= 10
wal_receiver_status_interval = 10s
hot_standby_feedback = on
# Kayıt edip çıkıyoruz.
# Ayarların geçerli olması için Postgresql servisini yeniden başlatıyoruz.
systemctl restart postgresql
# Servisin çalıştığına emin oluyoruz.
systemctl status postgresql
Bu aşamaların hepsini her iki sunucuda yapmayı unutmayın.
Veri Aktarımı için Slot Oluşturulması
Buradaki işlemleri sadece master sunucuda yapmanız gerekmektedir.
Master sunucusuna yapılan değişiklerin Replica sunucusuna aktarılması için, Master sunucusuna slot tanımlıyoruz.
# Psql giriş sağlıyoruz.
psql
# Slotu oluşturuyoruz.
select * from pg_create_physical_replication_slot('replica_slot');
# Clusterdaki slotları listeliyoruz.
select * from pg_replication_slots;
# Psql den çıkış yapıyoruz.
\q
Clusterın Silinmesi ve Replica İşleminin Başlatılması
Buradaki işlemleri sadece replica sunucuda yapmanız gerekmektedir.
Replica sunucusundaki mevcut clusterin silip. Master sunucusundaki verileri Replica tarafına aktarabilmel için “pg_basebackup” komutunu kullanacağız. Son olarak Replica için ekstra olarak config ayar tanımlamalarını yaptıktan sonra postgresql servisini yeniden başlatıyoruz.
# Postgres kullanıcısına geçiş yapıyoruz.
su - postgres
# Psql giriş sağlıyoruz.
psql
# Postgresql data file dosyasının nerede olduğu buluyoruz.
show data_directory;
# Psql den çıkış yapıyoruz.
\q
# postgres kullanıcısından çıkıyoruz.
exit
# Postgresql servisini durduruyoruz.
systemctl stop postgresql
# İlk kurulumda otomatik olarak gelen clusteri siliyoruz.
# Adresi yukarıda bulmuştuk.
rm -r /var/lib/postgresql/15/main/
# Master sunucusundaki cluster yapısını "pg_basebackup" komutu ile -
# Replica sunucusuna aktarıyoruz.
# Master IP sini ve yukarıda oluşturduğumuz kullanıcı tanımlamayı unutmayın.
sudo -H -u postgres bash -c 'pg_basebackup --pgdata=/var/lib/postgresql/15/main/ --format=p --write-recovery-conf --checkpoint=fast --label=mffb --progress --host=172.16.104.130 --port=5432 --username=replica'
# Yukarıda oluşturduğumuz replica kullanıcısının şifresini giriyoruz.
# Yeniden oluşan cluster için postgres kullanıcısına yetkisini tanımlıyoruz.
chown -R postgres:postgres /var/lib/postgresql/15/main/
# Son Replica tanımlarını yapmak için postgresql.conf dosyasını düzenliyoruz.
nano /etc/postgresql/15/main/postgresql.conf
# Aşağıdaki bilgileri yukarda işlemlerde nasıl tanımladıysanız.
# Ona göre düzenlemeyi unutmayın.
primary_conninfo = 'host=172.16.104.130 port=5432 user=replica password=123456'
primary_slot_name = 'replica_slot'
# Kayıt edip çıkıyoruz.
# Ayarların geçerli olması için Postgresql servisini yeniden başlatıyoruz.
systemctl restart postgresql
# Servisin çalıştığına emin oluyoruz.
systemctl status postgresql
Replica İşleminin Çalıştığını Kontrol Edelim
Master sunucusunda test için bir DB oluşturalım ve Replica sunucusuna otomatik olarak aktarıldığını kontrol edelim.
# ------- MASTER -------
# Postgres kullanıcısına geçiş yapıyoruz.
su - postgres
# Psql giriş sağlıyoruz.
psql
# Test database oluşturuyoruz.
create database test_db;
# Veritabanlarını listeliyoruz.
\l+
# Psql den çıkış yapıyoruz.
\q
# ------- REPLICA -------
# Postgres kullanıcısına geçiş yapıyoruz.
su - postgres
# Psql giriş sağlıyoruz.
psql
# Veritabanlarını listeliyoruz.
\l+
# Psql den çıkış yapıyoruz.
\q
Master
Replica
“test_db” database otomatik olarak Replica sunucusuna aktarımı sağlandı.
Sizler tablo ve yeni kayıtlar oluşturarak testlerinizi devam edebilirsiniz.