Heroku Tấn psql: FATAL: các khe kết nối còn lại được dành riêng cho các kết nối siêu người dùng không sao chép


120

Tôi đang phát triển một ứng dụng trên Heroku với phần phụ trợ Postgresql. Định kỳ, tôi nhận được thông báo lỗi này khi cố gắng truy cập cơ sở dữ liệu, cả từ CLI và từ việc tải một trang trên máy chủ:

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

Bất cứ ai nhìn thấy điều này trước đây hoặc xin vui lòng giúp tôi chỉ đúng hướng?


1
Có cùng một vấn đề. Tôi đã đọc ở đâu đó rằng hỗ trợ Heroku đã "phát hiện ra một số vấn đề" trên một số máy chủ và họ đề nghị người dùng được đề cập cung cấp cơ sở dữ liệu Cơ bản mới và di chuyển sang sử dụng pgbackup. Vấn đề của tôi bây giờ là ứng dụng này quá mới đến nỗi tôi chưa tạo được bản sao lưu và tôi cũng gặp lỗi tương tự khi cố gắng tạo một khóa học: D
André Laszlo

Đối với bản ghi, tôi có thể sử dụng heroku pgbackupslệnh để tạo bản sao lưu mặc dù có lỗi này.
markshiz

Để tái tạo vấn đề này, bạn có thể tạo một lượng lớn thiết bị đầu cuối. .battập lệnh trong Windows cho điều này: for /l %%x in (1, 1, 100) do ( start psql )trong đó 100 là số lượng phụ trợ mong muốn.
koxt

Tôi đã từng gặp vấn đề tương tự. Tôi đã không thể chuyển dữ liệu đến một cơ sở dữ liệu mới sử dụng pg:backups copy, pg:backups capturebằng cách kết nối với nó từ pgAdmintrên máy tính của riêng tôi, hoặc bất kỳ cách nào khác tôi có thể tưởng tượng. Thậm chí pg:killallkhông giúp được gì. Một giờ sau, tôi đã thử lại và các kết nối là 50-50, vì vậy sau một vài lần thử tôi đã thành công pg:backups copyvà ứng dụng của tôi đã hoạt động trở lại. Đây không phải là một ngày vui vẻ. Nếu bạn googled này, uống một cốc nước.
Aur Saraf

1
Bây giờ tôi đang có điều này một lần nữa. Thật may mắn vì đã ghi lại kinh nghiệm trước đây của tôi ... Chỉnh sửa: lần này khởi động lại là đủ.
Aur Saraf

Câu trả lời:


56

Bạn cần tăng max_connectionscài đặt cấu hình hoặc (có thể tốt hơn) sử dụng nhóm kết nối để định tuyến một số lượng lớn yêu cầu người dùng thông qua nhóm kết nối nhỏ hơn.

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


14
Ngoài ra một vấn đề phổ biến là một cái gì đó giống như ứng dụng phía máy khách đó bị sập và để lại các kết nối mở và sau đó mở những cái mới khi nó khởi động lại. Nếu loại điều này xảy ra rất nhiều thì bạn sẽ hết kết nối. Hoặc ứng dụng chỉ được cấu hình không đúng cách và mở quá nhiều kết nối.
Scott Marlowe

5
Tôi không nghĩ mình có thể thay đổi cài đặt cấu hình trên Heroku. Có cách nào để đóng tất cả các kết nối mở?
nathancahill

1
Hy vọng rằng máy chủ được cấu hình cho các gói giữ nguyên trên cơ sở khá tích cực. Điều này sẽ khiến các phiên kết thúc trong thời gian hợp lý nếu các kết nối bị ngắt đột ngột. Nếu điều đó không được cấu hình, nếu bạn có thể đăng nhập như một siêu người dùng cơ sở dữ liệu, bạn có thể xác định các pidgiá trị cho các phiên và sử dụng pg_terminate_backend()chức năng để tiêu diệt chúng. Để tránh sự cố, hãy đảm bảo đóng các kết nối đúng cách thay vì đột ngột giết chết phía máy khách.
kgrittn

@nathancahill Chấm dứt tất cả các kết nối đến cơ sở dữ liệu:heroku pg:killall
Roko


7

Xem Heroku Hồi psql: FATAL: các khe kết nối còn lại được dành riêng cho các kết nối siêu người dùng không sao chép .

Heroku đôi khi có vấn đề với cân bằng tải cơ sở dữ liệu.

André Laszlo, markshizVà tôi tất cả các báo cáo giao dịch với điều đó trong ý kiến về vấn đề.

Để tiết kiệm cho bạn cuộc gọi hỗ trợ, đây là phản hồi tôi nhận được từ Hỗ trợ Heroku cho một vấn đề tương tự:

