연결 관리

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 사용자, psqlpg_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_backendpg_terminate_backend 두 가지 방법을 모두 사용할 수 있습니다. 프로세스의 pidpg_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 드라이버는 애플리케이션 수준과 애플리케이션 서버 수준 모두에서 연결 풀링을 위한 메서드를 제공합니다.

또는 다음과 같은 타사 도구를 사용하여 PgBouncerDatabases for PostgreSQL 배포 환경에는 PgBouncer's auth_query 인증에 대한 기본 지원이 포함되어 있으므로, PgBouncer 인스턴스를 실행할 때 로컬 비밀번호 목록을 관리하지 않고도 데이터베이스를 통해 사용자를 인증할 수 있으며, 비밀번호 변경 시 PgBouncer 를 재시작하지 않아도 변경 사항이 즉시 적용됩니다. 설정 단계에 대해서는 ‘ PgBouncer 를 사용한 연결 풀링’을 참조하십시오.

연결 한계 늘리기

PostgreSQL 연결당 일정량의 메모리를 할당하며, 일반적으로 연결당 약 5~10MB 정도입니다. 연결 한계를 늘리기 전에 배치에 사용할 수 있는 총 메모리를 고려하는 것이 중요합니다. 연결 한계를 올리려면 먼저 추가 연결을 수용할 수 있는 충분한 메모리를 확보하기 위해 배치를 스케일링하려고 할 수 있습니다.

다음으로, 배치에서 max_connections의 값을 변경하십시오. PostgreSQL 구성을 영구적으로 변경하려면 Cloud Databases cli-plugin 또는 API를 사용하여 배치의 구성 파일에 변경사항을 작성할 수 있습니다.

예를 들어, max_connections를 215로 올리려면 배치를 데이터 멤버당 최소 2GB RAM(배치의 RAM 총계는 4GB)으로 스케일링하는 것이 좋습니다. 스케일링 오퍼레이션이 완료되면 연결 한계를 설정하십시오.

  1. max_connections 을 조정하기 전에 다음과 같은 명령을 사용하여 원하는 지역을 타겟팅하세요:
ibmcloud target -r <REGION>
  1. 그런 다음, 다음과 같은 명령을 사용하여 배치 그룹에 사용 가능한 메모리 양을 늘리십시오.
ibmcloud cdb deployment-groups-set deployment-example member --memory 4096
  1. 마지막으로 다음과 같은 명령을 사용하여 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/IP 연결이 끊어진 상태에서도 TCP 의 키페일브(keepalive) 타임아웃이 만료될 때까지 반개방/반폐쇄 상태로 남아 있을 수 있습니다. 이 시나리오를 피하려면 자신의 특정 애플리케이션 드라이버에서도 socket_timeoutconnection_timeout 설정을 지정하십시오. 올바른 설정은 특정 워크로드마다 다를 수 있으며, 프로덕션으로 이동하기 전에 로드 테스트를 실행하는 것이 중요합니다. connection_timeout 의 경우, 2~5초가 좋은 시작점입니다. socket_timeout 의 경우, 30~60초 정도가 좋은 시작점입니다.

또한 서버 측에서는 다음의 활성 유지 구성이 기본값으로 사용됩니다.

  • tcp_keepalives_idle의 경우 5분으로 설정됨
  • tcp_keepalives_interval 프로브 간격의 경우 10초로 설정됨
  • tcp_keepalives_count의 경우 6으로 설정됨

반개방/반폐쇄 연결이나 연결 시도 급증으로 인해 배포 환경에 과부하가 걸리는 것을 방지하려면, Postgres [max_connections매개변수](/docs/databases-for-postgresql?topic=databases-for-postgresql-changing-configuration) 값을 예상 연결 수의 최소 두 배 이상으로 설정하십시오.

연결 한도에 도달하면 즉시 모든 연결을 종료할 수 있습니다.