F.36. multimaster — Senkron Küme
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:
- postgresql.conf dosyasında gerekli parametreleri ayarlayın:
wal_level = logical max_replication_slots = 10 max_wal_senders = 10 shared_preload_libraries = 'multimaster' - PostgreSQL sunucusunu yeniden başlatın
- 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.
- 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ı?
senderpid— WAL gönderen süreç tanımlayıcısıreceiverpid— WAL 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>.