Heroku "psql: FATAL: kalan bağlantı yuvaları çoğaltma olmayan süper kullanıcı bağlantıları için ayrılmıştır"


120

Heroku'da Postgresql arka uçlu bir uygulama geliştiriyorum. Düzenli olarak, hem CLI'den hem de sunucuya bir sayfa yükleyerek veritabanına erişmeye çalışırken bu hata mesajını alıyorum:

psql: FATAL: remaining connection slots are reserved for non-replication superuser connections

Bunu daha önce gören var mı veya lütfen bana doğru yönü göstermesine yardım edin?


1
Aynı sorunu yaşıyorum. Bir yerde Heroku desteğinin bazı sunucularda "bazı sorunlar tespit ettiğini" okudum ve söz konusu kullanıcıya yeni bir Temel veritabanı hazırlamasını ve pgbackup kullanarak ona geçmesini önerdiler. Şu anki sorunum, uygulamanın o kadar yeni olması ki henüz bir yedekleme oluşturmadım ve bir tane oluşturmaya çalışırken aynı hatayı alıyorum: D
André Laszlo

Kayıt için, heroku pgbackupsbu hataya rağmen bir yedekleme oluşturmak için komutu kullanabildim .
markshiz

Bu sorunu yeniden oluşturmak için çok sayıda terminal oluşturabilirsiniz. .batBunun için Windows komut dosyası: 100 backends sayısını arzu edilir. for /l %%x in (1, 1, 100) do ( start psql )
koxt

Ben de aynı sorunu yaşadım. Ben kullanarak yeni veritabanına veri aktarmak mümkün değildi pg:backups copy, pg:backups capturebu siteye bağlanarak, pgAdminbenim kendi bilgisayar, ya da ben hayal başka yolda. pg:killallYardım bile etmedi. Bir saat sonra tekrar denedim ve bağlantılar 50-50 idi, bu yüzden birkaç denemeden sonra başarılı oldum pg:backups copyve uygulamam tekrar yayına girdi. Bu ... eğlenceli bir gün değildi. Bunu Google'da aradıysanız, bir bardak su için.
Aur Saraf

1
Şimdi tekrar yaşıyorum. Önceki deneyimimi belgelediğim için ne kadar şanslıyım ... Düzenleme: bu sefer yeniden başlatmak yeterliydi.
Aur Saraf

Yanıtlar:


56

Sen artırmanız gerek max_connectionsyapılandırma ayarını veya (muhtemelen daha iyi) kullanımı bağlantı havuzu daha küçük bir bağlantı havuzuna yoluyla yönlendirmek için kullanıcı istekleri çok sayıda.

https://wiki.postgresql.org/wiki/Number_Of_Database_Connections


14
Ayrıca yaygın bir sorun, istemci tarafındaki uygulamanın çökmesi ve bağlantıları açık bırakması ve ardından yeniden başladığında yenilerini açması gibi bir şeydir. Bu tür şeyler çok sık olursa bağlantılarınız biter. Veya uygulama yanlış yapılandırılmış ve çok fazla bağlantı açıyor.
Scott Marlowe

5
Heroku'da yapılandırma ayarlarını değiştirebileceğimi sanmıyorum. Tüm açık bağlantıları kapatmanın bir yolu var mı?
nathancahill

1
Umarım sunucu, canlı tutma paketleri için oldukça agresif bir temelde yapılandırılmıştır. Bu, bağlantıların aniden kesilmesi durumunda oturumların makul bir sürede sona ermesine neden olur. Bu yapılandırılmamışsa, bir veritabanı süper kullanıcısı olarak oturum açabiliyorsanız pid, oturumların değerlerini belirleyebilir ve pg_terminate_backend()bunları sonlandırmak için işlevi kullanabilirsiniz . Sorunu önlemek için, istemci tarafını aniden öldürmek yerine bağlantıları düzgün bir şekilde kapattığınızdan emin olun.
kgrittn

@nathancahill Veritabanına olan tüm bağlantıları sonlandırın:heroku pg:killall
Roko


7

Bkz. Heroku "psql: FATAL: kalan bağlantı yuvaları, çoğaltma olmayan süper kullanıcı bağlantıları için ayrılmıştır" :

Heroku bazen veritabanı yük dengelemeyle ilgili bir sorun yaşar.

