Heroku "psql: FATAL: 나머지 연결 슬롯은 복제되지 않은 슈퍼 사용자 연결을 위해 예약되었습니다."
저는 Heroku에서 Postgresql 백엔드로 앱을 개발하고 있습니다.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 Support에서 받은 답변은 다음과 같습니다.
안녕하세요.
취미 계층 데이터베이스의 제한 사항 중 하나는 예고 없이 유지 관리하는 것입니다.대부분의 취미 데이터베이스는 단일 공유 서버에서 실행되며, 하드웨어 유지관리를 위해 서버를 재시작하거나 로드 밸런싱을 위해 데이터베이스를 다른 서버로 마이그레이션해야 할 경우가 있습니다.이 경우 로그에 오류가 표시되거나 연결에 문제가 발생합니다.서버가 다시 시작되는 경우, 데이터베이스가 다시 온라인 상태가 되는 데 15분 이상 걸릴 수 있습니다.
연결 풀을 유지하는 대부분의 앱(예: 레일즈의 ActiveRecord)은 데이터베이스에 대한 새 연결을 열 수 있습니다.그러나 경우에 따라 앱을 다시 연결할 수 없습니다.그렇게 되면 herku를 다시 시작하여 다시 온라인으로 전환할 수 있습니다.
이러한 이유로 중요한 프로덕션 응용프로그램에 대한 취미 데이터베이스를 실행하지 않는 것이 좋습니다.Standard 및 Premium 데이터베이스에는 다운타임 이벤트에 대한 알림이 포함되어 있으며 일반적으로 성능과 안정성이 훨씬 더 높습니다.pg:copy를 사용하여 표준 또는 프리미엄 요금제로 마이그레이션할 수 있습니다.
계속되면 herku addons:add를 사용하여 다른 서버에 있는 새 데이터베이스를 프로비저닝한 다음 pg:copy를 사용하여 데이터를 이동할 수 있습니다.취미 계층 규칙은 무료 데이터베이스뿐만 아니라 9달러 기본 요금제에도 적용됩니다.
고마워, 브래들리
저는 실제로 다음을 사용하여 django 엔드에 연결 풀링을 구현하려고 했습니다.
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는 제 오픈 티켓에 응답했고 제 데이터베이스가 그들의 네트워크에서 부적절하게 로드 밸런싱되었다고 말했습니다.그들은 그들의 시스템에 대한 개선이 미래에 유사한 문제들을 방지해야 한다고 말했습니다.그럼에도 불구하고 데이터베이스를 수동으로 재배치한 지원 덕분에 성능이 눈에 띄게 향상되었습니다.
Linux에서 동일한 문제를 재현하는 방법
for i in {1..300}; do
PGPASSWORD=MY_PASSWORD gnome-terminal -e $'/usr/bin/psql -h \'127.0.0.1\' -p 5432 -U MY_USERNAME'
done
닷넷 클라이언트에서 다음을 읽을 수 있습니다.
System.InvalidOperationException: An exception has been raised that is likely due to a transient failure. ---> Npgsql.PostgresException (0x80004005): 53300: sorry, too many clients already
제 경우 유휴 연결이 많아서 새로 만들기 전에 유휴 연결을 다시 사용해야 했습니다.
오류 메시지는 앱이 사용 가능한 모든 연결을 사용했음을 나타냅니다.
knex 및 typescript가 있는 aws에서 postgres를 사용하여 일부 쿼리 및 업데이트 작업을 수행하는 동안 데이터베이스 작업 390개를 완료하면 문제가 발생하며, 이로 인해 실수로 인해 knex.destroy() 작업이 정상적으로 수행되지 않습니다.오류 메시지는 다음과 같습니다.
(노드:66236) 처리되지 않은 약속거부 경고: 오류: 나머지 연결 슬롯이 복제되지 않은 슈퍼 사용자 연결용으로 예약되었습니다.
knex.destroy()가 올바른 위치로 이동하면 오류가 사라집니다.
의 맥락에서 이 문제를 묻는 질문은 없는 것 같습니다.NET 월드.
나에게, 이것은 다음과 같은 이유로 발생합니다.async void
그리고 이 방법은 행동 대표에게 전달되었습니다.Action<TMessage> action
동시에 이 지속 메서드를 호출하려는 스레드가 여러 개 있습니다.
private async void Persist(WhateverData data)
{
await _repository.InsertAsync(data);
}
해결책은 비동기식을 제거하고 대기하고 동기식으로 사용하는 것입니다.
private void Persist(PriceInfo price)
{
_repository.InsertAsync().WaitAndUnwrapException();
}
tomcat-jdbc의 최대 활성 크기를 설정하고 .properties 또는 .yml 파일에서 이 속성을 설정합니다.
spring.datasource.maxActive=5
또는
spring.sysource.max-active=5
아래와 같이:
스프링: 데이터 소스: driverClassName: 암호: URL: 사용자 이름: max-active: 5
언급URL : https://stackoverflow.com/questions/11847144/heroku-psql-fatal-remaining-connection-slots-are-reserved-for-non-replication
'it-source' 카테고리의 다른 글
ASP.NET 2.0 - app_offline.htm 사용방법 (0) | 2023.05.11 |
---|---|
Angular의 일부 항목으로 반복을 제한하려면 어떻게 해야 합니까? (0) | 2023.05.11 |
INOTIFY 구현변경된 속성 - 더 나은 방법이 있습니까? (0) | 2023.05.06 |
목록에 다른 목록이 있는지 확인합니다. (0) | 2023.05.06 |
문자열에서 클래스 인스턴스 만들기 (0) | 2023.05.06 |