Menü
PostGreSQL 30 Nisan 2026 person Semih

Postgresql 18 Logical Replication

Merhabalar arkadaşlar, bu yazımda sizlere Postgresql 18 üzerinde Logical Replication’ın nasıl yapıldığını anlatmak istiyorum. Benim Logical Replication’ı kullanmam sebebim 13. sürümden 18. Upgrade yapmak içindi ve bu yöntemle yapabildim. Bildiğiniz gibi PSQL13 kullandığınız da Upgrade işlemi yapmak isterseniz bunu Streaming Replication ile yapamıyorsunuz. Bende genel olarak çok büyük boyutlu DB’lerle çalıştığım için Logical Replication ile bu işlemleri gerçekleştirdim.

Ubuntu sisteminizde Postgresql18 kurulu olan makinelerimizde bu işlemi yapacağım ama mantık aynı ondan dolayı 13 ile 18 arasında bu yöntemi sizde kullanabilirsiniz. Daha güncel sürümde anlatmak için iki sistemide 18 kurdum. Bilginize.

NOT : Bu Replication türünde Master DB’de olan tüm yapıyı kullanıcıları, DB’lerin schemalarını vs karşı tarafa manuel olarak taşımanız gerekiyor. Aksi halde PSQL bunları otomatik olarak oluşturmuyor. Aşağıda da ayrıntılı olarak bunu anlattım.

Master Cihazım : 192.168.1.101
Replica Cihazım : 192.168.1.102

Kurulumları tamamladıktan sonra Postgresql.conf ve Pg_Hba.conf dosyasında ayarlamalar da yapmanız gerekiyor bunlarıda yapacağım aynı şekilde.

Replication sırasında kullacağımız user’ı da aşağıdaki komut ile ekleyebilirsiniz. Ayrıca Postgres kullanıcımızda da şifre olmalı aşağıdaki komut ile onuda değiştirmeniz gerekiyor.

> sudo -u postgres createuser -U postgres repuser -P --replication
> ALTER USER postgres WITH PASSWORD 'sis123.,';

direk olarak çalıştırmalı ve şifrelerini girmelisiniz. Bu ayarı iki sistemde de yapmalısınız.

İlk olarak postgresql cihazlarımızın birbirine erişmesi için nano /etc/postgresql/18/main/pg_hba.conf dosyamızda ayarlamaları yapacağım. Dosyayı açtıktan sonra aşağıdaki gibi eklemeler yapmanız gerekiyor.

host    replication     repuser         192.168.1.0/24          scram-sha-256
host    all                       all                   192.168.1.0/24          scram-sha-256
local   all             postgres                                trust (Bunu slave tarafında yapmalısınız. Yoksa db restore yapamıyoruz.)

Ben direk iki cihazıma da bu ayarları ekliyorum ve herhangi bir sorun olmadan birbilerine erişiyorlar. Siz güvenliği daha çok artırmak isterseniz, kendinize göre özelleştirirsiniz bu alanı.

Sonrasında ise en önemli ayarlara geldi. nano /etc/postgresql/18/main/postgresql.conf dosyamıza giriyoruz ve aşağıdaki düzenlemeleri yapıyoruz.

checkpoint_completion_target = 0.9
default_statistics_target = 100
effective_cache_size = 15GB
effective_io_concurrency = 200
hot_standby_feedback = on
listen_addresses = '*'
maintenance_work_mem = 1280MB
max_connections = 300
max_logical_replication_workers = 35
max_parallel_maintenance_workers = 4
max_parallel_workers = 8
max_parallel_workers_per_gather = 4
max_replication_slots = 35
max_wal_senders = 20
max_wal_size = 4GB
max_worker_processes = 20
min_wal_size = 1GB
random_page_cost = 1.1
shared_buffers = 5GB
wal_buffers = 16MB
wal_keep_size= 1000
wal_level = logical
wal_log_hints = on
wal_receiver_status_interval = 5s
work_mem = 2184kB
max_sync_workers_per_subscription = 2

Buradaki ayarlamalar sistemlerinize göre değişeceğini unutmayın. Bu ayarlamaları ben çoğu Streaming Replication sistemimde kullanıyorum. Logical Replication içinde, wal_level kısmındaki ayarımız bunun Logical Replication için kullanıldığını göstermektedir. Ayrıca bu ayarı Logical olarak bırakmanız durumunda Streaming için kullanım sağlayabiliyorsunuz ancak o kısımda da wal boyutları büyüyor. Replica yapmanız durumunda ise sadece Straming Replication’ı kullanabiliyorsunuz.

> sed -i "s/#checkpoint_completion_target = 0.9/checkpoint_completion_target = 0.9/" /etc/postgresql/18/main/postgresql.conf

Birde çok fazla değişiklik yaptığım içinde ilk kurulan PostgreSQL cihazımda komutlarımı sed ile, yukarıdaki komutla hazırlayıp hızlıca dosyada değiştiriyorum. Kullanmak isterseniz sizin içinde bıraktım.

