PostgreSQL ve bağlantıya özel yazma tutarlılığı ayarları

Makalenin çevirisi ders öğrencilerine özel olarak hazırlanmıştır. "Veri tabanı". Bu yönde gelişmekle ilgileniyor musunuz? Sizi davet ediyoruz Açık günProgramı, online formatın özelliklerini, mezunları eğitim sonrasında bekleyen yetkinlikleri ve kariyer olanaklarını detaylı olarak konuştuğumuz bölüm.

PostgreSQL ve bağlantıya özel yazma tutarlılığı ayarları

PostgreSQL ve bağlantıya özel yazma tutarlılığı ayarları
Compose'da birçok veritabanıyla ilgileniyoruz, bu da bize onların işlevlerine ve eksikliklerine daha aşina olma fırsatı veriyor. Yeni veritabanlarının özelliklerini sevmeyi öğrendikçe, bazen benzer özelliklerin uzun süredir birlikte çalıştığımız daha olgun araçlarda da mevcut olmasının ne kadar güzel olacağını düşünmeye başlarız. PostgreSQL'de görmek istediğim yeni özelliklerden biri, kümenin tamamındaki bağlantı başına yapılandırılabilir yazma tutarlılığıydı. Görünüşe göre bu özelliğe zaten sahibiz ve bugün onu nasıl kullanabileceğinize dair bilgileri sizinle paylaşmak istiyoruz.

Buna neden ihtiyacım var?

Kümenin nasıl davranması gerektiği uygulamanıza bağlıdır. Örneğin bir fatura ödeme uygulamasını ele alalım. Küme genelinde %100 tutarlılığa ihtiyacınız olacak, bu nedenle veritabanınızın tüm değişikliklerin yapılmasını beklemesi için eşzamanlı taahhütleri etkinleştirmeniz gerekecek. Ancak uygulamanız hızla büyüyen bir sosyal ağsa, muhtemelen %100 tutarlılık yerine hızlı yanıtı tercih edeceksiniz. Bunu başarmak için kümenizde eşzamansız taahhütleri kullanabilirsiniz.

Uzlaşmayla tanışın

Veri tutarlılığı ve performans arasında ödün vermeniz gerekir. PostgreSQL tutarlılıktan uzaklaşıyor çünkü varsayılan konfigürasyon öngörülebilir ve beklenmedik sürprizler içermiyor. Şimdi uzlaşmalara bakalım.

Takas 1: Performans

PostgreSQL kümesi tutarlılık gerektirmiyorsa eşzamansız olarak çalışabilir. Yazma işlemi küme liderine yapılır ve güncellemeler birkaç milisaniye sonra kopyalarına gönderilir. Bir PostgreSQL kümesi tutarlılık gerektirdiğinde eşzamanlı olarak çalışmalıdır. Yazma, kopyalara bir güncelleme gönderecek ve yazmayı başlatan istemciye başarılı olduğuna dair onay göndermeden önce her birinin yazdığına dair onay bekleyecek olan küme liderine yapılacaktır. Bu yaklaşımlar arasındaki pratik fark, eşzamansız yöntemin iki ağ atlama noktası gerektirmesi, eşzamanlı yöntemin ise dört ağ atlaması gerektirmesidir.

Takas 2: Tutarlılık

Bu iki yaklaşımda da liderin başarısız olması durumunda sonuç farklı olacaktır. Çalışma eşzamansız olarak gerçekleştiriliyorsa, böyle bir hata meydana gelirse, tüm kayıtlar kopyalar tarafından işlenmez. Ne kadar kayıp olacak? Uygulamanın kendisine ve çoğaltmanın verimliliğine bağlıdır. Oluşturma çoğaltması, içindeki bilgi miktarının liderdekinden 1 MB daha az olması durumunda çoğaltmanın lider olmasını engelleyecektir; yani, eşzamansız işlem sırasında 1 MB'a kadar kayıt potansiyel olarak kaybolabilir.

