Heroku “psql: FATAL: slot koneksi yang tersisa dicadangkan untuk koneksi pengguna super non-replikasi”

120

Saya sedang mengembangkan aplikasi di Heroku dengan backend Postgresql. Secara berkala, saya mendapatkan pesan kesalahan ini ketika mencoba mengakses database, baik dari CLI maupun dari memuat halaman di server:

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

Adakah yang melihat ini sebelumnya atau tolong bantu mengarahkan saya ke arah yang benar?

nathancahill
sumber
1
Memiliki masalah yang sama. Saya membaca di suatu tempat bahwa dukungan Heroku telah "mendeteksi beberapa masalah" di beberapa server, dan mereka merekomendasikan pengguna yang bersangkutan untuk menyediakan basis data Dasar baru dan bermigrasi ke sana menggunakan pgbackups. Masalah saya sekarang adalah bahwa aplikasinya sangat baru sehingga saya belum membuat cadangan, dan saya mendapatkan kesalahan yang sama saat mencoba membuatnya tentu saja: D
André Laszlo
Sebagai catatan, saya dapat menggunakan heroku pgbackupsperintah untuk membuat cadangan meskipun ada kesalahan ini.
markshiz
Untuk mereproduksi masalah ini, Anda dapat membuat terminal dalam jumlah besar. .batskrip di Windows untuk ini: di for /l %%x in (1, 1, 100) do ( start psql )mana 100 adalah jumlah backend yang diinginkan.
koxt
Saya memiliki masalah yang sama. Saya tidak dapat mentransfer data ke database baru menggunakan pg:backups copy, pg:backups capture, dengan menghubungkan ke dari pgAdmindi komputer saya sendiri, atau dengan cara lain saya bisa membayangkan. Bahkan pg:killalltidak membantu. Satu jam kemudian, saya mencoba lagi dan koneksinya 50-50, jadi setelah beberapa upaya saya berhasil pg:backups copydan aplikasi saya kembali mengudara. Ini ... bukan hari yang menyenangkan. Jika Anda mencari ini di Google, minumlah secangkir air.
Aur Saraf
1
Saya sekarang mengalami ini lagi. Betapa beruntungnya telah mendokumentasikan pengalaman saya sebelumnya ... Edit: restart kali ini sudah cukup.
Aur Saraf

Jawaban:

56

Anda juga perlu meningkatkan max_connectionspengaturan konfigurasi atau (mungkin lebih baik) menggunakan penggabungan koneksi untuk merutekan sejumlah besar permintaan pengguna melalui kumpulan koneksi yang lebih kecil.

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

kgrittn.dll
sumber
14
Juga masalah umum adalah sesuatu seperti aplikasi sisi klien itu mogok dan membiarkan koneksi terbuka dan kemudian membuka yang baru ketika dimulai ulang. Jika hal semacam ini sering terjadi maka Anda akan kehabisan koneksi. Atau aplikasi hanya dikonfigurasi dengan tidak benar dan membuka terlalu banyak koneksi.
Scott Marlowe
5
Saya tidak berpikir saya dapat mengubah pengaturan konfigurasi di Heroku. Apakah ada cara untuk menutup semua koneksi yang terbuka?
nathancahill
1
Mudah-mudahan server dikonfigurasi untuk paket keepalive dengan basis yang cukup agresif. Ini akan menyebabkan sesi dihentikan dalam waktu yang wajar jika koneksi tiba-tiba terputus. Jika itu tidak dikonfigurasi, jika Anda dapat masuk sebagai pengguna super database, Anda dapat mengidentifikasi pidnilai untuk sesi dan menggunakan pg_terminate_backend()fungsi untuk menghentikannya. Untuk menghindari masalah, pastikan untuk menutup koneksi dengan benar daripada secara tiba-tiba mematikan sisi klien.
kgrittn
@nathancahill Akhiri semua koneksi ke database:heroku pg:killall
Roko
9

Pengecualian ini terjadi ketika saya lupa menutup koneksi

Sanyifejű
sumber
7

Lihat Heroku “psql: FATAL: slot koneksi yang tersisa dicadangkan untuk koneksi pengguna super non-replikasi” :

