PostgreSQL için Azure Veritabanı - Esnek Sunucuda mantıksal çoğaltma ve mantıksal kod çözme
ŞUNLAR IÇIN GEÇERLIDIR: PostgreSQL için Azure Veritabanı - Esnek Sunucu
PostgreSQL için Azure Veritabanı esnek sunucu aşağıdaki mantıksal veri ayıklama ve çoğaltma yöntemlerini destekler:
Mantıksal çoğaltma
- Veri nesnelerini çoğaltmak için PostgreSQL yerel mantıksal çoğaltma kullanma. Mantıksal çoğaltma, tablo düzeyinde veri çoğaltması da dahil olmak üzere veri çoğaltma işlemleri üzerinde ayrıntılı denetime olanak sağlar.
- Mantıksal akış çoğaltması ve veritabanının ilk şemasını kopyalama, TRUNCATE desteği, DDL'yi çoğaltma gibi daha fazla özellik sağlayan pglogical uzantısını kullanma.
Önceden yazma günlüğünün (WAL) içeriğinin kodunu çözerek uygulanan mantıksal kod çözme.
Mantıksal çoğaltmayı ve mantıksal kod çözmeyi karşılaştırma
Mantıksal çoğaltma ve mantıksal kod çözmenin çeşitli benzerlikleri vardır. İkisi de:
Postgres'in dışında veri çoğaltmanıza izin verir.
Değişikliklerin kaynağı olarak önceden yazma günlüğünü (WAL) kullanın.
Verileri göndermek için mantıksal çoğaltma yuvalarını kullanın. Yuva, bir değişiklik akışını temsil eder.
Hangi değişikliklerin gönderilebileceğini belirlemek için tablonun REPLICA IDENTITY özelliğini kullanın.
DDL değişikliklerini çoğaltmayın.
İki teknolojinin farklılıkları vardır:
Mantıksal çoğaltma:
- Çoğaltılacak bir tablo veya tablo kümesi belirtmenize olanak tanır.
Mantıksal kod çözme:
- Veritabanındaki tüm tablolardaki değişiklikleri ayıklar.
Mantıksal çoğaltma ve mantıksal kod çözme önkoşulları
Portalda sunucu parametreleri sayfasına gidin.
Sunucu parametresini
wal_level
olaraklogical
ayarlayın.Pglogical uzantısı kullanmak istiyorsanız, ve parametrelerini arayın
shared_preload_libraries
ve açılan liste kutusundan seçinpglogical
.azure.extensions
Parametre değerini en az 16 olarak güncelleştirin
max_worker_processes
. Aksi takdirde gibiWARNING: out of background worker slots
sorunlarla karşılaşabilirsiniz.Değişiklikleri kaydedin ve değişiklikleri uygulamak için sunucuyu yeniden başlatın.
PostgreSQL için Azure Veritabanı esnek sunucu örneğinizin bağlantı kaynağınızdan gelen ağ trafiğine izin verdiğinden emin olun.
Yönetici kullanıcıya çoğaltma izinleri verin.
ALTER ROLE <adminname> WITH REPLICATION;
Kullandığınız rolün çoğalttığınız şemada ayrıcalıklara sahip olduğundan emin olmak isteyebilirsiniz. Aksi takdirde gibi
Permission denied for schema
hatalara karşılaşabilirsiniz.
Not
Çoğaltma kullanıcınızı normal yönetici hesabından ayırmak her zaman iyi bir uygulamadır.
Mantıksal çoğaltma ve mantıksal kod çözme kullanma
Verileri PostgreSQL için Azure Veritabanı esnek sunucudan çoğaltmanın en kolay yolu yerel mantıksal çoğaltma kullanmaktır. Değişiklikleri kullanmak için SQL arabirimini veya akış protokolünü kullanabilirsiniz. Mantıksal kod çözme kullanarak değişiklikleri kullanmak için SQL arabirimini de kullanabilirsiniz.
Yerel mantıksal çoğaltma
Mantıksal çoğaltma 'yayımcı' ve 'abone' terimlerini kullanır.
- Yayımcı, veri gönderdiğiniz PostgreSQL için Azure Veritabanı esnek sunucu veritabanıdır.
- Abone, veri gönderdiğiniz PostgreSQL için Azure Veritabanı esnek sunucu veritabanıdır.
Mantıksal çoğaltmayı denemek için kullanabileceğiniz bazı örnek kodlar aşağıda verilmiştır.
Yayımcı veritabanına bağlanın. Bir tablo oluşturun ve bazı veriler ekleyin.
CREATE TABLE basic (id INTEGER NOT NULL PRIMARY KEY, a TEXT); INSERT INTO basic VALUES (1, 'apple'); INSERT INTO basic VALUES (2, 'banana');
Tablo için bir yayın oluşturun.
CREATE PUBLICATION pub FOR TABLE basic;
Abone veritabanına bağlanın. Yayımcıyla aynı şemaya sahip bir tablo oluşturun.
CREATE TABLE basic (id INTEGER NOT NULL PRIMARY KEY, a TEXT);
Daha önce oluşturduğunuz yayına bağlanan bir abonelik oluşturun.
CREATE SUBSCRIPTION sub CONNECTION 'host=<server>.postgres.database.azure.com user=<rep_user> dbname=<dbname> password=<password>' PUBLICATION pub;
Artık tabloyu abonede sorgulayabilirsiniz. Yayımcıdan veri aldığını görürsünüz.
SELECT * FROM basic;
Yayımcının tablosuna daha fazla satır ekleyebilir ve değişiklikleri abonede görüntüleyebilirsiniz.
Verileri göremiyorsanız, için oturum açma ayrıcalığını
azure_pg_admin
etkinleştirin ve tablo içeriğini denetleyin.ALTER ROLE azure_pg_admin login;
Mantıksal çoğaltma hakkında daha fazla bilgi edinmek için PostgreSQL belgelerini ziyaret edin.
Aynı sunucudaki veritabanları arasında mantıksal çoğaltma kullanma
Aynı PostgreSQL için Azure Veritabanı esnek sunucu örneğinde bulunan farklı veritabanları arasında mantıksal çoğaltmayı ayarlamayı hedefliyorsanız, şu anda mevcut olan uygulama kısıtlamalarından kaçınmak için belirli yönergeleri izlemeniz önemlidir. Şu andan itibaren, aynı veritabanı kümesine bağlanan bir abonelik oluşturma işlemi ancak çoğaltma yuvası aynı komut içinde oluşturulmazsa başarılı olur; aksi takdirde, CREATE SUBSCRIPTION
bir bekleme olayında çağrı yanıt vermiyor LibPQWalReceiverReceive
. Bunun nedeni Postgres altyapısındaki mevcut bir kısıtlamadır ve gelecek sürümlerde kaldırılabilir.
Bu kısıtlamayı atlatırken aynı sunucudaki "kaynak" ve "hedef" veritabanlarınız arasında mantıksal çoğaltmayı etkili bir şekilde ayarlamak için aşağıdaki adımları izleyin:
İlk olarak, hem kaynak hem de hedef veritabanlarında aynı şemaya sahip "basic" adlı bir tablo oluşturun:
-- Run this on both source and target databases
CREATE TABLE basic (id INTEGER NOT NULL PRIMARY KEY, a TEXT);
Ardından, kaynak veritabanında tablo için bir yayın oluşturun ve işlevini kullanarak pg_create_logical_replication_slot
ayrı olarak bir mantıksal çoğaltma yuvası oluşturun. Bu, yuva abonelikle aynı komutta oluşturulduğunda oluşan asılı sorunu gidermeye yardımcı olur. Eklentiyi pgoutput
kullanmanız gerekir:
-- Run this on the source database
CREATE PUBLICATION pub FOR TABLE basic;
SELECT pg_create_logical_replication_slot('myslot', 'pgoutput');
Bundan sonra hedef veritabanınızda daha önce oluşturulan yayına bir abonelik oluşturarak create_slot
esnek PostgreSQL için Azure Veritabanı sunucunun yeni bir yuva oluşturmasını engelleyecek şekilde ayarlandığından false
emin olun ve önceki adımda oluşturulan yuva adını doğru bir şekilde belirtin. Komutu çalıştırmadan önce, bağlantı dizesi yer tutucularını gerçek veritabanı kimlik bilgilerinizle değiştirin:
-- Run this on the target database
CREATE SUBSCRIPTION sub
CONNECTION 'dbname=<source dbname> host=<server>.postgres.database.azure.com port=5432 user=<rep_user> password=<password>'
PUBLICATION pub
WITH (create_slot = false, slot_name='myslot');
Mantıksal çoğaltmayı ayarladıktan sonra, kaynak veritabanınızdaki "temel" tabloya yeni bir kayıt ekleyerek ve ardından hedef veritabanınıza çoğaltıldığını doğrulayarak bunu test edebilirsiniz:
-- Run this on the source database
INSERT INTO basic SELECT 3, 'mango';
-- Run this on the target database
TABLE basic;
Her şey doğru yapılandırıldıysa, hedef veritabanınızdaki kaynak veritabanından mantıksal çoğaltmanın başarılı kurulumunu onaylayan yeni kayda tanık olmanız gerekir.
pglogical extension
Aşağıda sağlayıcı veritabanı sunucusunda ve abonede pglogical yapılandırma örneği verilmiştır. Daha fazla ayrıntı için pglogical extension belgelerine bakın. Ayrıca yukarıda listelenen önkoşul görevlerini gerçekleştirdiğinizden emin olun.
Hem sağlayıcıda hem de abone veritabanı sunucularında veritabanına pglogical uzantısını yükleyin.
\c myDB CREATE EXTENSION pglogical;
Çoğaltma kullanıcısı sunucu yönetimi kullanıcısından (sunucuyu oluşturan) başka bir kullanıcıysa, kullanıcıya bir rolde
azure_pg_admin
üyelik ve kullanıcıya ÇOĞALTMA ve LOGIN öznitelikleri atadığınızdan emin olun. Ayrıntılar için pglogical belgelerine bakın.GRANT azure_pg_admin to myUser; ALTER ROLE myUser REPLICATION LOGIN;
Sağlayıcı (kaynak/yayımcı) veritabanı sunucusunda sağlayıcı düğümünü oluşturun.
select pglogical.create_node( node_name := 'provider1', dsn := ' host=myProviderServer.postgres.database.azure.com port=5432 dbname=myDB user=myUser password=<password>');
Çoğaltma kümesi oluşturun.
select pglogical.create_replication_set('myreplicationset');
Veritabanındaki tüm tabloları çoğaltma kümesine ekleyin.
SELECT pglogical.replication_set_add_all_tables('myreplicationset', '{public}'::text[]);
Alternatif bir yöntem olarak, belirli bir şemadan (örneğin testUser) varsayılan çoğaltma kümesine tablolar da ekleyebilirsiniz.
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['testUser']);
Abone veritabanı sunucusunda bir abone düğümü oluşturun.
select pglogical.create_node( node_name := 'subscriber1', dsn := ' host=mySubscriberServer.postgres.database.azure.com port=5432 dbname=myDB user=myUser password=<password>' );
Eşitlemeyi ve çoğaltma işlemini başlatmak için bir abonelik oluşturun.
select pglogical.create_subscription ( subscription_name := 'subscription1', replication_sets := array['myreplicationset'], provider_dsn := 'host=myProviderServer.postgres.database.azure.com port=5432 dbname=myDB user=myUser password=<password>');
Daha sonra abonelik durumunu doğrulayabilirsiniz.
SELECT subscription_name, status FROM pglogical.show_subscription_status();
Dikkat
Pglogical şu anda otomatik DDL çoğaltmayı desteklemez. İlk şema, pg_dump --schema-only kullanılarak el ile kopyalanabilir. DDL deyimleri sağlayıcı ve abone üzerinde aynı anda pglogical.replicate_ddl_command işlevi kullanılarak yürütülebilir. Uzantının burada listelenen diğer sınırlamalarını unutmayın.
Mantıksal kod çözme
Mantıksal kod çözme, akış protokolü veya SQL arabirimi aracılığıyla kullanılabilir.
Akış protokolü
Akış protokollerini kullanarak değişiklikleri kullanmak genellikle tercih edilir. Kendi tüketicinizi / bağlayıcınızı oluşturabilir veya Debezium gibi bir üçüncü taraf hizmeti kullanabilirsiniz.
pg_recvlogical ile akış protokolünü kullanan bir örnek için wal2json belgelerini ziyaret edin.
SQL arabirimi
Aşağıdaki örnekte wal2json eklentisiyle SQL arabirimini kullanıyoruz.
Yuva oluşturun.
SELECT * FROM pg_create_logical_replication_slot('test_slot', 'wal2json');
SQL komutlarını verme. Örneğin:
CREATE TABLE a_table ( id varchar(40) NOT NULL, item varchar(40), PRIMARY KEY (id) ); INSERT INTO a_table (id, item) VALUES ('id1', 'item1'); DELETE FROM a_table WHERE id='id1';
Değişiklikleri kullanma.
SELECT data FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'pretty-print', '1');
Çıktı şuna benzer:
{ "change": [ ] } { "change": [ { "kind": "insert", "schema": "public", "table": "a_table", "columnnames": ["id", "item"], "columntypes": ["character varying(40)", "character varying(40)"], "columnvalues": ["id1", "item1"] } ] } { "change": [ { "kind": "delete", "schema": "public", "table": "a_table", "oldkeys": { "keynames": ["id"], "keytypes": ["character varying(40)"], "keyvalues": ["id1"] } } ] }
Kullanmayı bitirdikten sonra yuvayı bırakın.
SELECT pg_drop_replication_slot('test_slot');
Mantıksal kod çözme hakkında daha fazla bilgi edinmek için PostgreSQL belgelerini ziyaret edin.
İzleyici
Mantıksal kod çözmeyi izlemeniz gerekir. Kullanılmayan çoğaltma yuvaları bırakılmalıdır. Yuvalar, değişiklikler okunana kadar Postgres WAL günlüklerini ve ilgili sistem kataloglarını tutar. Aboneniz veya tüketiciniz başarısız olursa veya yanlış yapılandırılmışsa, tutarsız günlükler birikip depolama alanınızı doldurur. Ayrıca, tamamlanmamış günlükler işlem kimliği kaydırma riskini artırır. Her iki durum da sunucunun kullanılamaz duruma gelmesine neden olabilir. Bu nedenle, mantıksal çoğaltma yuvalarının sürekli olarak tüketilmesi gerekir. Mantıksal çoğaltma yuvası artık kullanılmıyorsa, hemen bırakın.
Görünümdeki pg_replication_slots
'etkin' sütun, yuvaya bağlı bir tüketici olup olmadığını gösterir.
SELECT * FROM pg_replication_slots;
Kullanılan İşlem Kimlikleri Üst Sınırı ve Kullanılan Depolama alanı PostgreSQL için Azure Veritabanı esnek sunucu ölçümleriyle ilgili uyarılar ayarlayarak, değerler normal eşikleri aştığında sizi bilgilendirin.
Sınırlamalar
Mantıksal çoğaltma sınırlamaları burada belgelendiği gibi uygulanır.
Yuvalar ve HA yük devretmesi - [yüksek kullanılabilirlik (HA)]/azure/reliability/reliability-postgresql-esnek-sunucu etkin sunucuları PostgreSQL için Azure Veritabanı esnek sunucu kullanırken, yük devretme olayları sırasında mantıksal çoğaltma yuvalarının korunmadığını unutmayın. Mantıksal çoğaltma yuvalarını korumak ve yük devretme sonrasında veri tutarlılığını sağlamak için PG Yük Devretme Yuvaları uzantısının kullanılması önerilir. Bu uzantıyı etkinleştirme hakkında daha fazla bilgi için lütfen belgelere bakın.
Önemli
İlgili abone artık yoksa, mantıksal çoğaltma yuvasını birincil sunucuya bırakmanız gerekir. Aksi takdirde WAL dosyaları birincil dosyada birikerek depolama alanını doldurur. Depolama eşiğinin belirli bir eşiği aştığını ve mantıksal çoğaltma yuvasının kullanımda olmadığını (kullanılamayan abone nedeniyle) varsayalım. Bu durumda, PostgreSQL için Azure Veritabanı esnek sunucu örneği kullanılmayan mantıksal çoğaltma yuvasını otomatik olarak bırakır. Bu eylem birikmiş WAL dosyalarını serbest bırakır ve depolamanın dolu olması nedeniyle sunucunuzun kullanılamaz duruma gelmesini önler.
İlgili içerik
- PostgreSQL için Azure Veritabanı - Esnek Sunucu'da güvenlik duvarı kuralları.
- PostgreSQL için Azure Veritabanı - Esnek Sunucuda genel erişim ve özel uç noktalar.
- PostgreSQL için Azure Veritabanı - Esnek Sunucu'da sanal ağ tümleştirmesi.
- Uzantıları kullanma.
- PostgreSQL için Azure Veritabanı - Esnek Sunucuda yüksek kullanılabilirlik.