[postgresql] Heroku“psql : FATAL : 나머지 연결 슬롯은 비 복제 수퍼 유저 연결 용으로 예약되어 있습니다.”

Postgresql 백엔드로 Heroku에서 앱을 개발 중입니다. 주기적으로 CLI에서 그리고 서버에 페이지를로드 할 때 데이터베이스에 액세스하려고 할 때이 오류 메시지가 표시됩니다.

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

전에 본 사람이 있습니까? 아니면 올바른 방향으로 나를 알려주십시오.



답변

max_connections구성 설정 을 늘리 거나 연결 풀링사용 하여 더 작은 연결 풀을 통해 많은 수의 사용자 요청을 라우팅해야합니다.

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


답변

이 예외는 연결을 닫는 것을 잊었을 때 발생했습니다.


답변

Heroku“psql : FATAL : 나머지 연결 슬롯은 비 복제 수퍼 유저 연결 용으로 예약 됨”을 참조하십시오 .

Heroku는 때때로 데이터베이스 부하 분산에 문제가 있습니다.

André Laszlo, markshiz그리고 저 모두 질문에 대한 의견에서 그것을 다루고 있다고보고했습니다.

지원 요청을 저장하기 위해 유사한 문제에 대해 Heroku 지원팀에서받은 응답은 다음과 같습니다.

여보세요,

취미 계층 데이터베이스의 제한 사항 중 하나는 예고되지 않은 유지 관리입니다. 많은 취미 데이터베이스가 단일 공유 서버에서 실행되며 하드웨어 유지 관리를 위해 서버를 다시 시작하거나로드 균형 조정을 위해 데이터베이스를 다른 서버로 마이그레이션해야하는 경우가 있습니다. 이 경우 로그에 오류가 표시되거나 연결 문제가 발생합니다. 서버가 다시 시작되는 경우 데이터베이스가 다시 온라인 상태가되는 데 15 분 이상 걸릴 수 있습니다.

연결 풀을 유지하는 대부분의 앱 (예 : Rails의 ActiveRecord)은 데이터베이스에 대한 새 연결을 열 수 있습니다. 그러나 경우에 따라 앱을 다시 연결할 수 없습니다. 이 경우 앱을 다시 시작하여 온라인 상태로 되돌릴 수 있습니다.

이것이 중요한 프로덕션 애플리케이션에 취미 데이터베이스를 실행하지 않는 것이 좋습니다. Standard 및 Premium 데이터베이스에는 다운 타임 이벤트에 대한 알림이 포함되어 있으며 일반적으로 훨씬 더 성능이 좋고 안정적입니다. pg : copy를 사용하여 표준 또는 프리미엄 플랜으로 마이그레이션 할 수 있습니다.

이것이 계속되면 heroku addons : add를 사용하여 새 데이터베이스 (다른 서버에서)를 프로비저닝 한 다음 pg : copy를 사용하여 데이터를 이동할 수 있습니다. 취미 등급 규칙은 $ 9 기본 플랜과 무료 데이터베이스에 적용됩니다.

감사합니다, Bradley


답변

실제로 다음을 사용하여 장고 끝에서 연결 풀링을 구현하려고 시도했습니다.

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

하지만 사용 가능한 연결 수를 표준 개발 DB 할당량 인 20 개 이하로 줄 였음에도 불구하고이 오류가 계속 발생했습니다.

여기에 postgresql 데이터베이스를 Amazon RDS의 무료 / 저렴한 계층으로 이동하는 방법에 대한 기사가 있습니다. 이렇게하면 max_connections더 높게 설정할 수 있습니다 . 또한 PGBouncer를 사용하여 데이터베이스 수준에서 연결을 풀 수 있습니다.

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

최신 정보:

Heroku는 내 공개 티켓에 응답하고 내 데이터베이스가 네트워크에서 부적절하게 부하 분산되었다고 말했습니다. 그들은 시스템을 개선하면 향후 유사한 문제를 예방할 수 있다고 말했습니다. 그럼에도 불구하고 지원은 수동으로 데이터베이스를 재배치했으며 성능이 눈에 띄게 향상되었습니다.


답변

다음 명령으로 postgres 데이터베이스를 다시 시작하십시오.

postgres -D /usr/local/var/postgres


답변