Heroku terkadang mengalami masalah dengan load balancing database.

André Laszlo, markshiz dan saya semua melaporkan berurusan dengan itu di komentar tentang pertanyaan.

Untuk menghemat panggilan dukungan, berikut tanggapan yang saya dapatkan dari Dukungan Heroku untuk masalah serupa:

Halo,

Salah satu batasan database tingkat hobi adalah pemeliharaan mendadak. Banyak basis data hobi berjalan di satu server bersama, dan terkadang kami perlu memulai ulang server tersebut untuk tujuan pemeliharaan perangkat keras, atau memigrasi basis data ke server lain untuk penyeimbangan beban. Jika itu terjadi, Anda akan melihat kesalahan di log Anda atau mengalami masalah koneksi. Jika server memulai ulang, mungkin perlu waktu 15 menit atau lebih untuk database kembali online.

Sebagian besar aplikasi yang mempertahankan kumpulan koneksi (seperti ActiveRecord di Rails) bisa membuka koneksi baru ke database. Namun, dalam beberapa kasus, aplikasi tidak dapat terhubung kembali. Jika itu terjadi, Anda dapat memulai ulang aplikasi Anda untuk membuatnya kembali online.

Ini adalah salah satu alasan kami merekomendasikan untuk tidak menjalankan database hobi untuk aplikasi produksi penting. Database Standar dan Premium menyertakan pemberitahuan untuk peristiwa waktu henti, dan secara umum jauh lebih berkinerja dan stabil. Anda dapat menggunakan pg: copy untuk bermigrasi ke paket standar atau premium.

Jika ini terus berlanjut, Anda dapat mencoba menyediakan database baru (di server yang berbeda) dengan addons heroku: add, lalu gunakan pg: copy untuk memindahkan data. Perlu diingat bahwa aturan tingkat hobi berlaku untuk paket dasar $ 9 serta database gratis.

Terima kasih, Bradley

Aur Saraf
sumber
1
Saya ingin tahu apa respons terekam ketika Anda menggunakan paket database $ 50 / bulan?
mpoisot
1
Hanya tingkatan hobi yang menggunakan server database bersama. Dengan paket $ 50 / bulan Anda memiliki server sendiri, jadi jika Anda mengalami masalah ini, aplikasi Anda sendiri yang membuatnya. Anda memiliki lebih banyak opsi administratif dengan paket $ 50 / bulan, sehingga lebih mudah untuk mendiagnosis dan memperbaikinya.
Jessamyn Smith
Bisakah Anda menjelaskan apa saja opsi administratif yang Anda dapat dengan opsi standar? Juga mendapatkan pesan ini dengan hanya 200 koneksi.
Pencilcheck
6

Saya benar-benar mencoba mengimplementasikan penggabungan koneksi pada ujung django menggunakan:

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

tetapi saya masih menerima kesalahan ini, meskipun menurunkan jumlah koneksi yang tersedia di bawah kuota DB pengembangan standar dari 20 koneksi terbuka.

Ada artikel di sini tentang cara memindahkan database postgresql Anda ke tingkat gratis / murah dari Amazon RDS. Ini akan memungkinkan Anda untuk mengatur max_connectionslebih tinggi. Ini juga akan memungkinkan Anda untuk mengumpulkan koneksi di tingkat database menggunakan PGBouncer.

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

MEMPERBARUI:

Heroku menanggapi tiket saya yang terbuka dan menyatakan bahwa database saya tidak dimuat dengan benar dan seimbang di jaringan mereka. Mereka mengatakan bahwa perbaikan sistem mereka harus mencegah masalah serupa di masa mendatang. Meskipun demikian, dukungan relokasi database saya secara manual dan kinerja secara nyata meningkat.

markshiz
sumber
Saya pikir memindahkan database adalah solusi terbaik untuk memiliki kendali penuh atasnya. Terima kasih untuk artikel itu.
nathancahill
-3

Mulai ulang database postgres Anda dengan perintah berikut:

postgres -D /usr/local/var/postgres
Naveen Agarwal
sumber
Postgres DB adalah layanan yang dihosting oleh Heroku, jadi ini tidak akan berfungsi.
Flurdy