> cat /etc/postgresql/18/main/postgresql.conf | grep -E '^(checkpoint_completion_target|default_statistics_target|effective_cache_size|effective_io_concurrency|hot_standby_feedback|listen_addresses|maintenance_work_mem|max_connections|max_parallel_maintenance_workers|max_parallel_workers|max_parallel_workers_per_gather|max_wal_senders|max_wal_size|max_worker_processes|min_wal_size|random_page_cost|shared_buffers|wal_keep_size|wal_level|wal_log_hints|wal_receiver_status_interval|work_mem|wal_buffers|max_replication_slots|max_logical_replication_workers|max_active_replication_origins)' | sort

Ayrıca ayarlamarını postgresql.conf dosyasında yaptıktan sonra doğrulamak isterseniz de CAT komutumuzu kullanarak görebilirsiniz.

> systemctl restart postgresql

Ayarlamalarımızı tamamladıktan sonra ise PostgreSQL’de uygulanması için restart etmemiz gerekiyor.

Logical Replication’ı yapma zamanı geldi :

İlk olarak sistemdostu adında bir database oluşturacağım ve içerisine birkaç tablo ve data ekleyeceğim aynısını sizde yapın kendi yöntemlerinizle. Tabi bu işlemleri master olan psql1 içerisinde yapıyorum.

İlk olarak Önceden yüklenmiş olan ve diğer database’de uyumsuzluk çıkarmaması için Extension kontrolü yapıyorum ve gereksiz olduklarını düşündüklerimi siliyorum. Bunu aşağıdaki komutlarla yapabilirsiniz. En son komut ile Master DB üzerinde Logical Replication’da kullanacağımız PUBLICATION’ı oluşturuyorum. Bu işlemleri ise psql dedikten yazmaya başlıyorum.

Master DB işlemleri :

> \c sistemdostu
> \dx
> DROP EXTENSION IF EXISTS pglogical CASCADE;
> CREATE PUBLICATION pub_sistemdostu FOR ALL TABLES;

Daha sonra Root kullanıcımıza geçiyoruz ve Logical Replication yapacağımız DB’mizin Schema bilgisini alıyoruz ve diğer cihazımıza atıyoruz. Bunuda pg_dump ve SCP ile yapıyoruz.

> pg_dump -U postgres -h 192.168.1.101 -p 5432 -d sistemdostu --schema-only > sistemdostu_schema.sql
> scp /home/sistemdostu/sistemdostu_schema.sql sistemdostu@192.168.1.102:/home/sistemdostu/

Bu şekilde sistemdostu DB’mizin Schema’sını indirmiş ve Slave DB’ye atmış olduk.

Slave DB işlemleri :

> CREATE DATABASE sistemdostu;
> \c sistemdostu

DB’mizi oluşturmamız gerekiyor, çünkü Logical Replication her şeyin hazır olmasını istiyor. Ondan dolayı yukarıdaki DB Schema’sınıda aldık çünkü aynı şekilde tabloları, schemaları istiyor bu Replication türü. Sonradan eklediğiniz yeni tabloları vs de onlarıda otomatik olarak oluşturmayacak ve eklemeyecek. Yaptığınız her adımı bunları bilerek yapmalısınız.

> psql -U postgres -d sistemdostu -f sistemdostu_schema.sql

Master & Slave DB işlemleri :

> \c sistemdostu
> \dn
GRANT USAGE, CREATE ON SCHEMA public TO repuser;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO repuser;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT ALL PRIVILEGES ON TABLES TO repuser;
ALTER ROLE repuser WITH REPLICATION;

İkinci komutu masterda çalıştırıyorsunuz ve karşı tarafa Schema ile aktardığınız Schema ismini alıp aşağıdaki izinleri o schema adı ile değiştiriyorsunuz. Her bir Schema için bunu yapmalısınız ve iki taraftaki DB’ye bağlanarak bu izinleri iki taraftada vermelisiniz aksi halde Logical Replication gerekli izinler olmadığından dolayı başlamayacaktır.

Slave DB işlemleri :

> \c sistemdostu
> CREATE SUBSCRIPTION sub_sistemdostu
CONNECTION 'host=192.168.1.101 dbname= sistemdostu user=repuser password=sis123., port=5432'
PUBLICATION pub_sistemdostu
WITH (streaming = on);

Komudumuz yardımıyla Logical Replication’ı başlatabilirsiniz. Komutu içerisini düzenlemeyi unutmayın.

> SELECT subid,subname,received_lsn,last_msg_send_time,last_msg_receipt_time,latest_end_lsn,latest_end_time FROM pg_stat_subscription;

Komutunu çalıştırdığınızda aşağıdaki gibi ekran görüntüsü görüyorsanız Logical Replication bağlantısı sağlanmıştır. DB içerisinde datalarınızı sorgulayarak kontrol edebilirsiniz.

Master DB işlemleri :

> select * from pg_replication_slots;

Master tarafta da ise kontrol etmek için komudumuz bu, aynı şekilde kontrol edebilirsiniz.

Eğer PUBLICATION ve SUBSCRIPTION’ları silmek isterseniz ise aşağıdaki komutları kullanabilirsiniz.

> drop publication pub_sistemdostu;
> drop subscription sub_sistemdostu;

Bu şekilde Logical Replication işlemini bitirmiş oluyoruz. Umarım sizler içinde yararlı bir yazı olur. Bana destek vermek isterseniz Sosyal medya kanallarımdan takip edebilirsiniz. Sonraki yazılara kadar hoşçakalın. Kolay gelsin.