André Laszlo, markshizVe bana bütün soru üzerine yorumlarda bununla başa bildirdi.

Sizi destek çağrısından kurtarmak için, işte benzer bir sorun için Heroku Destek'ten aldığım yanıt:

Merhaba,

Hobi katmanı veritabanlarının sınırlamalarından biri habersiz bakımdır. Pek çok hobi veritabanı tek bir paylaşılan sunucuda çalışır ve bazen bu sunucuyu donanım bakımı amacıyla yeniden başlatmamız veya yük dengeleme için veritabanlarını başka bir sunucuya taşımamız gerekir. Bu olduğunda, günlüklerinizde bir hata görürsünüz veya bağlanma sorunları yaşarsınız. Sunucu yeniden başlatılıyorsa, veritabanının yeniden çevrimiçi hale gelmesi 15 dakika veya daha uzun sürebilir.

Bir bağlantı havuzunu koruyan çoğu uygulama (Rails'teki ActiveRecord gibi) veritabanına yeni bir bağlantı açabilir. Ancak, bazı durumlarda bir uygulama yeniden bağlanamayabilir. Böyle bir durumda, heroku uygulamanızı yeniden çevrimiçi hale getirmek için yeniden başlatabilirsiniz.

Bu, kritik üretim uygulamaları için hobi veritabanları çalıştırmamanızı önerdiğimiz nedenlerden biridir. Standart ve Premium veritabanları kesinti olayları için bildirimler içerir ve genel olarak çok daha performanslı ve kararlıdır. Standart veya premium bir plana geçmek için pg: copy kullanabilirsiniz.

Bu devam ederse, heroku eklentileri ile yeni bir veritabanı (farklı bir sunucuda) sağlamayı deneyebilirsiniz: add, ardından verileri taşımak için pg: copy kullanın. Hobi katmanı kurallarının ücretsiz veritabanı kadar 9 dolarlık temel plan için de geçerli olduğunu unutmayın.

Teşekkürler, Bradley


1
50 $ / ay veritabanı planındayken hazır yanıtın ne olduğunu merak ediyorum.
mpoisot

1
Yalnızca hobi katmanları paylaşılan veritabanı sunucularını kullanır. Aylık 50 $ planıyla kendi sunucunuz var, bu nedenle bu sorunla karşılaşıyorsanız, onu oluşturan kendi uygulamanızdır. Aylık 50 $ planla daha fazla yönetim seçeneğiniz var, bu nedenle teşhis etmek ve düzeltmek daha kolay.
Jessamyn Smith

Standart seçenekle yapabileceğiniz yönetim seçenekleri nelerdir açıklar mısınız? Ayrıca bu mesajı sadece 200 bağlantıyla alıyorum.
Pencilcheck

6

Aslında şunu kullanarak django ucunda bağlantı havuzu oluşturmayı denedim:

https://github.com/gmcguire/django-db-pool

ancak mevcut bağlantı sayısını 20 açık bağlantı olan standart geliştirme DB kotasının altına düşürmeme rağmen yine de bu hatayı aldım.

Burada postgresql veritabanınızı Amazon RDS'nin ücretsiz / ucuz katmanına nasıl taşıyacağınızla ilgili bir makale var. Bu, max_connectionsdaha yükseğe ayarlamanıza izin verir . Bu ayrıca, PGBouncer'ı kullanarak veritabanı düzeyinde bağlantıları bir araya getirmenize olanak tanır.

https://www.lewagon.com/blog/how-to-migrate-heroku-postgres-database-to-amazon-rds

GÜNCELLEME:

Heroku, açık talebime yanıt verdi ve veritabanımın kendi ağlarında yanlış bir şekilde yük dengelendiğini belirtti. Sistemlerindeki iyileştirmelerin gelecekte benzer sorunları önlemesi gerektiğini söylediler. Bununla birlikte, destek veritabanımı manuel olarak yeniden konumlandırdı ve performans önemli ölçüde iyileştirildi.


Bence veritabanını taşımak, üzerinde tam kontrole sahip olmak için en iyi çözümdür. O makale için teşekkürler.
nathancahill

-3

Aşağıdaki komutu kullanarak postgres veritabanınızı yeniden başlatın:

postgres -D /usr/local/var/postgres

Postgres DB, Heroku tarafından barındırılan bir hizmettir, bu nedenle bu çalışmayacaktır.
flurdy
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.