PostgreSQL'de Mantıksal Replikasyon (Logical Replication)
- 18 Ağu
- 4 dakikada okunur
Güncelleme tarihi: 20 Ağu
PostgreSQL dünyasında veri kopyalama ve senkronizasyon ihtiyaçları uzun yıllar boyunca fiziksel replikasyon (Streaming Replication) ile çözülmüştür. Ancak fiziksel replikasyonun "ya hep ya hiç" mantığı (tüm kümenin/cluster'ın birebir kopyalanması zorunluluğu), modern ve dağıtık veri mimarilerinin esneklik ihtiyaçlarını karşılamakta yetersiz kalmıştır.

PostgreSQL 10 ile birlikte yerleşik (native) olarak sunulan Mantıksal Replikasyon (Logical Replication), verileri fiziksel disk blokları yerine veri tabanı nesneleri ve satır düzeyindeki mantıksal değişiklikler üzerinden kopyalayarak veri yönetiminde yepyeni bir esneklik dönemi başlatmıştır.
Bu yazıda; mantıksal replikasyonun mimarisini, Yayıncı/Abone (Publish/Subscribe) modelini, fiziksel replikasyondan farklarını, kurulum adımlarını ve ileri düzey yönetimsel dinamiklerini ele alacağız.
1. Mantıksal Replikasyon Nedir ve Nasıl Çalışır?
Mantıksal replikasyon; veri tabanındaki değişikliklerin, SQL seviyesindeki mantıksal veri manipülasyonlarına (INSERT, UPDATE, DELETE, TRUNCATE) dönüştürülerek hedef sunucuya aktarılması ve orada yeniden uygulanması işlemidir.
Bu süreçte PostgreSQL'in temel WAL (Write-Ahead Logging) dosyaları doğrudan kopyalanmaz. Bunun yerine, WAL kayıtları mantıksal olarak çözümlenir (Logical Decoding).
Çalışma Mekanizması:
Yayıncı (Publisher): Değişikliklerin kaynağı olan veri tabanıdır. Belirli tabloları veya tüm veri tabanını içeren bir "Yayın" (Publication) tanımlanır.
Mantıksal Kod Çözme (Logical Decoding): Primary sunucunun WAL kayıtları, bir kod çözücü (decoding plugin - varsayılan olarak pgoutput) tarafından okunarak SQL benzeri mantıksal değişim akışına dönüştürülür.
Abone (Subscriber): Değişiklikleri alan hedef veri tabanıdır. Yayıncıya bağlanarak bir "Abonelik" (Subscription) oluşturur.
Uygulama (Apply Worker): Abone sunucudaki arka plan süreçleri, gelen mantıksal değişiklik akışını okur ve hedef tablolara standart SQL işlemleri gibi uygular.
2. Mantıksal Replikasyon Kurulum Adımları
Mantıksal replikasyon kurulumu, yayıncı ve abone veri tabanları üzerinde karşılıklı tanımlamalar yapılarak gerçekleştirilir.
Adım 1: Yayıncı (Publisher) Yapılandırması
postgresql.conf dosyasında, mantıksal replikasyonu desteklemek için wal_level parametresinin logical olarak ayarlanması zorunludur:
# postgresql.conf (Publisher)
wal_level = logical
max_replication_slots = 10
max_wal_senders = 10Parametre değişikliklerinin ardından PostgreSQL servisi yeniden başlatılmalıdır.
Ardından, abone sunucunun bağlanabilmesi için pg_hba.conf dosyasına erişim izni eklenir:
# pg_hba.conf (Publisher)
host all replicator_user 192.168.1.200/32 scram-sha-256Adım 2: Yayın (Publication) Oluşturma
Yayıncı veri tabanına bağlanarak kopyalanmak istenen tablolar için bir yayın oluşturulur:
-- Sadece belirli tabloları yayınlamak için:
CREATE PUBLICATION urun_yayini FOR TABLE urunler, kategoriler;
-- Veri tabanındaki tüm tabloları yayınlamak için:
CREATE PUBLICATION tum_tablolar_yayini FOR ALL TABLES;Adım 3: Abone (Subscriber) Yapılandırması
Abone olacak sunucuda tabloların şeması (yapısı) önceden oluşturulmuş olmalıdır.
Mantıksal replikasyon tablo yapısını (DDL) otomatik olarak oluşturmaz, sadece içerideki veriyi (DML) taşır.
Yedek sunucuda hedef tablolar oluşturulduktan sonra abonelik tanımlanır:
-- Abonelik oluşturma komutu (Abone veri tabanında çalıştırılır)
CREATE SUBSCRIPTION urun_aboneligi
CONNECTION 'host=192.168.1.100 port=5432 dbname=kaynak_db user=replicator_user password=guvenli_sifre'
PUBLICATION urun_yayini;Bu komut çalıştırıldığı anda:
Yayıncı sunucu üzerinde otomatik olarak bir Logical Replication Slot oluşturulur.
Mevcut verilerin ilk senkronizasyonu (initial data copy) başlar.
İlk senkronizasyon tamamlandıktan sonra, canlı (real-time) veri akışına geçilir.
3. Gelişmiş Özellikler ve Seçenekler
A. Satır ve Sütun Düzeyinde Filtreleme (Row & Column Filtering)
PostgreSQL 15 ve üzeri sürümlerde, yayın oluştururken sadece belirli satırların veya sütunların replike edilmesini sağlayabilirsiniz. Bu, ağ trafiğini azaltmak ve veri güvenliğini sağlamak için mükemmel bir yöntemdir.
-- Sadece aktif olan ve fiyatı 1000'den büyük olan ürünleri replike et (Row Filter):
CREATE PUBLICATION filtrelisatis FOR TABLE urunler WHERE (aktif = true AND fiyat > 1000);
-- Sadece id, urun_adi ve fiyat sütunlarını replike et, hassas verileri gönderme (Column Filter):
CREATE PUBLICATION kisitlisatis FOR TABLE urunler (id, urun_adi, fiyat);B. REPLICA IDENTITY (Benzersizlik Gereksinimi)
Mantıksal replikasyonda UPDATE ve DELETE işlemlerinin hedef tabloda doğru satırı bulup güncelleyebilmesi için tabloda bir Primary Key (Birincil Anahtar) bulunması şarttır.
Eğer tabloda Primary Key yoksa, tablonun REPLICA IDENTITY özelliğinin yapılandırılması gerekir:
-- Tabloda Primary Key yoksa ancak benzersiz (Unique) bir indeks varsa:
ALTER TABLE urunler REPLICA IDENTITY USING INDEX urun_kod_idx;
-- Hiçbir indeks yoksa (Tüm satır değerleri anahtar kabul edilir, performansı düşürür):
ALTER TABLE urunler REPLICA IDENTITY FULL;4. Mantıksal Replikasyonun Yaygın Kullanım Alanları
Sürüm Yükseltme (Zero-Downtime Major Upgrades): Büyük PostgreSQL sürümleri arasında (örneğin PostgreSQL 12'den PostgreSQL 17'ye) veri taşımak ve kesinti süresini sıfıra yakın tutmak için kullanılır.
Veri Ambarı ve Raporlama (Data Warehousing): Üretim (production) veri tabanındaki tüm tablolar yerine sadece raporlama için ihtiyaç duyulan birkaç tablonun analitik veri tabanına senkronize edilmesi.
Veri Konsolidasyonu (Data Consolidation): Farklı ofis veya şubelerdeki yerel veri tabanlarının belirli tablolarını merkezdeki tek bir ortak veri tabanında birleştirmek.
Farklı Platformlar Arası Taşıma: PostgreSQL verilerini bulut platformlarındaki (AWS, GCP, Azure) yönetilen veri tabanı servislerine veya farklı işletim sistemlerine taşımak.
5. Sınırlar ve Bilinmesi Gereken Riskler
DDL Replikasyonu Yoktur: Yayıncı üzerinde ALTER TABLE ile yeni bir sütun eklendiğinde, bu işlem aboneye otomatik yansımaz. Önce abonedeki tabloya ilgili sütun manuel eklenmeli, ardından replikasyon devam ettirilmelidir.
Sequence (Sıralı Sayıcı) Replikasyonu Yoktur: Tablolardaki otomatik artan id değerleri (serial veya identity) aktarılır ancak SEQUENCE nesnesinin kendisi replike edilmez. Failover durumunda sequence değerlerinin manuel senkronize edilmesi gerekir.
Büyük Nesneler (Large Objects): Large Object (lo) veri tipleri mantıksal replikasyon tarafından desteklenmez.
Çakışma Riski (Conflict): Abone veri tabanı yazılabilir olduğu için, dışarıdan aboneye manuel veri girilirse ve aynı anahtara sahip bir veri yayıncıdan gelirse replikasyon çakışma hatası (conflict) vererek durur. Çakışma manuel olarak çözülene kadar veri akışı gerçekleşmez.
Sonuç
PostgreSQL Mantıksal Replikasyonu, veri tabanı mimarlarına inanılmaz bir esneklik ve hareket alanı sağlar. Tüm kümeyi kopyalamak yerine sadece ihtiyacınız olan şemaları taşımak, farklı sürümler arasında köprü kurmak ve hibrit bulut senaryolarını hayata geçirmek mantıksal replikasyon ile son derece pratiktir.
Ancak DDL replikasyonunun olmaması ve çakışma yönetimi gibi operasyonel maliyetler göz önünde bulundurularak, özellikle şema değişikliklerinin sık yaşandığı dinamik projelerde dikkatli bir izleme (monitoring) ve yönetim planı kurgulanmalıdır.
