PostgreSQL’in Yabancı Veri Paketleyicileri – Foreign Data Wrappers

PostgreSQL içerisinde yer alan yabancı sistemlere bağlanarak veri almayı, sorgulamayı mümkün hale getiren Foreign data wrappers (Yabancı Veri Paketleyicileri) eklentileri çok uzun bir zamandan beri mevcut olmakla birlikte, son dönemde hem iyice olgunlaştılar hem de daha çok kullanım alanı buldular. Hele ki günümüzün birden fazla veritabanı markasını içeren kurumsal yapılarında, RDBMS, nosql ve hadoop benzeri dağıtık mimarilerin yaygınlaşması ile birden fazla veri kaynağını aynı anda sorgulamak, ortak cevap getirmek veya konuşturmak için tercüman görevi görmek söz konusu olduğunda çok daha önemli hale geldiler.

Foreign Data Wrappers Nedir?

FDW, Postgres içerisinden harici/uzak/farklı veri sistemlerine doğrudan bağlanmanızı, sorgulamanızı sağlayan tercümanlardır diyebiliriz. Bir eklenti olarak kurulan FDW ile sadece uzak farklı veritabanı sistemlerine bağlanmak ve veri alabilmenin, sorgu gönderebilmenin yanı sıra aynı zamanda yazma işlemi de yapabilmekteyiz. FWD’yi, farklı veri kaynaklarından verileri normalize ederek merkezi bir veritabanına join sorgular oluşturarak çekmek için ETL aracı olarak da kullanmak da mümkün olmakla birlikte, belki en performanslı araç olmayabilir ama şurası kesin ki en hızlı yöntemdir.

Uygulamanız aynı anda iki farklı veritabanı kullanmıyor olabilir, ama sizin iki uygulama arasında entegrasyonu, raporlamayı sağlamak için aynı anda iki veritabanından birlikte veri çekmeye veya bir veritabanındaki bir tabloyu referans olarak kullanıp, diğer veritabanındaki tablodan belirli bir sonuç kümesini getirmeye ihtiyacınız olabilir. Örnekler çoğaltılabilir.

FWD eklentilerinin bir kısmı Postgres üzerinde hazır olarak gelirken, bazıları copyright vs sebeplerden dolayı açık kaynaklı paketin içine dahil edilemezler ve ayrıca indirilmelidirler. Buna örnek MySQL FWD’yi aktif hale getirmeden önce indirip kurmanız gerekir ki bu çok basit bir işlemdir.

Bazı FWD Eklentilerine kısaca göz atalım:

Postgres FDW

Şüphesiz en kolay ve hızlı giriş yapabileceğimiz FWD, Postgres’in kaynak olarak farklı bir host üzerinde olan yine PostgreSQL veritabanına bağlanmak için kullandığımız Potgres FWD olacak. Bir FWD’yi en temel şartları ile kullanıma almanın yolu

  1. CREATE EXTENSION postgres_fdw; ile aktif hale getirmek,
  2. CREATE SERVER ile uç nokta tanımını yapıp bağlantıyı tanımlamak (host/port vs),
  3. CREATE USER MAPPING ile uzak veritabanına bağlanacak olan kullanıcıyı oluşturmak,
  4. CREATE FOREIGN TABLE ile uzak yabancı tabloyu oluşturmak

Bu işlemleri yaptıktan sonra kendi sisteminizdeki veritabanınız üzerinde bir tablo oluştuğunu ve bunun aslında sorgulama esnasında uzak hosttaki tablo üzerinden sorgulama yaptığını göreceksiniz.

MySQL FWD

MySQL FWD’yi indirip kurduktan sonra, sırasıyla uyguladığımız sorgular:

CREATE EXTENSION mysql_fdw;

CREATE SERVER mysql_server
 FOREIGN DATA WRAPPER mysql_fdw
 OPTIONS (host '127.0.0.1', port '3306');

CREATE USER MAPPING FOR postgres
 SERVER mysql_server
 OPTIONS (username ‘tolga’, password ‘gizliparola’);

CREATE FOREIGN TABLE helpdesk_users (
 id integer NOT NULL,
 username varchar(255),
 password varchar(255),
 last_login timestamptz
 )
 SERVER mysql_server;

MongoDB FWD

SQL veritabanından SQL veritabanına bağlanmak tamam, peki ya SQL’den NOSQL’e bağlanırken? Aslında süreç temel olarak MySQL bağlantısını kurarken yaptıklarımız ile aynıdır. Tek değişiklik, son adımda yabancı tabloyu oluştururken, nosql tarafında veri şekilsel olmadığı için, farklı bir yaklaşım izleriz: bir veritabanı ve içerisinde bir kolleksiyon oluşturmalıyız.

CREATE FOREIGN TABLE helpdesk_users(
     _id NAME,
     user_id int,
     user_username text,
     user_last_login timestamptz)
SERVER mongo_server
     OPTIONS (database 'db', collection 'users');

Şimdi artık DML tarzı sorgularımızı Postgres içerisinden SQL kullanarak MongoDB’ye gönderebiliriz veya sonuç getirebiliriz.

SELECT * 
FROM helpdesk_users
WHERE user_last_login >= now() - '1 day'::interval;

veya

DELETE FROM helpdesk_users WHERE user_id = 100;

Bu özelliklerin kullanımı yanında performans penaltısına sebep olabilir, kullanımınıza göre bu değişir. Veri göçü, raporlama, yoğun olmayan kullanımlarda FWD çok işe yarar bir araçtır, ama her zaman, her durumda tavsiye edemeyiz.

Tüm bu yazıda anlattıklarımızın bir kısmı, örneğin yabancı tablolar ile yerel tablolar arasında JOIN kurmak, DML sorguları (DELETE, UPDATE, INSERT vb) PostgreSQL 9.6 sürümü ile duyurulan yeni özelliklerdir. Lütfen güncel sürüm notlarını takip ediniz ve elinizdeki sürümün en az 9.6 olduğundan emin olunuz.

Diğer bazı FWD’ler için: https://wiki.postgresql.org/wiki/Foreign_data_wrappers adresine göz atabilirsiniz. Burada yayınlanmayan bazı FWD’lerin Github üzerinde olduğunu da söyleyelim.