Bu senkronize modda gerçekleşmez. Lider başarısız olursa, liderde onaylanan herhangi bir yazmanın kopyalarda da onaylanması gerektiğinden tüm kopyalar güncellenir. Bu tutarlılıktır.

Tutarlılık ve performans arasındaki dengede tutarlılığın açık bir avantaja sahip olduğu bir faturalandırma uygulamasında eşzamanlı davranış mantıklıdır. Böyle bir uygulama için en önemli şey geçerli verilerdir. Şimdi, asıl görevinin isteklere mümkün olduğunca çabuk yanıt vererek kullanıcının dikkatini çekmek olduğu bir sosyal ağ düşünün. Bu durumda, daha az ağ atlamalı ve taahhütler için daha az beklemeli performans bir öncelik olacaktır. Ancak performans ile tutarlılık arasındaki denge, düşünmeniz gereken tek şey değildir.

Takas 3: Çökmeler

Bir kümenin başarısızlık sırasında nasıl davrandığını anlamak çok önemlidir. Bir veya daha fazla kopyanın başarısız olduğu bir durumu düşünün. Taahhütler eşzamansız olarak işlendiğinde lider, eksik kopyaları beklemeden çalışmaya devam edecek, yani yazma işlemlerini kabul edecek ve işleyecektir. Kopyalar kümeye geri döndüğünde lidere yetişirler. Eşzamanlı çoğaltmada, kopyalar yanıt vermezse liderin başka seçeneği kalmaz ve kopya kümeye dönene ve yazmayı kabul edip taahhüt edene kadar taahhüt onayını beklemeye devam eder.

İşlem başına bir bağlantı mı?

Her uygulamanın farklı türde bir tutarlılık ve performans kombinasyonuna ihtiyacı vardır. Tabii ki, tamamen tutarlı olduğunu düşündüğümüz fatura ödeme uygulamamız veya neredeyse geçici sosyal ağ uygulamamız olmadığı sürece. Diğer tüm durumlarda, bazı işlemlerin senkronize, bazılarının ise asenkron olması gerektiği zamanlar olacaktır. Sistemin sohbete gönderilen bir mesajın işleme alınmasını beklemesini istemeyebilirsiniz ancak aynı uygulamada bir ödeme işleniyorsa beklemeniz gerekecektir.

Tüm bu kararlar elbette uygulama geliştiricisi tarafından verilmektedir. Her yaklaşımın ne zaman kullanılacağı konusunda doğru kararları vermek, kümenizden en iyi şekilde yararlanmanıza yardımcı olacaktır. Geliştiricinin bağlantılar ve işlemler için SQL düzeyinde bunlar arasında geçiş yapabilmesi önemlidir.

Uygulamada kontrolün sağlanması

PostgreSQL varsayılan olarak tutarlılık sağlar. Bu, sunucu parametresi tarafından kontrol edilir synchronous_commit. Varsayılan olarak konumundadır on, ancak üç seçeneği daha var: local, remote_write veya off.

Parametreyi ayarlarken off yerel sistemde bile tüm senkronize taahhütler durdurulur. Yerel parametre, yerel sistem için eşzamanlı modu belirtir, ancak kopyalara yazma işlemleri eşzamansız olarak gerçekleştirilir. Remote_write Daha da ileri gidiyor: kopyalara yazma işlemleri eşzamansız olarak gerçekleştirilir, ancak kopya yazmayı kabul ettiğinde ancak diske yazmadığında geri döndürülür.

Mevcut seçenek yelpazesini göz önünde bulundurarak bir davranış seçeriz ve şunu aklımızda tutarak on – bunlar senkronize kayıtlar, biz seçeceğiz local ağ üzerinden eşzamansız yürütmeler için, yerel yürütmeleri eşzamanlı bırakırken.

Şimdi size birazdan bunu nasıl kuracağınızı anlatacağız ama kurduğumuzu hayal edin. synchronous_commit в local sunucu için. Parametreyi değiştirmenin mümkün olup olmadığını merak ettik synchronous_commit anında ve bunun sadece mümkün olmadığı, hatta bunu yapmanın iki yolu olduğu ortaya çıktı. Birincisi bağlantınızın oturumunu aşağıdaki gibi ayarlamaktır:

SET SESSION synchronous_commit TO ON;  
// Your writes go here

Oturumdaki sonraki tüm yazma işlemleri, bağlı istemciye olumlu bir sonuç döndürmeden önce kopyalara yapılan yazma işlemlerini onaylayacaktır. Tabii ayarı değiştirmediğiniz sürece synchronous_commit Tekrar. Bir kısmını atlayabilirsiniz SESSION komutta çünkü varsayılan değerde olacaktır.

Tek bir işlem için eşzamanlı çoğaltma aldığınızdan emin olmak istediğinizde ikinci yöntem iyidir. Birçok NoSQL nesil veritabanında işlem kavramı mevcut değildir ancak PostgreSQL'de vardır. Bu durumda bir işlem başlatır ve ardından ayarlarsınız. synchronous_commit в on İşlemin girişini gerçekleştirmeden önce. COMMIT herhangi bir parametre değerini kullanarak işlemi gerçekleştirecek synchronous_commit, diğer geliştiricilerin yazma işlemlerinin eşzamansız olmadığını anladığından emin olmak için değişkeni önceden ayarlamak en iyisidir.

BEGIN;  
SET LOCAL synchronous_commit TO ON;  
// Your writes go here
COMMIT;  

Artık veritabanı bağlı istemciye olumlu bir yanıt göndermeden önce tüm işlem taahhütlerinin kopyalara yazıldığı doğrulanacak.

PostgreSQL'i kurma

Bundan önce PostgreSQL sistemini hayal etmiştik. synchronous_commit, yüklü local. Bunu sunucu tarafında gerçekçi kılmak için iki sunucu yapılandırma seçeneğini ayarlamanız gerekecektir. Bir parametre daha synchronous_standby_names ne zaman kendine gelecek synchronous_commit olacak on. Hangi kopyaların senkronize taahhütler için uygun olduğunu belirler ve biz bunu şu şekilde ayarlayacağız: *bu, tüm kopyaların dahil olduğu anlamına gelir. Bu değerler genellikle yapılandırma dosyası toplayarak:

synchronous_commit = local  
synchronous_standby_names='*'

Parametreyi ayarlayarak synchronous_commit anlam içine local, yerel disklerin senkronize kaldığı, ancak ağ çoğaltma taahhütlerinin varsayılan olarak senkronize olmadığı bir sistem oluşturuyoruz. Tabii ki, yukarıda gösterildiği gibi bu taahhütleri senkronize etmeye karar vermediğimiz sürece.

Gelişmeleri takip ediyorsanız Vali projesi, bazı son değişiklikleri fark etmiş olabilirsiniz (1, 2), Governor kullanıcılarının bu parametreleri test etmesine ve tutarlılıklarını izlemesine olanak sağladı.

Birkaç kelime daha...

Daha bir hafta önce size PostgreSQL'e bu kadar ince ayar yapmanın imkansız olduğunu söylerdim. İşte o zaman Compose platform ekibinin bir üyesi olan Kurt, böyle bir fırsatın var olduğu konusunda ısrar etti. İtirazlarımı yatıştırdı ve PostgreSQL belgelerinde buldu ardından:

PostgreSQL ve bağlantıya özel yazma tutarlılığı ayarları

Bu ayar herhangi bir zamanda değiştirilebilir. Herhangi bir işlemin davranışı, taahhüt anında geçerli olan ayarlara göre belirlenir. Bu nedenle bazı işlemlerin senkronize, bazılarının ise asenkron olarak gerçekleştirilmesi mümkün ve faydalıdır. Örneğin birini zorlamak multistatement Parametrenin varsayılan değeri ters olduğunda eşzamansız olarak taahhütte bulunacak işlem, ayarlayın SET LOCAL synchronous_commit TO OFF bir işlemde.

Yapılandırma dosyasında yapılan bu küçük değişiklikle kullanıcılara tutarlılık ve performansları üzerinde kontrol olanağı verdik.

Kaynak: habr.com

Yorum ekle