연결 관리
Databases for PostgreSQL 배포에 대한 연결은 리소스를 사용하므로 배포의 성능을 조정하는 데 필요한 연결 수를 고려하는 것이 중요합니다. PostgreSQL은 max_connections
설정을 통해 연결 수(및 연결에서 이용되는 리소스)를 제한하여 런어웨이 연결 동작이 배치의 리소스를 너무 많이 사용하지 않도록 합니다.
관리자 사용자로 ' max_connections
' 값과 ' psql
'
값을 확인할 수 있습니다.
ibmclouddb=> SHOW max_connections;
max_connections
-----------------
115
(1 row)
연결 한계
프로비저닝 시에 Databases for PostgreSQL에서는 PostgreSQL 데이터베이스에 대한 최대 연결 수를 115로 설정합니다. 데이터베이스의 상태와 무결성을 유지할 수 있도록 수퍼유저의 경우 15개의 연결이 예비되어 있으며, 사용자와 사용자 애플리케이션의 경우 100개의 연결이 사용 가능합니다. 데이터베이스에 대한 연결 수가 100개 연결 제한을 초과하면 새 연결이 실패하고 오류가 반환됩니다.
FATAL: remaining connection slots are reserved for
non-replication superuser connections
배치에 대한 연결 한계를 초과하면 애플리케이션에서 데이터베이스에 연결하지 못하게 될 수 있습니다.
admin 사용자, psql
및 pg_stat_database
를 사용하여 연결 수를 확인할 수 있습니다.
SELECT count(distinct(numbackends)) FROM pg_stat_database;
연결이 이동하는 위치를 파악해야 하는 경우 연결을 데이터베이스별로 나눌 수 있습니다.
SELECT datname, numbackends FROM pg_stat_database;
특정 데이터베이스에 대한 연결을 추가로 조사하려면 pg_stat_activity
를 조회하십시오.
SELECT * FROM pg_stat_activity WHERE datname='ibmclouddb';
연결 종료
관리자는 pg_signal_backend
역할을 갖습니다. 재설정하거나 닫아야 하는 연결이 있는 경우 관리자 사용자는 ' pg_cancel_backend
' 및 ' pg_terminate_backend
' 을 모두 사용할 수 있습니다. 프로세스의 pid
는 pg_stat_activity
테이블에서 찾을 수 있습니다.
-
pg_cancel_backend
는 연결을 종료하지 않고 실행 중일 수 있는 다른 조회를 중지하지 않은 상태로 연결의 현재 조회를 취소합니다.SELECT pg_cancel_backend(pid);
-
pg_terminate_backend
는 전체 프로세스를 중지하고 연결을 닫습니다.SELECT pg_terminate_backend(pid);
admin 사용자에게는 수퍼유저를 제외한 배치의 모든 사용자에 대한 연결을 재설정하거나 닫을 수 있는 권한이 있습니다. 배치의 고가용성을 방해하므로 ibm-replication
사용자의 복제 연결을 종료하지 않도록 주의하십시오.
연결 종료
배포가 연결 제한에 도달하거나 배포에 연결하는 데 문제가 있고 많은 수의 연결이 문제가 있다고 의심되는 경우 배포에 대한 모든 연결을 끊으세요.
UI의 설정 탭에는 배치에 대한 End connections
단추가 있습니다. 이 단추를 사용하면 배치에 연결된 모든 항목이 중단되므로 주의해서 사용하십시오.
배포에 대한 연결을 종료하는 CLI 명령은 다음과 같습니다:
ibmcloud cdb deployment-kill-connections <DEPLOYMENT_NAME_OR_CRN>
Cloud Databases API를 사용하여 모든 연결 오퍼레이션을 수행하고 종료할 수도 있습니다.
연결 풀링
연결 한계를 초과하지 않도록 방지하고 애플리케이션으로부터의 연결이 효율적으로 처리되도록 하는 한 가지 방법은 연결 풀링을 사용하는 것입니다. IBM Cloud® Databases for PostgreSQL 연결 한도가 500개 이상 연결로 설정되었음을 감지한 경우, 연결 풀링을 사용하거나 연결의 보다 효율적인 사용 및 유지 방법을 재평가하는 작업을 신중히 고려해야 합니다. PostgreSQL 커뮤니티의 성능 벤치마크에서는 데이터베이스 성능에 최적일 수 있도록 500개 연결 이하를 제안합니다.
많은 PostgreSQL 드라이버 라이브러리에는 연결 풀링 클래스 및 함수가 있습니다. 유스 케이스에 가장 적합한 연결 풀링을 구현하려면 드라이버의 문서를 참조해야 합니다. 예를 들어 Python 드라이버 Psycopg2 애플리케이션에서 연결 풀링을 처리하는 클래스가 있습니다. Java PostgreSQL JDBC 드라이버에는 애플리케이션 및 애플리케이션 서버 수준 모두에서 연결 풀링에 대한 메서드가 있습니다.
또는 PgBouncer 같은 타사 도구를 사용하여 애플리케이션의 연결을 관리할 수 있습니다.
연결 한계 늘리기
PostgreSQL 연결별로 일정량의 메모리를 할당하는데, 일반적으로 연결당 약 5~10MB입니다. 연결 한계를 늘리기 전에 배치에 사용할 수 있는 총 메모리를 고려하는 것이 중요합니다. 연결 한계를 올리려면 먼저 추가 연결을 수용할 수 있는 충분한 메모리를 확보하기 위해 배치를 스케일링하려고 할 수 있습니다.
다음으로, 배치에서 max_connections
의 값을 변경하십시오. PostgreSQL 구성을 영구적으로 변경하려면 Cloud Databases cli-plugin 또는 API를 사용하여 배치의 구성 파일에 변경사항을 작성할 수 있습니다.
예를 들어, max_connections
를 215로 올리려면 배치를 데이터 멤버당 최소 2GB RAM(배치의 RAM 총계는 4GB)으로 스케일링하는 것이 좋습니다. 스케일링 오퍼레이션이 완료되면 연결 한계를 설정하십시오.
max_connections
을 조정하기 전에 다음과 같은 명령을 사용하여 원하는 지역을 타겟팅하세요:
ibmcloud target -r <REGION>
- 그런 다음, 다음과 같은 명령을 사용하여 배치 그룹에 사용 가능한 메모리 양을 늘리십시오.
ibmcloud cdb deployment-groups-set deployment-example member --memory 4096
- 마지막으로 다음과 같은 명령을 사용하여
max_connections
를 조정하십시오.
ibmcloud cdb deployment-configuration <DEPLOYMENT_NAME_OR_CRN> '{"configuration":{"max_connections":215}}'
API를 통해 변경하려면 다음 명령을 사용하세요:
curl -X PATCH `https://api.{region}.databases.cloud.ibm.com/v5/ibm/deployments/{id}/groups/member' \
-H "Authorization: Bearer $APIKEY" \
-H "Content-Type: application/json" \
-d '{"memory": {
"allocation_mb": 4096
}
}'
curl -X PATCH 'https://api.{region}.databases.cloud.ibm.com/v5/ibm/deployments/{id}/configuration' \
-H "Authorization: Bearer $APIKEY" \
-H "Content-Type: application/json" \
-d '{"configuration":{
"max_connections":215
}
}'
연결 한도 및 TCP/IP 활성 유지(keepalive) 설정
네트워크 연결이 끊어지거나 장애가 발생하면 TCP 킵얼라이브 타임아웃에 도달할 때까지 끊어진 TCP/IP 연결이 반개방/반폐쇄 상태로 유지될 수 있습니다. 이 시나리오를 피하려면 자신의 특정 애플리케이션 드라이버에서도 socket_timeout
및 connection_timeout
설정을 지정하십시오. 올바른 설정은 특정 워크로드마다 다를 수 있으며, 프로덕션으로 이동하기 전에 로드 테스트를 실행하는 것이 중요합니다.
' connection_timeout
'의 좋은 시작점은 2~5초입니다. ' socket_timeout
'의 경우 30~60초가 좋은 시작점입니다.
또한 서버 측에서는 다음의 활성 유지 구성이 기본값으로 사용됩니다.
tcp_keepalives_idle
의 경우 5분으로 설정됨tcp_keepalives_interval
프로브 간격의 경우 10초로 설정됨tcp_keepalives_count
의 경우 6으로 설정됨
반개방/폐쇄 연결 또는 연결 시도의 버스트가 배포를 압도하는 것을 방지하려면 Postgres ' max_connections
매개 변수를 예상 연결 수의 최소 두 배로 설정하세요.
연결 한도에 도달하면 즉시 모든 연결을 종료할 수 있습니다.