Xin chào,

Một trong những hạn chế của cơ sở dữ liệu tầng sở thích là bảo trì không báo trước. Nhiều cơ sở dữ liệu sở thích chạy trên một máy chủ dùng chung và đôi khi chúng tôi sẽ cần khởi động lại máy chủ đó cho mục đích bảo trì phần cứng hoặc di chuyển cơ sở dữ liệu sang máy chủ khác để cân bằng tải. Khi điều đó xảy ra, bạn sẽ thấy một lỗi trong nhật ký của mình hoặc gặp sự cố khi kết nối. Nếu máy chủ đang khởi động lại, có thể mất 15 phút trở lên để cơ sở dữ liệu trở lại trực tuyến.

Hầu hết các ứng dụng duy trì nhóm kết nối (như ActiveRecord trong Rails) chỉ có thể mở một kết nối mới tới cơ sở dữ liệu. Tuy nhiên, trong một số trường hợp, ứng dụng sẽ không thể kết nối lại. Nếu điều đó xảy ra, bạn có thể heroku khởi động lại ứng dụng của mình để đưa nó trở lại trực tuyến.

Đây là một trong những lý do chúng tôi khuyên bạn không nên chạy cơ sở dữ liệu sở thích cho các ứng dụng sản xuất quan trọng. Cơ sở dữ liệu tiêu chuẩn và cao cấp bao gồm các thông báo cho các sự kiện ngừng hoạt động, và nói chung là hiệu suất và ổn định hơn nhiều. Bạn có thể sử dụng pg: copy để chuyển sang gói tiêu chuẩn hoặc cao cấp.

Nếu điều này tiếp tục, bạn có thể thử cung cấp cơ sở dữ liệu mới (trên một máy chủ khác) với addon heroku: add, sau đó sử dụng pg: copy để di chuyển dữ liệu. Hãy nhớ rằng các quy tắc cấp độ sở thích áp dụng cho gói cơ bản $ 9 cũng như cơ sở dữ liệu miễn phí.

Cảm ơn, Bradley


1
Tôi tự hỏi phản ứng đóng hộp là gì khi bạn sử dụng gói cơ sở dữ liệu $ 50 / tháng?
mpoisot

1
Chỉ các tầng sở thích sử dụng máy chủ cơ sở dữ liệu chia sẻ. Với gói 50 đô la / tháng, bạn có máy chủ của riêng mình, vì vậy nếu bạn gặp phải vấn đề này, thì chính ứng dụng của bạn sẽ tạo ra nó. Bạn có nhiều tùy chọn quản trị hơn với gói $ 50 / tháng, vì vậy việc chẩn đoán và khắc phục sẽ dễ dàng hơn.
Jessamyn Smith

Bạn có thể giải thích các tùy chọn quản trị bạn có thể với tùy chọn tiêu chuẩn là gì? Cũng nhận được tin nhắn này chỉ với 200 kết nối.
Bút chì

6

Tôi thực sự đã cố gắng thực hiện tổng hợp kết nối ở đầu django bằng cách sử dụng:

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

nhưng tôi vẫn nhận được lỗi này, mặc dù đã giảm số lượng kết nối có sẵn dưới mức hạn ngạch DB phát triển tiêu chuẩn là 20 kết nối mở.

Có một bài viết ở đây về cách di chuyển cơ sở dữ liệu postgresql của bạn sang tầng RDS miễn phí / giá rẻ. Điều này sẽ cho phép bạn đặt max_connectionscao hơn. Điều này cũng sẽ cho phép bạn kết nối các kết nối ở cấp cơ sở dữ liệu bằng PGBouncer.

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

CẬP NHẬT:

Heroku đã trả lời vé mở của tôi và tuyên bố rằng cơ sở dữ liệu của tôi tải không đúng cách cân bằng trong mạng của họ. Họ nói rằng những cải tiến cho hệ thống của họ sẽ ngăn chặn những vấn đề tương tự trong tương lai. Tuy nhiên, hỗ trợ di chuyển thủ công cơ sở dữ liệu của tôi và hiệu suất được cải thiện rõ rệt.


Tôi nghĩ rằng việc di chuyển cơ sở dữ liệu là giải pháp tốt nhất để có toàn quyền kiểm soát nó. Cảm ơn bài viết đó.
nathancahill

-3

Khởi động lại cơ sở dữ liệu postgres của bạn bằng lệnh sau:

postgres -D /usr/local/var/postgres

Postgres DB là dịch vụ được tổ chức bởi Heroku, vì vậy điều này sẽ không hoạt động.
mạnh mẽ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.