PostgreSQL 10: Mantıksal – Tablo Bazlı Replikasyon

PostgreSQL 10 ile beraber mevcut Streaming Replication (Fiziksel Replikasyon) özelliğinin yanı sıra Logical Replication (Mantıksal Replikasyon) özelliği geldi. Bu özellik sayesinde daha önce yapamadığımız bazı esnek replikasyon özelliklerini kullanabiliyoruz. Temel olarak Mantıksal Replikasyonu tanımlayacak olursak önce fiziksel, Streaming Replikasyondan farklarını açıklamak daha kolay olacaktır.

Streaming Replikasyon, XLOG kayıtlarının yani verinin fiziksel olarak farklı bir sunucu üzerine sürekli olarak aktarılması anlamına gelmekte. Bu fiziksel veri aktarımı esnasında bazı kısıtlamalarımız mevcuttu. Örneğin bir PostgreSQL cluster’ın tamamını replike edebiliyorduk, sadece bir veritabanı veya tabloyu hedefe gönderemiyorduk. Fiziksel replikasyon, Hot Standby sunucu ihtiyaçlarımızı yani karşı tarafta tüm PostgreSQL sunucunun bir kopyasını (veri, roller, kullanıcılar vb) güncel olarak tutmamızı sağlıyordu.

Mantıksal Replikasyon ise, hedefe istenen bir veritabanındaki bir tablonun veya tabloların üzerinde gerçekleşen değişiklikleri (insert, update, delete) hedefe uygulayan bir yapıya sahiptir. Pub-Sub mantığında çalışır. Kaynak veritabanı sunucusu üzerinde kurulacak olan bir Publication’a Hedef Veritabanı sunucusunun Abone olması (Yayın Aboneliği gibi) şeklindedir. Mantıksal Replikasyon pglogical modülünü kullanarak çalışır.

Mantıksal Replikasyon Özellikleri

  • Logical Replication genellikle replikasyon öğelerini tanımlayan bir birincil anahtar veya tekil anahtar tarafından tanımlanarak belirlenirler (primary key veya unique index).
  • Hedef veritabanı, tablolar üzerinde farklı güvenlik veya erişim tanımlanabilir. Hatta farklı indexler oluşturulabilir.
  • Mantıksal replikasyon, fiziksel replikasyonun aksine farklı sürümler arasında çalışabilir. PostgreSQL (> 9.4, ve üzeri olmak kaydıyla)
  • Mantıksal replikasyon Olay tabanlı filtreleme kullanır, filtreleme kaynak veritabanı tarafında gerçekleştirilerek yayına sunulur.
  • Bir yayına birden fazla abonelik yapılabilir.
  • Daha az verinin seçilerek karşı tarafta güncel tutulması sağlanabilir,  partition yapılmış tablolar da buna dahildir.
  • Xdb Replicator ve benzeri trigger (tetikleyici) bazlı replikasyonlardan çok daha az kaynak tüketir.
  • Veri göçü esnasında kullanılabilir.
  • Veri transformasyonu, yani yayınlanmadan önce replikasyona sunulacak verinin değiştirilmesi sağlanabilir.
  • Kaynak ve hedefteki tablolar farklı sütun sayısına veya sırasına sahip olabilir ancak sütun veri tipleri ve sütun adları aynı olmalıdır.

Ne zaman kullanılabilir?

Mantıksal Replikasyonun (Logical Replication) ne zaman kullanılacağı iyi belirlenmelidir. Halen mevcut yedekleme çözümü olarak Fiziksel Replikasyon (Streaming Replication) öncelikli seçiminiz olmalıdır. Buna karşın;

  • Birden fazla veritabanını analitik çözümlemeler için tek bir veritabanında konsolide etmek isterseniz,
  • Farklı PostgreSQL sürümleri arasında replikasyon yapmak istediğinizde,
  • Artımlı değişiklikleri (incremental changes) başka bir veritabanı üzerinde toplamak istediğinizde,
  • Bazı tabloları replike edip farklı kullanıcı gruplarına farklı yetkiler ile erişim tanımlamak istediğinizde,
  • Kritik veri tutulan tablolardaki bir kısım veriyi farklı kullanıcılara transform ederek göstermek istediğinizde

Mantıksal Replikasyon kullanımı ideal çözüm olacaktır.

Ne zaman kullanılmaz?

  • Tablolar yayınlanan ve abone olunan tarafta aynı isime sahip olmalıdır,
  • Tabloların en azından bir birincil anahtarı (primary key) olmalı veya tekil anahtarı (unique key) olmalıdır,
  • Karşılıklı, iki taraflı (bi-directional) replikasyon mümkün değildir. Sadece bir taraftaki değişiklikler diğer tarafa yansıtılır. (Duruma göre bu hem dezavantaj hem de avantaj olabilir),
  • DDL değişiklikleri, sequences, TRUNCATE karşı tarafa replike edilmez,
  • Aynı host üzerinden abonelik mümkün değildir (abonelik kilitlenecektir).