Bazı tabloları bir postgres veritabanından diğerine çoğaltma


9

Aşağıdaki durum var: Postgresql veritabanlarını çalıştıran üç makine var. Bir makine müşteri hesabı bilgilerini tutar (bu makine C'yi arayın), diğer iki makine istemci günlük bilgilerini tutar (bu L1 ve L2'yi arayın). Bölmenin nedeni, birden fazla makine üzerinden yüklemeyi ayırmaktır (bu nedenle, bazı istemciler günlük bilgilerini L1'e, bazıları L2'ye ... ve belki de bir süre L3, L4, ...) gönderir.

Günlük bilgilerini alırken, prensipte Ln'deki günlük tabloları ile C'deki müşteri hesabı tabloları arasında KATILABİLMEK istiyorum. yüklenmesini önlemek için C).

Benim düşüncem, C'deki tabloları L1, L2, ... 'nin her birine kopyalamaktır, böylece birleşimleri yapabilirim. C'den alınan tablolar söz konusu olduğunda, C ustadır ve L1, L2, ... köledir. Ama L1, L2'deki diğer tablolar için ... bu makineler usta. Tam olarak master-master çoğaltma değil ve tam olarak master-slave değil.

Postgres (9.1 çalıştırıyorum) çoğaltma bunu yapmaya ikna edilebilir, ya da değilse iş yapacak başka paketler var. Son çare, periyodik senkronizasyon tabloları bazı kod yazabilirim (bazı gecikme tolere edebilir), ama değil güzel olurdu!

Şimdiden teşekkürler.


1
Belki C'ye erişmek için kütük makinelerinde FDW kullanın ? O C üzerinde bir performans isabet tabi olur, olsa Maddileştirilmiş Görünümler performans isabet azaltır olabilir, ama oldukça emin PostgreSQL yabancı tabloya güncelleştirmeleri nasıl algıladığı değilim. Otomatik olarak gerçekleşirse (Materyalleştirilmiş Görünüm belgelerinin sonunun önerdiği görülüyorsa), bu sorununuzu tamamen çözebilir. Yine de bunlar 9.3 özellik. Çok aktif posta listesi de yardımcı olabilir.
19:14

Yanıtlar:


4

PostgreSQL 9.3'te, postgres_fdwdiğer makinedeki yabancı tabloyu şeffaf olarak sorgulamak için kullanabilirsiniz .

Eski sürümlerde, dblinkAndrew tarafından belirtildiği gibi bir seçenek olabilir.

Başka bir seçenek, istediğiniz tabloları çoğaltmak için Londiste veya Slony-I gibi bir araç kullanmaktır. Bunun için Londiste kullanmanızı tavsiye ederim, çok daha basit olacak. Ekleme / güncelleme / silme algılamak için tabloda tetikleyiciler oluşturur ve bunları kendi istemci / sunucusunu ve kuyruk sistemini kullanarak karşılık gelen ekleme / güncelleme / silme işlemlerini gerçekleştirdiği diğer veritabanına çoğaltır. Birkaç müşteri sitesinde üretimde kullanıyorum ve çok iyi çalışıyor.

Gelecekteki bir seçenek (umarım PostgreSQL 9.5'te) günlük akışlı mantıksal çoğaltma, mantıksal değişiklik kümesi çıkarma ve çift yönlü çoğaltma olacaktır; bu da tek tek veritabanlarının veya tabloların SQL düzeyinde çoğaltılmasına izin verecektir. Bunun için çalışmanın bir kısmı PostgreSQL 9.4'e adanmıştı, ancak yapmak istediğiniz şey için kullanışlı hale getirmek için yeterli değil.


3

Bunu başarmak için dblinks ve somutlaştırılmış görünümler kullanmalısınız. Her iki özellik de Postgres'in en son sürümlerinde bulunur:

http://www.postgresql.org/docs/9.3/static/rules-materializedviews.html

http://www.postgresql.org/docs/9.3/static/dblink.html

Temelde, her bir veri tabanı L1, L2 ... üzerinde C tablosundaki verilerden çıkarılan bir Mview oluşturursunuz ve daha sonra Mview'i periyodik olarak güncellemek için Mview yenilemesini kullanırsınız. Veriler yerel olarak saklanır, bu nedenle erişilmesi çok hızlıdır. Bu, yalnızca veriler göreceli olarak statikse ve zaman zaman biraz güncel olmayan bilgilere sahip yerel veritabanlarının sakıncası yoksa uygundur. Bunu uygun şekilde yönetmek için yenileme frekanslarını ayarlamalısınız ve kabul edilebilir değilse, sadece bir veritabanı bağlantısı kullanmalı ve sonuçtaki yavaşlık ile başa çıkmalısınız.

Ek işlevselliğe ihtiyacınız varsa, anlık görüntüler projesi hızlı yenileme ve anlık görüntü günlükleri gibi gelişmiş özellikler sağlar:

http://pgfoundry.org/projects/snapshot/

Bununla, yenilemelerin yalnızca güncellenmesi gereken satırları güncellemesini sağlayabilirsiniz, bu da onları büyük, esnek olmayan veri kümeleri için son derece hızlı hale getirerek uygulamanızın bozulmasını en aza indirir. Varsayılan olarak Görüşler, belirgin nedenlerle performans için çok kötü olabilecek Postgres'te tamamen bırakılır ve yeniden oluşturulur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.