PostgreSQL 12'de Streaming Replication İşlemleri

Zekiye AYDEMİR
4 min readDec 13, 2019

Daha önce Linkedin profilimde paylaştığım yazımı burada da paylaşıyorum.

PostgreSQL 12 ile birlikte bir çok heyecan verici yeni özellik hayatımıza girmiş oldu. Bu yeni yeteneklere ek olarak, replikasyon sürecinde oluşturulan yapılandırma işlemlerinde ciddi bir değişiklik yapıldı. PostgreSQL 8.0 sürümünden bu yana var olan recovery.conf yapılandırma dosyası artık hayatımızda yok.

Peki recovery.conf dosyasına yazdığımız parametreleri artık nereye yazıyoruz? Bu dosyada yer alan parametreler postgresql.conf dosyasına eklendi. Böylece, diğer postgresql.conf parametreleri gibi ALTER SYSTEM komutuyla yönetilmeleri mümkün hale getirildi. Ayrıca önceden recovery.conf dosyasında yapılan en ufak bir değişiklik için PostgreSQL servisini yeniden başlatmak gerekmekteyken, artık bazı parametre değişimleri için sunucuya reload işlemini yaptırmak yeterli. Örnek olarak artık aşağıdaki parametrelerdeki bir değişiklik için reload işlemi yeterli oluyor:

archive_cleanup_command

promote_trigger_file

recovery_end_command

recovery_min_apply_delay

recovery.conf dosyasındaki “standby_mode” parametresi tamamen kaldırıldı, onun yerine “standby.signal” ve “recovery.signal” adlarında sinyal dosyaları getirildi. Yine, recovery.conf dosyasındaki “trigger_file” parametresinin adı “promote_trigger_file“ olarak değiştirildi.

PostgreSQL 12 Kurulumu

Master ve Replica olmak üzere iki ayrı CentOS 7 sunucusunda PostgreSQL 12 kuralım:

yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpmyum install postgresql12 postgresql12-server postgresql12-contrib -y

Sadece Master Sunucu üzerinde aşağıdaki gibi initdb yapalım ve PostgreSQL servisini başlatalım:

/usr/pgsql-12/bin/postgresql-12-setup initdb
systemctl enable postgresql-12
systemctl start postgresql-12

Replikasyon Kurulumu

Master Sunucu İşlemleri

PostgreSQL varsayılan olarak localhost adresini dinler. Replica sunucunun erişimi için master PostgreSQL servisini dışarıdan gelen tüm bağlantıları dinleyecek şekilde ayarlayalım ve replica sunucunun master sunucu üzerinde bağlanacağı replikasyon kullanıcısını oluşturalım:

ALTER SYSTEM SET listen_addresses TO '*';CREATE ROLE replica_user WITH REPLICATION LOGIN;

Kullanıcının oluşturulduğunu psql içinde \du ile kontrol edebilirsiniz:

listen_addresses parametresinde yapılan değişikliğin etkin olabilmesi için PostgreSQL servisini aşağıdaki gibi yeniden başlatalım:

systemctl restart postgresql-12

Oluşturduğumuz replica_user kullanıcısının erişimi için pg_hba.conf dosyasını düzenlememiz gerekiyor:

echo "host    replication     replica_user    Replica_Sunucu_IP/32      trust">>/var/lib/pgsql/12/data/pg_hba.conf

pg_hba.conf dosyasında yapılan bir değişikliğin etkin olabilmesi için Postgres sunucusu reload işlemine ihtiyaç duyar. psql ile bağlanarak aşağıdaki komutla yapabiliriz:

SELECT pg_reload_conf();

Ya da PostgreSQL servisini reload edebiliriz:

systemctl reload postgresql-12

Replica Sunucu İşlemleri

pg_basebackup komutunu kullanarak master sunucu üzerinde bulunan PostgreSQL data dizininin bir kopyasını replica sunucuya alalım:

/usr/pgsql-12/bin/pg_basebackup --host=Master_Sunucu_IP --pgdata=/var/lib/pgsql/12/data/ --username=replica_user --verbose --progress --wal-method=stream --write-recovery-conf --checkpoint=fast --create-slot --slot=Slot_name

Örnek komut çıktısı aşağıdaki gibidir:

Aktarım tamamlandığında replica sunucudaki data dizinini inceleyelim:

recovery.conf dosyasında yer alan “standby_mode” parametresi yerine replikasyondaki /var/lib/pgsql/12/data dizini içinde standby.signal dosyası getirildi.

pg_basebackup komutunda yer alan — write-recovery-conf parametresi ile eskiden recovery.conf dosyasına yazılan recovery ayarları artık postgresql-auto.conf dosyasına yazılır:

Master sunucu üzerinde listen_addresses parametresini değiştirmeyi ALTER SYSTEM komutu ile yapmıştık. Burada ufak bir hatırlatma yapayım ki kafalar karışmasın; ALTER SYSTEM ile değiştirdiğimiz parametreler postgresql.auto.conf içine yazılmakta (dosyanın ilk satırlarında da yazdığı gibi lütfen bu dosyaya elle müdahele etmeyin). Dolayısıyla yukarıdaki çıktıda gözüken listen_addresses parametresi master sunucuda yaptığımız yapılandırma işleminden gelmekte. Tam bu noktada master sunucudaki dosya içeriğini incelerseniz sadece bu parametrenin olduğunu göreceksiniz. pg_basebackup ile master data dizininin bir kopyasını replica sunucusu üzerine kopyaladık, ek olarak da bu dosyaya diğer satırları otomatik olarak yazdırmış olduk. Bu ayrımın netleşmesi önemli. :)

Replica sunucu üzerinde PostgreSQL servisini başlatıp replikasyonu aktif hale getirebiliriz:

systemctl start postgresql-12

Replica sunucu üzerinde veritabanına psql ile bağlanarak replikasyonun çalıştığını aşağıdaki gibi kontrol edebilirsiniz:

SELECT * FROM pg_stat_wal_receiver;

Sorgu çıktısını aşağıdaki gibi düzenli bir görünümle alabilmek için güzel psql özelliklerinden biri olan \x komutunu kullanabilirsiniz:

Master sunucu üzerinden replikasyonu kontrol edelim:

SELECT * FROM pg_stat_replication;

Örnek çıktı aşağıdaki gibidir:

Böylece PostgreSQL 12 ile iki sunucu arasında replikasyon kurulumunu tamamlamış ve önceki Postgres sürümlerine kıyasla değişen yapılandırma sürecini de görmüş olduk.

PostgreSQL 12 üzerinde replikasyon işlemlerine ait daha ayrıntılı bilgiye Postgres’in resmi sitesindeki ilgili adresten erişebilirsiniz.

--

--

Zekiye AYDEMİR

PostgreSQL Certified DBA | MongoDB Certified DBA | AWS Certified Admin