Database Engineering

Çoklu Kalıcılık İçin PostgreSQL'in Kullanımı

Modern mikroservis mimarilerinde, "her şeyi yöneten tek bir veritabanı" yaklaşımı nadiren yeterlidir. Farklı servisler genellikle farklı veri modelleri gerektirir—bazıları ilişkisel verilerin ACID garantilerine ihtiyaç duyar, diğerleri ise belge depolarının esnek şemasını veya özel motorların grafik gezinme yeteneklerini talep eder. Poliglotta kalıcılık olarak bilinen bu mimari desen, alana özgü sorunları çözer ancak veri senkronizasyonunda önemli karmaşıklıklar getirir.

PostgreSQL, bu mimariler için sağlam bir merkezi sinir sistemi olarak öne çıkmıştır. Yerel Mantıksal Replication (Mantıksal Kopyalama) özelliğini Özel Uzantıların (Custom Extensions) genişletilebilirliğiyle birleştirerek, veritabanı mühendisleri tutarlılık veya performansdan ödün vermeden PostgreSQL ile çeşitli veri depoları arasında sorunsuz köprüler kurabilirler.

Veri Senkronizasyonunun Zorluğu

Veri depolarınızı birbirinden ayırdığınızda, kaynak veritabanında (genellikle PostgreSQL) yapılan değişikliklerin aşağı akış sistemlerde (arama için Elasticsearch, ilişkiler için Neo4j veya veri göller için S3 gibi) yansıtılması kritik hale gelir. Geleneksel anket (polling) mekanizmaları verimsizdir ve veri kayması (drift) riskine açıktır. Ayrıca, farklı şemalara değişiklikler uygulamak genellikle bakımı zor karmaşık ETL betiklerini gerektirir.

Çözüm, olay odaklı mimarilerde yatmaktadır. PostgreSQL'in Ön Kayıt Günlüğü (WAL), yapılan tüm değişikliklerin gerçeğini içerir. Bu günlüğe doğrudan erişerek, değişiklikleri diğer sistemlere neredeyse gerçek zamanlı olarak iletebilir ve böylece çoklu kalıcılık ekosisteminizin tutarlılığını sağlayabiliriz.

Mantıksal Replication'ın Uygulanması

Mantıksal Replication, fiziksel akışlı kopyalamadan farklı olarak, değişiklikleri satır seviyesinde kopyalar; böylece veritabanına ulaşmadan önce tabloları filtreleyebilir ve hatta veriyi dönüştürebilirsiniz. Bu, senkronizasyon stratejimizin omurgasını oluşturur.

Bunu kurmak için öncelikle birincil veritabanında bir yayın (publication) tanımlamanız gerekir:

-- PostgreSQL birincil düğümünde bir yayın tanımlayın
CREATE PUBLICATION order_events FOR TABLE orders, order_items;

-- Kopyalama için bir yuva oluşturun
SELECT pg_create_logical_replication_slot('order_slot', 'pgoutput');

Tüketici tarafında (bu başka bir PostgreSQL örneği veya yuvayı okuyan bir uygulama olabilir), veri bir değişim olayları akışı olarak çıkarılır. Ancak ham mantıksal kopyalama sadece taşıma katmanıdır. Çoklu kalıcılıktan tam anlamıyla yararlanmak için bu veriyi canlı olarak dönüştürmemiz gerekir.

PostgreSQL'i Özel Uzantılarla Genişletmek

İşte özel uzantıların parladığı nokta burasıdır. PostgreSQL, C, PL/pgSQL veya hatta Python (PL/Python aracılığıyla) gibi dillerde uzantılar yazmanıza olanak tanır. Mantıksal kopyalama olaylarını dinleyen ve veriyi dönüştürerek harici sistemlere iletmek için gereken ağır işi yapan bir özel uzantı oluşturabiliriz.

Örneğin, `users` tablosundaki `INSERT` olaylarını dinleyen, veriyi hesaplanmış bir zaman damgası ile zenginleştiren ve ardından kullanıcı oturumlarını önbelleğe almak için Redis örneğine asenkron bir HTTP çağrısı yapan bir uzantı hayal edin. Bu, dönüştürme mantığını veri kaynağına yakın tutarak gecikmeyi azaltır.

İşte özel bir uzantı içindeki bir işlevin bir kopyalama olayını nasıl yönetebileceğine dair kavramsal bir örnek:

CREATE OR REPLACE FUNCTION handle_user_event()
RETURNS event_trigger
LANGUAGE plpgsql
AS $$
DECLARE
    rec RECORD;
BEGIN
    -- Kopyalama akışından satır verisini çıkarın
    -- Bu, karmaşık JSON ayrıştırma mantığı için sahte koddur
    FOR rec IN SELECT * FROM pg_logical_get_changes('order_slot')
    LOOP
        IF rec.operation = 'I' THEN
            -- Veriyi bir NoSQL deposu için dönüştürün
            PERFORM redis_set('user_cache:' || rec.id, jsonb_build_object(
                'name', rec.name,
                'updated_at', NOW()
            ));
        END IF;
    END LOOP;
END;
$$;

Pratik Mimari Desen

Güçlü bir çoklu kalıcılık uygulaması genellikle şu akışı izler:

  1. Kaynak: Uygulamalar PostgreSQL'e yazar.
  2. Yakalama: Mantıksal Replication, değişiklikleri WAL'dan yakalar.
  3. Dönüştürme: Özel bir uzantı veya bağlı bir işçi (Debezium gibi) veriyi dönüştürür.
  4. Alım: Veri özel depolara (Elasticsearch, Grafik DB vb.) gönderilir.

Bu desen, birincil işlemsel sistemin temiz kalmasını sağlarken, diğer sistemlerin ihtiyaç duyduğu özel veri formatını almalarını sağlar. Ayrıca PostgreSQL'i tek gerçeklik kaynağı olarak kullanmanıza olanak tanır; bu da kurtarma ve denetimi basitleştirir.

Sonuç

Çoklu kalıcılık, sadece iş için doğru aracı seçmekle ilgili değildir; bu araçları etkili bir şekilde orkestrasyonla yönetmekle ilgilidir. Güçlü mantıksal kopyalama yetenekleri ve derin genişletilebilirliğiyle PostgreSQL, bu orkestrasyon için mükemmel bir temel sağlar. Basit veritabanından veritabanına senkronizasyonun ötesine geçip özel uzantıları benimseyerek, hem ölçeklenebilir hem de sürdürülebilir bir veri mimarisi inşa edebilir ve verilerin modern uygulamaların çeşitli manzarasında verimli bir şekilde akmasını sağlayabilirsiniz.

Share: