multimaster, Postgres Pro Enterprise için bir uzantıdır ve çekirdek değişiklikleri seti ile birlikte Postgres Pro Enterprise'ı, OLTP için okuma ölçeklenebilirliği ve otomatik hata kurtarma ile yüksek kullanılabilirlik sağlayan paylaşılan-nothing senkron kümesine dönüştürür.

Standart PostgreSQL master-slave küme yapısıyla karşılaştırıldığında, multimaster kullanılarak oluşturulan kümede tüm düğümler master'dır. Bu aşağıdaki avantajları sağlar:

  • Hata toleransı ve otomatik düğüm kurtarma
  • Senkron mantıksal çoğaltma ve DDL çoğaltması
  • Okuma ölçeklenebilirliği
  • Kümedeki her düğümde geçici tablolarla çalışma (sınırlamalar vardır)
  • Aynı ana sürüm içinde multimaster kümesi için müşteriler tarafından fark edilmeyen Postgres Pro Enterprise güncellemesi

<strong>Önemli:</strong> multimaster'ı üretim ortamında dağıtmadan önce, çoğaltma ile ilgili sınırlamaları dikkate alın. Detaylar için Alt Bölüm F.36.1'e bakın.

multimaster uzantısı veritabanınızı kümedeki tüm düğümlere çoğaltır ve herhangi bir düğümde yazma işlemleri gerçekleştirmenize olanak tanır. Yazma işlemleri tüm düğümlere senkron olarak çoğaltılır, bu da commit gecikmesini artırır. Okuma işlemleri ve sorgular yerel olarak, çoğaltma gecikmesi olmadan yürütülür.

F.36.1. Sınırlamalar

multimaster uzantısı aşağıdaki sınırlamalara sahiptir:

  • Sequence'ler (SERIAL, BIGSERIAL) çoğaltılmaz. Her düğümde farklı değerler üretilir. Sequence'ler için küresel benzersizlik garantisi yoktur.
  • Geçici tablolar yalnızca yerel düğümde görünür ve çoğaltılmaz.
  • UNLOGGED tablolar çoğaltılmaz.
  • Bazı DDL işlemleri çoğaltma sırasında desteklenmeyebilir.
  • Çok büyük işlemler (çok sayıda satır içeren) çoğaltma gecikmesine neden olabilir.
  • Çakışan yazma işlemleri (aynı satırlara aynı anda yazma) çakışma hatasına neden olabilir.
  • Foreign key kısıtlamaları çoğaltma sırasında doğrulanmaz. Kısıtlamalar yalnızca yerel düğümde kontrol edilir.
  • CHECK kısıtlamaları çoğaltma sırasında doğrulanmaz.
  • EXCLUSION kısıtlamaları çoğaltılmaz.
  • Bazı sistem katalogları ve görünümler çoğaltılmaz.

<strong>Not:</strong> Bu sınırlamalar, multimaster'ın mantıksal çoğaltma kullanmasından kaynaklanmaktadır. Üretim ortamında kullanmadan önce bu sınırlamaları dikkate alın.

F.36.2. Mimari

multimaster, mantıksal çoğaltma ve Paxos konsensüs algoritmasını kullanarak çoklu master kümesi oluşturur. Kümedeki her düğüm, diğer tüm düğümlerle senkron olarak çoğaltır.

F.36.2.1. Çoğaltma Mekanizması

multimaster, mantıksal çoğaltma kullanarak veri değişikliklerini kümedeki tüm düğümlere senkron olarak çoğaltır. Her yazma işlemi, commit edilmeden önce tüm düğümlerde uygulanmalıdır.

F.36.2.2. Konsensüs Algoritması

multimaster, düğümler arasında tutarlılığı sağlamak için Paxos konsensüs algoritmasını kullanır. Bu algoritma, düğüm arızaları durumunda bile kümenin tutarlı kalmasını garanti eder.

F.36.2.3. Çakışma Çözümü

multimaster, çakışan yazma işlemlerini algılar ve çözer. Çakışma tespit edildiğinde, işlemlerden biri iptal edilir ve kullanıcıya hata döndürülür.

F.36.3. Kurulum ve Yapılandırma

multimaster uzantısını kurmak ve yapılandırmak için aşağıdaki adımları izleyin:

F.36.3.1. Ön Gereksinimler

multimaster kullanmak için aşağıdaki gereksinimler karşılanmalıdır:

  • Postgres Pro Enterprise yüklü olmalıdır
  • Tüm düğümler arasında ağ bağlantısı olmalıdır
  • wal_level parametresi 'logical' olarak ayarlanmalıdır
  • max_replication_slots parametresi yeterince yüksek olmalıdır
  • max_wal_senders parametresi yeterince yüksek olmalıdır

F.36.3.2. Kurulum Adımları

Her düğümde aşağıdaki adımları izleyin:

  1. postgresql.conf dosyasında gerekli parametreleri ayarlayın:
    wal_level = logical
    max_replication_slots = 10
    max_wal_senders = 10
    shared_preload_libraries = 'multimaster'
  2. PostgreSQL sunucusunu yeniden başlatın
  3. multimaster uzantısını oluşturun:
    CREATE EXTENSION multimaster;

    Not: CREATE EXTENSION komutu hakkında daha fazla bilgi için PostgreSQL dokümantasyonuna bakın.

  4. Küme düğümlerini yapılandırın (detaylar için Alt Bölüm F.36.4'e bakın)

F.36.4. Multimaster Kümesi Yönetimi

multimaster kümesini yönetmek için çeşitli fonksiyonlar ve görünümler sağlanır. Bu bölüm, küme yönetimi için gerekli işlemleri açıklar.

F.36.4.1. Küme Durumunu Kontrol Etme

Küme durumunu kontrol etmek için mtm.status() fonksiyonunu kullanın:

SELECT * FROM mtm.status();

Düğüm bilgilerini görüntülemek için mtm.nodes() fonksiyonunu kullanın:

SELECT * FROM mtm.nodes();

F.36.4.2. Düğüm Ekleme

Kümede yeni bir düğüm eklemek için mtm.add_node() fonksiyonunu kullanın. Detaylar için Referans bölümüne bakın.

F.36.4.3. Düğüm Kaldırma

Kümeden bir düğüm kaldırmak için mtm.remove_node() fonksiyonunu kullanın. Detaylar için Referans bölümüne bakın.

F.36.4.4. Tablo Çoğaltmasını Kontrol Etme

Belirli bir tablonun çoğaltılmasını durdurmak için mtm.make_table_local() fonksiyonunu kullanın:

SELECT mtm.make_table_local('mytable');

F.36.4.5. Veri Tutarlılığını Kontrol Etme

Küme düğümleri arasındaki veri tutarlılığını kontrol etmek için mtm.check_query() fonksiyonunu kullanın:

SELECT mtm.check_query('SELECT * FROM mytable ORDER BY id');

Not: Yanlış pozitif sonuçlardan kaçınmak için sorguya mutlaka ORDER BY yan tümcesi ekleyin.

F.36.5. Referans

Bu bölüm, multimaster uzantısının fonksiyonları, görünümleri ve yapılandırma parametreleri hakkında detaylı bilgi sağlar.

F.36.5.1. Fonksiyonlar

multimaster uzantısı aşağıdaki fonksiyonları sağlar:

mtm.status()

mtm.status() returns record

Küme durumu hakkında bilgi döndürür.

<strong>Dönen Değer:</strong> record (genid integer, genmembersonline int[], genconfigured int[])

  • <code>genid</code> — Mevcut nesil kimliği
  • <code>genmembersonline</code> — Mevcut nesile ait çalışır durumdaki (online) düğüm kimlikleri dizisi
  • <code>genconfigured</code> — Mevcut nesile ait düğüm kimlikleri dizisi

mtm.nodes()

mtm.nodes() returns setof record

Kümedeki tüm düğümler hakkında bilgi döndürür.

<strong>Dönen Değer:</strong> setof record (id integer, conninfo text, isself boolean, enabled boolean, connected boolean, senderpid integer, receiverpid integer, nworkers text, receivermode text)

  • <code>id</code> — Düğüm tanımlayıcısı
  • <code>conninfo</code> — Bu düğüm için bağlantı dizisi
  • <code>isself</code> — Mevcut düğüm göstergesi
  • <code>enabled</code> — Bu düğüm mevcut nesilde çalışıyor mu?
  • <code>connected</code> — Bu düğüm mevcut düğüme bağlı mı?
  • senderpidWAL gönderen süreç tanımlayıcısı
  • receiverpidWAL alan süreç tanımlayıcısı
  • <code>nworkers</code> — Bu düğümde çalışan dinamik işlem uygulama süreçlerinin sayısı
  • <code>receivermode</code> — Bu düğümde alıcının çalıştığı mod. Olası değerler: disabled, recovery, normal

mtm.make_table_local

mtm.make_table_local(relation regclass) returns void

Belirtilen tablo için çoğaltmayı durdurur.

<strong>Parametreler:</strong>

  • <code>relation</code> — Çoğaltma şemasından hariç tutmak istediğiniz tablo

mtm.check_query

mtm.check_query(querytext text) returns boolean

Küme düğümleri arasındaki veri tutarlılığını kontrol eder. Bu fonksiyon, tüm düğümlerde mevcut durumun anlık görüntülerini alır, bunlarda belirtilen sorguyu yürütür ve sonuçları karşılaştırır. Herhangi iki düğüm arasında sonuçlar farklıysa, ilk farkla birlikte bir uyarı çıktılar ve false döndürür. Fark yoksa true döndürür.

<strong>Parametreler:</strong>

  • querytext — Tüm düğümlerde veri karşılaştırması için yürütmek istediğiniz sorgu metni. Yanlış pozitif sonuçlardan kaçınmak için, bu sorguya mutlaka ORDER BY yan tümcesi ekleyin

<strong>Dönen Değer:</strong> boolean

mtm.get_snapshots

mtm.get_snapshots() returns integer

Kümedeki her düğümde veri anlık görüntüsü yapar ve anlık görüntü tanımlayıcısını döndürür. Anlık görüntüler, mtm.free_snapshots() çağrılanana veya mevcut oturum sona erene kadar saklanır. Bu fonksiyon mtm.check_query(query_text) tarafından çağrılır, ayrıca çağrılmasına gerek yoktur.

mtm.free_snapshots

mtm.free_snapshots() returns void

mtm.get_snapshots() fonksiyonu tarafından yapılan veri anlık görüntülerini siler. Bu fonksiyon mtm.check_query(query_text) tarafından çağrılır, ayrıca çağrılmasına gerek yoktur.

mtm.add_node

mtm.add_node(node_id integer, conninfo text) returns void

Kümede yeni bir düğüm ekler.

<strong>Parametreler:</strong>

  • <code>node_id</code> — Eklenecek düğümün benzersiz tanımlayıcısı
  • <code>conninfo</code> — Bu düğüme bağlantı dizisi

<strong>Örnek:</strong>

SELECT mtm.add_node(2, 'host=node2.example.com port=5432 dbname=mydb user=postgres');

mtm.remove_node

mtm.remove_node(node_id integer) returns void

Kümeden bir düğüm kaldırır.

<strong>Parametreler:</strong>

  • <code>node_id</code> — Kaldırılacak düğümün tanımlayıcısı

<strong>Örnek:</strong>

SELECT mtm.remove_node(2);

F.36.5.2. Yapılandırma Parametreleri

multimaster uzantısı aşağıdaki yapılandırma parametrelerini destekler. Bu parametreler postgresql.conf dosyasında veya ALTER SYSTEM komutu ile ayarlanabilir:

Parametre Tip Varsayılan Açıklama
multimaster.node_id integer 0 Bu düğümün benzersiz tanımlayıcısı
multimaster.connstring text '' Kümedeki diğer düğümlere bağlantı dizileri (virgülle ayrılmış)
multimaster.heartbeat_interval integer 1000 Kalp atışı aralığı (milisaniye)
multimaster.heartbeat_timeout integer 5000 Kalp atışı zaman aşımı (milisaniye)
multimaster.commit_timeout integer 30000 Commit zaman aşımı (milisaniye)
multimaster.max_workers integer 4 Maksimum çalışan süreç sayısı
multimaster.synchronous_commit boolean on Senkron commit modu
multimaster.conflict_resolution enum 'abort' Çakışma çözüm stratejisi (abort, last_write_wins)
multimaster.enable_ddl_replication boolean on DDL çoğaltmasını etkinleştirir/devre dışı bırakır

<strong>Not:</strong> Bu parametrelerin çoğu sunucu başlatılırken ayarlanmalıdır. Bazı parametreler çalışma zamanında değiştirilebilir.

F.36.6. Uyumluluk

multimaster uzantısı, PostgreSQL'in çoğu özelliğiyle uyumludur, ancak bazı sınırlamalar vardır.

F.36.6.1. Lokal ve Global DDL Operatörleri

Varsayılan olarak, tüm DDL operatörleri aşağıdakiler hariç kümedeki tüm düğümlerde yürütülür, bunlar yalnızca yerel düğümü etkileyebilir:

F.36.7. Yazarlar

multimaster uzantısı Postgres Professional tarafından geliştirilmiştir.

<strong>Postgres Professional</strong><br/>Moskova, Rusya<br/><a href="https://postgrespro.com" target="_blank">https://postgrespro.com</a>

F.36.7.1. Teşekkürler

Çoğaltma mekanizması, mantıksal dekodlama ve 2ndQuadrant ekibinin toplulukla paylaştığı pglogical uzantısının önceki sürümüne dayanmaktadır.

Paxos konsensüs algoritması şu makalede açıklanmıştır:

  • Leslie Lamport. <em>The Part-Time Parliament</em>

Paralel çoğaltma ve kurtarma mekanizması, aşağıdaki çalışmada açıklanan ilkelere göre uygulanmıştır:

  • Odorico M. Mendizabal, Parisa Jalili Marandi, Fernando Luís Dotti, Fernando Pedone. <em>Checkpointing in Parallel State-Machine Replication</em>.