- AWS tarafından geliştirilip yayımlanan, PostgreSQL için bir aktif-aktif çoğaltma eklentisi
- Birden fazla PostgreSQL örneğinde veriye yazma ve veri güncelleme gerektiğinde, yalnızca belirli bir örneğin değişiklik kabul ettiği mevcut aktif-standby modeli yerine, birden fazla örnekte eşzamanlı değişiklik ve çoğaltmanın mümkün olduğu bir yapı kurulabilir
- Birden fazla bölgede yüksek erişilebilir veritabanı mimarisi, yazma gecikmesini en aza indirme, uygulamanın blue/green güncellemeleri, çift yönlü veri migrasyonu gibi senaryolar için uygundur
- Mantıksal çoğaltma kullanarak çakışma tespiti, yazma çakışmalarını çözme, hedef veritabanı biçimi dönüşümü gibi özellikleri destekler
Aktif-aktif çoğaltma kavramı
- Çoğaltma (Replication), veritabanları arasındaki değişiklikleri senkronize etme teknolojisidir
- PostgreSQL'in mevcut aktif-standby yapısında yalnızca bir örnek değişiklik kabul eder ve diğerleri salt okunurdur; bu nedenle tek bir yer tek veri kaynağı rolünü üstlenir
- pgactive, aktif-aktif çoğaltma topolojisi sunarak birden fazla örnekte aynı anda veri yazılmasına izin verir
- Bu yaklaşım, birden fazla yazma noktasına ihtiyaç duyulan ortamlar için uygundur; örneğin çok bölgeli dağıtımlar veya çift yönlü migrasyonlar
- Aktif-aktif modelde çakışmalar, gecikme ve bazı özellik kısıtları için ayrıca yönetim gerekir
Temel teknoloji: mantıksal çoğaltma
- Mantıksal çoğaltma (Logical Replication), veriyi harici sistemlerin yorumlayabileceği bir biçimde iletir
- Mantıksal çoğaltma sayesinde hedef veritabanında çakışma tespiti, yazma çakışmalarının çözümü, sorgu dönüşümü gibi çeşitli ek işlevler uygulanabilir
- PostgreSQL, 2017'de yayınlanan sürüm 10 ile temel mantıksal çoğaltmayı tanıttı, ancak aktif-aktif çoğaltma için ek özellikler gereklidir
- PostgreSQL'in tasarım özellikleri sayesinde bu işlevler eklenti (extension) biçiminde geliştirilebilir ve uygulanabilir
- PostgreSQL geliştirici topluluğu da ilgili işlevleri kademeli olarak ana projeye eklemektedir
1 yorum
Hacker News görüşleri
İlk çıkan ve hâlâ açık kaynak olan şey BDR1'di (bağlantı); pgactive de bunun üzerine kurulu
BDR2, BDR1'in kapalı kaynak olarak yeniden yazılmış hâliydi ve sonunda rafa kaldırıldı
pglogical v1 ve v2 (ikisi de açık kaynak, bağlantı) yayımlandı; bunlardan v1 büyük ölçüde değiştirilerek Postgres 10'a dahil edildi
Postgres 10'daki mantıksal çoğaltma deneyimine dayanarak 2nd Quadrant pglogical v2 geliştirmeye başladı; pgEdge de buradan çıktı
Daha sonra 2nd Quadrant, kapalı kaynak sürümler olan pglogical v3 ve BDR v3'ü yaptı; bunlar birleştirilerek BDR v4 oldu
Ardından BDR ürününün adı Postgres Distributed (PGD, bağlantı) olarak değiştirildi
2ndQuadrant, EDB tarafından satın alındıktan sonra EDB PGD v6'yı çıkardı
Çakışma olursa zaman damgasına göre en son yazılan değer nihai olarak uygulanıyor
Çakışma kayıtları
pgactive_conflict_historyadlı özel bir tabloda tutulduğu için geçmişi incelemek ve elle çözümlemek mümkünAyrıntılar ve dokümantasyon için buraya bakılabilir
Eğer bu özellik resmî olarak Postgres'e kabul edilebilirse ilginç olabilir
Örneğin production ya da staging verisini okuyan ama sadece yerelde değiştirilebilen ve sonuçları tekrar upstream'e yansımayan ikincil bir veritabanı isteniyor
Şu anda çoğu durumda periyodik script'lerle (cron vb.) veri dökümü ya da sorgu alınıp snapshot oluşturuluyor, bu S3'e kaydediliyor, sonra yerelde indirilip geri yükleniyor
Bu yöntem çoğunlukla işe yarıyor ama bazen indeks oluşturma çok uzun sürebiliyor
Hukuki ve etik boyutu büyük olduğundan çoğu şirkette bu yöntem önerilmiyor
Böylece primary'yi etkilemeden yalnızca yerel tablolar değiştirilebilir
createdb --templatekomutu öneriliyorHer duruma uyan genel geçer bir merge stratejisi akla gelmiyor
Replica'da yazmayı engellemez; sadece bunun sonucu başka yerlere yayılmaz
En iyi yaklaşım, tüm active instance'lar genelinde yazılacak veri alanlarının çakışmayacağı şekilde mimari tasarlamaktır
Böyle durumlarda pgactive gibi araçlar işe yarayabilir
Ya da en baştan dağıtık bir veritabanı (Yugabyte vb.) kullanmak daha doğru olabilir
Tüm master'lar tüm schema'ları okuyabiliyor ama yazma tarafında herkes sadece kendi alanından sorumlu oluyor
Schema yerine partition gibi yapılarla da sorumluluk dağıtılıp dağıtılamayacağı soruluyor
Kendi ürünlerinde bunu doğrudan nerede kullandıkları akla gelmiyor
RDS block replication, Aurora ise kendine özgü SAN replication kullanıyor
Belki DMS tarafında kullanmayı hedefliyor olabilirler diye tahmin ediliyor
Güçlü ACID ilişkisel veritabanlarında neden özellikle buna ihtiyaç duyulsun, sorgulanıyor
Ancak 1 ay önce topluluğa açık kaynak olarak resmî şekilde yayımlandığı haberleri çıkmıştı (resmî haber)
Geceleri rahat uyumak istiyorsam mümkün olduğunca uzak durmak isterim
patroni+etcd+haproxy kombinasyonu çok öneriliyor; gerçekten kullanmış kişilerin bu kadar heyecanla önermesinin bir nedeni vardır herhâlde
Yine de docker compose ile verilen örnek dosyalara bakınca biraz göz korkutucu geliyor
pgpool ise her postgres'in önüne koyulan bir katman gibi göründüğünden daha basit duruyor
Gerçek üretim ortamında Postgres seven insanların önerileri ya da deneyimleri merak ediliyor
Hedef, docker compose tabanlı olarak olabildiğince kolay şekilde yüksek erişilebilirlik, (en azından) veri kaybını en aza indirme ve point-in-time recovery destekli bir cluster kurmak
<i>Pgactive: Active-Active Replication Extension for PostgreSQL on Amazon RDS</i>
Hacker News gönderisi (Ekim 2023 tarihli, 1 yorum)
Yani herkesin kendi durumuna göre artı ve eksileri kabul etmesi gerekiyor