RDS 프록시 관리 - Amazon Relational Database Service

RDS 프록시 관리

이 섹션에서는 RDS 프록시 작업 및 구성을 관리하는 방법에 대한 정보를 제공합니다. 이러한 절차는 애플리케이션이 데이터베이스 연결을 가장 효율적으로 사용하고 최대 연결 재사용을 달성하는 데 도움이 됩니다. 연결 재사용을 더 많이 활용할수록 CPU 및 메모리 오버헤드를 더 많이 절약할 수 있습니다. 이렇게 하면 애플리케이션의 대기 시간이 줄어들고 데이터베이스가 애플리케이션 요청을 처리하는 데 더 많은 리소스를 사용할 수 있습니다.

RDS 프록시 수정

프록시를 생성한 후 프록시와 연결된 특정 설정을 변경할 수 있습니다. 프록시 자체, 연결된 대상 그룹 또는 둘 다 수정하면 됩니다. 각 프록시에는 연결된 대상 그룹이 있습니다.

중요

클라이언트 인증 유형IAM 인증 필드의 값은 이 프록시에 연결된 모든 Secrets Manager 보안 암호에 적용됩니다. 보안 암호마다 다른 값을 지정하려면 AWS CLI 또는 API를 대신 사용하여 프록시를 수정하세요.

프록시에 대한 설정을 수정하려면
  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/rds/에서 Amazon RDS 콘솔을 엽니다.

  2. 탐색 창에서 Proxies(프록시)를 선택합니다.

  3. 프록시 목록에서 설정을 수정하려는 프록시를 선택하거나 세부 정보 페이지로 이동합니다.

  4. 작업에서 수정을 선택합니다.

  5. 수정할 속성을 입력하거나 선택합니다. 다음을 수정할 수 있습니다.

    • 프록시 식별자 – 새 식별자를 입력하여 프록시 이름을 변경합니다.

    • 유휴 클라이언트 연결 시간 초과 - 유휴 클라이언트 연결 시간 초과의 기간을 입력합니다.

    • IAM 역할 – Secrets Manager에서 보안 암호를 검색하는 데 사용되는 IAM 역할을 변경합니다.

    • Secrets Manager 보안 암호 - Secrets Manager 보안 암호를 추가하거나 제거합니다. 이러한 비밀은 데이터베이스 사용자 이름 및 암호에 해당합니다.

    • 클라이언트 인증 유형 - (PostgreSQL만 해당) 프록시에 대한 클라이언트 연결의 인증 유형을 변경합니다.

    • IAM 인증 - 프록시 연결에 대해 IAM 인증을 요구하거나 허용하지 않습니다.

    • 전송 계층 보안 필요 - 전송 계층 보안(TLS) 요구 사항을 설정하거나 해제합니다.

    • VPC 보안 그룹 - 프록시가 사용할 VPC 보안 그룹을 추가하거나 제거합니다.

    • 향상된 로깅 활성화 - 고급 로깅을 사용하거나 사용 중지하도록 설정합니다.

  6. 수정을 선택합니다.

변경할 설정을 찾지 못한 경우 다음 절차에 따라 프록시의 대상 그룹을 업데이트합니다. 프록시와 연결된 대상 그룹은 물리적 데이터베이스 연결과 관련된 설정을 제어합니다. 각 프록시에는 default라는 하나의 연결된 대상 그룹이 있으며, 이 그룹은 프록시와 함께 자동으로 생성됩니다.

대상 그룹은 프록시 세부 정보 페이지에서만 수정할 수 있으며 Proxies(프록시) 페이지의 목록에서는 수정할 수 없습니다.

프록시 대상 그룹에 대한 설정을 수정하려면
  1. [프록시(Proxies)] 페이지에서 프록시의 세부 정보 페이지로 이동합니다.

  2. 대상 그룹에서 default 링크를 선택합니다. 현재 모든 프록시에는 default라는 단일 대상 그룹이 있습니다.

  3. 기본 대상 그룹에 대한 세부 정보 페이지에서 수정을 선택합니다.

  4. 수정할 수 있는 속성의 새 설정을 선택합니다.

    • 데이터베이스 - 다른 RDS DB 인스턴스 또는 클러스터를 선택합니다.

    • 연결 풀 최대 연결 – 프록시에서 사용할 수 있는 최대 연결 비율을 조정합니다.

    • 세션 고정 필터 - (선택 사항) 세션 고정 필터를 선택합니다. 이렇게 하면 클라이언트 연결 간 데이터베이스 연결을 멀티플렉싱하기 위한 기본 안전 조치를 우회할 수 있습니다. 현재 PostgreSQL에서는 설정이 지원되지 않습니다. EXCLUDE_VARIABLE_SETS만 선택할 수 있습니다.

      이 설정을 활성화하면 어떤 연결의 세션 변수가 다른 연결에 영향을 줄 수 있습니다. 쿼리가 현재 트랜잭션 외부에 설정된 세션 변수 값에 의존하는 경우 이로 인해 오류나 정확성 문제가 발생할 수 있습니다. 애플리케이션이 클라이언트 연결 간에 데이터베이스 연결을 공유해도 안전한지 확인한 후 이 옵션을 사용하는 것이 좋습니다.

      다음과 같은 패턴이 나타나면 안전한 상태로 간주될 수 있습니다.

      • 유효 세션 변수 값에 변경 사항이 없는 SET 명령문이 있습니다(즉 세션 변수에 변경 사항이 없는 경우).

      • 세션 변수 값을 변경하고 동일한 트랜잭션에서 명령문을 실행합니다.

      자세한 내용은 고정 방지 단원을 참조하십시오.

    • 연결 대여 시간 초과 - 연결 대여 시간 초과 간격을 조정합니다. 이 설정은 최대 연결 수가 프록시에 이미 사용되고 있는 경우에 적용됩니다. 이 설정은 시간 초과 오류를 반환하기 전에 프록시가 연결을 사용할 수 있을 때까지 기다리는 시간을 지정합니다.

    • 초기화 쿼리 - (선택 사항) 초기화 쿼리를 추가하거나 현재 쿼리를 수정합니다. 각 새 데이터베이스 접속을 열 때 실행할 프록시에 대한 하나 이상의 SQL 문을 지정할 수 있습니다. 이 설정은 일반적으로 각 접속에 표준 시간대 및 문자 집합과 같은 동일한 설정이 있는지 확인하기 위해 SET 문과 함께 사용됩니다. 여러 문의 경우 세미콜론을 구분 기호로 사용합니다. SET x=1, y=2와 같은 단일 SET 문에 여러 변수를 포함할 수도 있습니다.

    대상 그룹 식별자, 데이터베이스 엔진과 같은 특정 속성은 변경할 수 없습니다.

  5. Modify target group(대상 그룹 수정)을 선택합니다.

AWS CLI를 사용하여 프록시를 수정하려면 modify-db-proxy, modify-db-proxy-target-group, deregister-db-proxy-targetsregister-db-proxy-targets 명령을 사용합니다.

modify-db-proxy 명령을 사용하여 다음과 같은 속성을 변경할 수 있습니다.

  • 프록시에서 사용하는 Secrets Manager 보안 암호 집합입니다.

  • TLS가 필요한지 여부입니다.

  • 유휴 클라이언트 시간 초과.

  • 디버깅을 위해 SQL 문에서 추가 정보를 로깅할지 여부입니다.

  • Secrets Manager 보안 암호를 검색하는 데 사용되는 IAM 역할입니다.

  • 프록시에서 사용하는 보안 그룹입니다.

다음 예제에서는 기존 프록시의 이름을 바꾸는 방법을 보여 줍니다.

aws rds modify-db-proxy --db-proxy-name the-proxy --new-db-proxy-name the_new_name

연결 관련 설정을 수정하거나 대상 그룹의 이름을 변경하려면 modify-db-proxy-target-group 명령을 사용합니다. 현재 모든 프록시에는 default라는 단일 대상 그룹이 있습니다. 이 대상 그룹으로 작업하는 경우 프록시 이름을 지정하고 대상 그룹 이름에 default를 지정합니다.

다음 예제에서는 대상 그룹을 사용하여 프록시에 대한 MaxIdleConnectionsPercent 설정을 먼저 확인한 다음 변경하는 방법을 보여 줍니다.

aws rds describe-db-proxy-target-groups --db-proxy-name the-proxy { "TargetGroups": [ { "Status": "available", "UpdatedDate": "2019-11-30T16:49:30.342Z", "ConnectionPoolConfig": { "MaxIdleConnectionsPercent": 50, "ConnectionBorrowTimeout": 120, "MaxConnectionsPercent": 100, "SessionPinningFilters": [] }, "TargetGroupName": "default", "CreatedDate": "2019-11-30T16:49:27.940Z", "DBProxyName": "the-proxy", "IsDefault": true } ] } aws rds modify-db-proxy-target-group --db-proxy-name the-proxy --target-group-name default --connection-pool-config ' { "MaxIdleConnectionsPercent": 75 }' { "DBProxyTargetGroup": { "Status": "available", "UpdatedDate": "2019-12-02T04:09:50.420Z", "ConnectionPoolConfig": { "MaxIdleConnectionsPercent": 75, "ConnectionBorrowTimeout": 120, "MaxConnectionsPercent": 100, "SessionPinningFilters": [] }, "TargetGroupName": "default", "CreatedDate": "2019-11-30T16:49:27.940Z", "DBProxyName": "the-proxy", "IsDefault": true } }

deregister-db-proxy-targetsregister-db-proxy-targets 명령을 사용하여 대상 그룹을 통해 프록시가 연결된 RDS DB 인스턴스를 변경합니다. 현재 각 프록시는 하나의 RDS DB 인스턴스에 연결할 수 있습니다. 대상 그룹은 모든 다중 AZ 구성의 RDS DB 인스턴스에 대한 연결 세부 정보를 추적합니다.

다음 예제는 프록시가 cluster-56-2020-02-25-1399라는 Aurora MySQL 클러스터와 연결된 상태에서 시작합니다. 이 예제에서는 provisioned-cluster라는 다른 클러스터에 연결할 수 있도록 프록시를 변경하는 방법을 보여 줍니다.

RDS DB 인스턴스로 작업하는 경우 --db-instance-identifier 옵션을 지정합니다.

다음 예제에서는 Aurora MySQL 프록시를 수정합니다. Aurora PostgreSQL 프록시는 포트 5432가 있습니다.

aws rds describe-db-proxy-targets --db-proxy-name the-proxy { "Targets": [ { "Endpoint": "instance-9814.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "instance-9814" }, { "Endpoint": "instance-8898.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "instance-8898" }, { "Endpoint": "instance-1018.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "instance-1018" }, { "Type": "TRACKED_CLUSTER", "Port": 0, "RdsResourceId": "cluster-56-2020-02-25-1399" }, { "Endpoint": "instance-4330.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "instance-4330" } ] } aws rds deregister-db-proxy-targets --db-proxy-name the-proxy --db-cluster-identifier cluster-56-2020-02-25-1399 aws rds describe-db-proxy-targets --db-proxy-name the-proxy { "Targets": [] } aws rds register-db-proxy-targets --db-proxy-name the-proxy --db-cluster-identifier provisioned-cluster { "DBProxyTargets": [ { "Type": "TRACKED_CLUSTER", "Port": 0, "RdsResourceId": "provisioned-cluster" }, { "Endpoint": "gkldje.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "gkldje" }, { "Endpoint": "provisioned-1.demo.us-east-1.rds.amazonaws.com", "Type": "RDS_INSTANCE", "Port": 3306, "RdsResourceId": "provisioned-1" } ] }

RDS API를 사용하여 프록시를 수정하려면 ModifyDBProxy, ModifyDBProxyTargetGroup, DeregisterDBProxyTargetsRegisterDBProxyTargets 작업을 사용합니다.

ModifyDBProxy를 사용하면 다음과 같은 속성을 변경할 수 있습니다.

  • 프록시에서 사용하는 Secrets Manager 보안 암호 집합입니다.

  • TLS가 필요한지 여부입니다.

  • 유휴 클라이언트 시간 초과.

  • 디버깅을 위해 SQL 문에서 추가 정보를 로깅할지 여부입니다.

  • Secrets Manager 보안 암호를 검색하는 데 사용되는 IAM 역할입니다.

  • 프록시에서 사용하는 보안 그룹입니다.

ModifyDBProxyTargetGroup을 사용하여 연결 관련 설정을 수정하거나 대상 그룹의 이름을 바꿀 수 있습니다. 현재 모든 프록시에는 default라는 단일 대상 그룹이 있습니다. 이 대상 그룹으로 작업하는 경우 프록시 이름을 지정하고 대상 그룹 이름에 default를 지정합니다.

DeregisterDBProxyTargetsRegisterDBProxyTargets를 사용하여 대상 그룹을 통해 프록시가 연결된 RDS DB 인스턴스를 변경합니다. 현재 각 프록시는 하나의 RDS DB 인스턴스에 연결할 수 있습니다. 대상 그룹은 다중 AZ 구성의 RDS DB 인스턴스에 대한 연결 세부 정보를 추적합니다.

새 데이터베이스 사용자 추가

프록시와 연결된 RDS DB 인스턴스에 새 데이터베이스 사용자를 추가해야 할 경우가 있습니다. 그렇다면 Secrets Manager 비밀을 추가하거나 재사용하여 해당 사용자의 자격 증명을 저장합니다. 이렇게 하려면 다음 옵션 중 하나를 선택합니다.

  1. AWS Secrets Manager에서 데이터베이스 자격 증명 설정에 설명된 절차를 사용하여 새 Secrets Manager 비밀을 만듭니다.

  2. IAM 역할을 업데이트하여 RDS Proxy에 새 Secrets Manager 비밀에 대한 액세스 권한을 부여합니다. 이렇게 하려면 IAM 역할 정책의 리소스 섹션을 업데이트합니다.

  3. Secrets Manager 보안 암호 아래에서 RDS 프록시를 수정하여 새 Secrets Manager 보안 암호를 추가합니다.

  4. 새 사용자가 기존 사용자를 대신하는 경우 기존 사용자의 프록시 Secrets Manager 비밀에 저장된 자격 증명을 업데이트합니다.

새 데이터베이스 사용자를 PostgreSQL 데이터베이스에 추가

새 사용자를 PostgreSQL 데이터베이스에 추가할 때 다음 명령을 실행한 경우:

REVOKE CONNECT ON DATABASE postgres FROM PUBLIC;

대상 데이터베이스의 연결을 모니터링할 수 있도록 rdsproxyadmin 사용자에게 CONNECT 권한을 부여합니다.

GRANT CONNECT ON DATABASE postgres TO rdsproxyadmin;

위 명령에서 rdsproxyadmin을 데이터베이스 사용자로 변경하여 다른 대상 데이터베이스 사용자가 상태 확인을 수행하도록 허용할 수도 있습니다.

데이터베이스 사용자 암호 변경

프록시와 연결된 RDS DB 인스턴스에서 데이터베이스 사용자의 암호를 변경해야 할 경우가 있습니다. 그렇다면 해당 Secrets Manager 비밀을 새 암호로 업데이트합니다.

클라이언트 및 데이터베이스 연결

애플리케이션에서 RDS 프록시로의 연결을 클라이언트 연결이라고 합니다. 프록시에서 데이터베이스로의 연결은 데이터베이스 연결입니다. RDS 프록시를 사용하는 경우 데이터베이스 연결은 RDS 프록시 내에서 관리되는 반면 클라이언트 연결은 프록시에서 종료됩니다.

애플리케이션 측 연결 풀링은 애플리케이션과 RDS 프록시 간의 반복적인 연결 설정을 줄이는 이점을 제공할 수 있습니다.

애플리케이션 측 연결 풀을 구현하기 전에 다음과 같은 구성 측면을 고려하세요.

  • 클라이언트 연결 최대 수명: RDS 프록시는 클라이언트 연결의 최대 수명을 24시간으로 제한합니다. 이 값은 구성할 수 없습니다. 예상치 못한 클라이언트 연결 끊김을 방지하려면 최대 연결 수명을 24시간 미만으로 설정하여 풀을 구성하세요.

  • 클라이언트 연결 유휴 제한 시간: RDS 프록시는 클라이언트 연결에 최대 유휴 시간을 적용합니다. 예상치 못한 연결 끊김을 방지하려면 RDS 프록시의 클라이언트 연결 유휴 제한 시간 설정보다 낮은 값으로 풀의 유휴 연결 제한 시간을 구성하세요.

애플리케이션 측 연결 풀에 구성된 최대 클라이언트 연결 수를 RDS 프록시의 max_connections 설정으로 제한할 필요는 없습니다.

클라이언트 연결 풀링을 사용하면 클라이언트 연결 수명이 길어집니다. 연결이 고정되는 경우 클라이언트 연결을 풀링하면 멀티플렉싱 효율성이 저하될 수 있습니다. 고정되어 있지만 애플리케이션 측 연결 풀에서 유휴 상태인 클라이언트 연결은 데이터베이스 연결을 계속 유지하고 다른 클라이언트 연결에서 데이터베이스 연결을 재사용하지 못하게 합니다. 프록시 로그를 검토하여 연결 고정이 발생하는지 확인하세요.

연결 설정 구성

RDS 프록시의 연결 풀링을 조정하려면 다음 설정을 수정합니다.

IdleClientTimeout

프록시에 의해 종료되기 전에 클라이언트 연결이 유휴 상태일 수 있는 시간을 지정합니다. 기본값은 1,800초(30분)입니다.

애플리케이션이 이전 요청이 완료된 후 지정된 시간 내에 새 요청을 제출하지 않으면 클라이언트 연결이 유휴 상태로 간주됩니다. 기본 데이터베이스 연결은 열린 상태를 유지하고 연결 풀로 반환됩니다. 따라서 새 클라이언트 연결에 다시 사용할 수 있습니다. 프록시가 기간 경과 연결을 사전에 제거하도록 하려면 유휴 클라이언트 연결 제한 시간을 줄이는 것이 좋습니다. 워크로드가 프록시와 자주 연결하는 경우 연결 설정 비용을 절약하기 위해 유휴 클라이언트 연결 제한 시간을 늘리세요.

이 설정은 RDS 콘솔의 유휴 클라이언트 연결 제한 시간(Idle client connection timeout) 필드와 AWS CLI 및 API의 IdleClientTimeout 설정으로 표시됩니다. RDS 콘솔에서 유휴 클라이언트 연결 제한 시간(Idle client connection timeout) 필드의 값을 변경하는 방법을 알아보려면 AWS Management Console 섹션을 참조하세요. IdleClientTimeout 설정의 값을 변경하는 방법을 알아보려면 CLI 명령 modify-db-proxy 또는 API 작업 ModifyDBProxy를 참조하세요.

MaxConnectionsPercent

RDS 프록시가 대상 데이터베이스와 설정할 수 있는 연결 수를 제한할 수 있습니다. 데이터베이스에 사용할 수 있는 최대 연결의 백분율로 제한을 지정합니다. 이 설정은 RDS 콘솔의 연결 풀 최대 연결(Connection pool maximum connections) 필드와 AWS CLI 또는 API의 MaxConnectionsPercent 설정으로 표시됩니다.

MaxConnectionsPercent 값은 대상 그룹에서 사용하는 RDS DB 인스턴스에 대한 max_connections 설정의 백분율로 표시됩니다. 프록시가 이러한 연결을 모두 미리 생성하지는 않습니다. 이 설정을 통해 프록시는 워크로드에 필요한 연결을 설정할 수 있습니다.

예를 들어 등록된 데이터베이스 대상이 max_connections가 1000으로 설정되어 있고 MaxConnectionsPercent가 95로 설정된 경우, RDS 프록시는 950개의 연결을 해당 데이터베이스 대상에 대한 동시 연결의 상한선으로 설정합니다.

워크로드가 허용된 최대 데이터베이스 연결 수에 도달할 경우 발생하는 일반적인 부작용은 전체 쿼리 지연 시간이 늘어나고, 그와 함께 DatabaseConnectionsBorrowLatency 지표도 증가한다는 점입니다. DatabaseConnectionsMaxDatabaseConnectionsAllowed 지표를 비교하여 현재 사용된 데이터베이스 연결 수와 허용된 총 데이터베이스 연결 수를 모니터링할 수 있습니다.

이 파라미터를 설정할 때는 다음과 같은 모범 사례를 고려하세요.

  • 워크로드 패턴의 변동에 대비하여 충분한 연결 여유 용량을 확보하세요. 파라미터를 최근에 모니터링한 최대 사용량보다 30% 이상 높게 설정하는 것이 좋습니다. RDS 프록시는 데이터베이스 연결 할당량을 여러 노드에 재분배하므로, 차용 지연 시간이 늘어나는 것을 방지하기 위해 내부 용량 변경 시 추가 연결을 위한 최소 30%의 여유 용량이 필요할 수 있습니다.

  • RDS 프록시는 빠른 장애 조치, 트래픽 라우팅, 내부 작업을 지원하기 위해 활성 모니터링을 위한 특정 수의 연결을 예약합니다. MaxDatabaseConnectionsAllowed 지표에는 이러한 예약된 연결이 포함되지 않습니다. 이는 워크로드를 처리하는 데 사용 가능한 연결 수를 나타내며 MaxConnectionsPercent 설정에서 파생된 값보다 낮을 수 있습니다.

    최소 권장 MaxConnectionsPercent

    • db.t3.small: 30

    • db.t3.medium 이상: 20

RDS 콘솔에서 연결 풀 최대 연결(Connection pool maximum connections) 필드의 값을 변경하는 방법을 알아보려면 AWS Management Console 섹션을 참조하세요. MaxConnectionsPercent 설정의 값을 변경하는 방법을 알아보려면 CLI 명령 modify-db-proxy-target-group 또는 API 작업 ModifyDBProxyTargetGroup을 참조하세요.

데이터베이스 연결 한도에 대한 자세한 내용은 최대 데이터베이스 연결 수를 참조하세요.

MaxIdleConnectionsPercent

RDS 프록시가 연결 풀에서 유지할 수 있는 유휴 데이터베이스 연결 수를 제어할 수 있습니다. 기본적으로, RDS 프록시는 5분 동안 연결에 대한 활동이 없으면 풀의 데이터베이스 연결을 유휴 상태로 간주합니다.

데이터베이스에 사용할 수 있는 최대 연결의 백분율로 제한을 지정합니다. 기본값은 MaxConnectionsPercent의 50%이고 상한은 MaxConnectionsPercent 값입니다. 값이 높으면 프록시가 유휴 데이터베이스 연결 비율을 높게 유지할 수 있습니다. 값이 낮으면 프록시가 높은 유휴 데이터베이스 연결 비율을 닫습니다. 워크로드를 예측할 수 없는 경우 MaxIdleConnectionsPercent에 높은 값을 설정하는 것을 고려해 보세요. 이렇게 하면 RDS 프록시가 새 데이터베이스 연결을 많이 열지 않고도 급증하는 활동을 수용할 수 있습니다.

이 설정은 AWS CLI 또는 API에서 DBProxyTargetGroupMaxIdleConnectionsPercent 설정으로 표시됩니다. MaxIdleConnectionsPercent 설정의 값을 변경하는 방법을 알아보려면 CLI 명령 modify-db-proxy-target-group 또는 API 작업 ModifyDBProxyTargetGroup을 참조하세요.

데이터베이스 연결 한도에 대한 자세한 내용은 최대 데이터베이스 연결 수를 참조하세요.

ConnectionBorrowTimeout

시간 초과 오류를 반환하기 전에 RDS 프록시가 연결 풀의 데이터베이스 연결을 사용할 수 있을 때까지 기다리는 시간을 선택할 수 있습니다. 기본값은 120초입니다. 이 설정은 연결 수가 최대일 때, 즉 연결 풀에서 사용할 수 있는 연결이 없을 때 적용됩니다. 이는 또한 장애 조치 작업이 진행 중인 경우와 같이 요청을 처리할 수 있는 적절한 데이터베이스 인스턴스가 없는 경우에도 적용됩니다. 이 설정을 사용하면 애플리케이션 코드에서 쿼리 시간 초과를 변경하지 않고도 애플리케이션에 가장 적합한 대기 기간을 설정할 수 있습니다.

이 설정은 RDS 콘솔의 연결 차용 제한 시간(Connection borrow timeout) 필드나 AWS CLI 또는 API의 DBProxyTargetGroupConnectionBorrowTimeout 설정으로 표시됩니다. RDS 콘솔에서 연결 차용 제한 시간(Connection borrow timeout) 필드의 값을 변경하는 방법을 알아보려면 AWS Management Console 섹션을 참조하세요. ConnectionBorrowTimeout 설정의 값을 변경하는 방법을 알아보려면 CLI 명령 modify-db-proxy-target-group 또는 API 작업 ModifyDBProxyTargetGroup을 참조하세요.

고정 방지

멀티플렉싱은 데이터베이스 요청이 이전 요청의 상태 정보에 의존하지 않을 때 더 효율적입니다. 이 경우 RDS Proxy는 각 트랜잭션이 완료될 때 연결을 다시 사용할 수 있습니다. 이러한 상태 정보의 예로는 SET 또는 SELECT 문을 통해 변경할 수 있는 대부분의 변수 및 구성 파라미터가 있습니다. 클라이언트 연결에 대한 SQL 트랜잭션은 기본적으로 기본 데이터베이스 연결 간에 멀티플렉싱할 수 있습니다.

프록시에 대한 연결은 고정이라는 상태로 들어갈 수 있습니다. 연결이 고정되면 이후의 각 트랜잭션은 세션이 끝날 때까지 동일한 기본 데이터베이스 연결을 사용합니다. 다른 클라이언트 연결도 세션이 끝날 때까지 해당 데이터베이스 연결을 다시 사용할 수 없습니다. 클라이언트 연결이 끊어지면 세션이 종료됩니다.

RDS Proxy는 다른 세션에 적합하지 않은 세션 상태 변경을 감지하면 클라이언트 연결을 특정 DB 연결에 자동으로 고정합니다. 고정은 연결 재사용의 효과를 줄입니다. 모든 또는 거의 모든 연결이 고정되는 경우 애플리케이션 코드 또는 워크로드를 수정하여 고정을 유발하는 조건을 줄이는 것이 좋습니다.

예를 들어, 애플리케이션이 세션 변수 또는 구성 파라미터를 변경한다고 가정하겠습니다. 이 경우 이후의 문이 효력을 발휘하기 위해 새 변수 또는 파라미터를 사용할 수 있습니다. 따라서 RDS Proxy는 세션 변수 또는 구성 설정을 변경하라는 요청을 처리할 때 해당 세션을 DB 연결에 고정합니다. 이렇게 하면 동일한 세션의 모든 이후 트랜잭션에 대해 세션 상태가 유효하게 유지됩니다.

일부 데이터베이스의 경우 이 규칙은 설정할 수 있는 모든 파라미터에 적용되지는 않습니다. RDS 프록시는 특정 문과 변수를 추적합니다. 따라서 RDS 프록시는 이들을 수정할 때 세션을 고정하지 않습니다. 이 경우 RDS 프록시는 해당 설정에 대해 동일한 값을 가진 다른 세션에 대해서만 연결을 재사용합니다. RDS 프록시가 데이터베이스 엔진에서 추적하는 항목에 대한 자세한 내용은 다음을 참조하세요.

RDS 프록시가 RDS for SQL Server 데이터베이스에서 추적하는 대상

다음은 RDS 프록시가 추적하는 SQL Server 문입니다.

  • USE

  • SET ANSI_NULLS

  • SET ANSI_PADDING

  • SET ANSI_WARNINGS

  • SET ARITHABORT

  • SET CONCAT_NULL_YIELDS_NULL

  • SET CURSOR_CLOSE_ON_COMMIT

  • SET DATEFIRST

  • SET DATEFORMAT

  • SET LANGUAGE

  • SET LOCK_TIMEOUT

  • SET NUMERIC_ROUNDABORT

  • SET QUOTED_IDENTIFIER

  • SET TEXTSIZE

  • SET TRANSACTION ISOLATION LEVEL

RDS 프록시가 RDS for MariaDB 및 RDS for MySQL 데이터베이스에서 추적하는 대상

다음은 RDS 프록시가 추적하는 MariaDB 및 MySQL 문입니다.

  • DROP DATABASE

  • DROP SCHEMA

  • USE

다음은 RDS 프록시가 추적하는 MySQL 및 MariaDB 변수입니다.

  • AUTOCOMMIT

  • AUTO_INCREMENT_INCREMENT

  • CHARACTER SET (or CHAR SET)

  • CHARACTER_SET_CLIENT

  • CHARACTER_SET_DATABASE

  • CHARACTER_SET_FILESYSTEM

  • CHARACTER_SET_CONNECTION

  • CHARACTER_SET_RESULTS

  • CHARACTER_SET_SERVER

  • COLLATION_CONNECTION

  • COLLATION_DATABASE

  • COLLATION_SERVER

  • INTERACTIVE_TIMEOUT

  • NAMES

  • NET_WRITE_TIMEOUT

  • QUERY_CACHE_TYPE

  • SESSION_TRACK_SCHEMA

  • SQL_MODE

  • TIME_ZONE

  • TRANSACTION_ISOLATION (or TX_ISOLATION)

  • TRANSACTION_READ_ONLY (or TX_READ_ONLY)

  • WAIT_TIMEOUT

고정 최소화

RDS 프록시 성능 튜닝에는 고정을 최소화하여 트랜잭션 수준 연결 재사용(멀티플렉싱)을 최대화하려는 시도가 포함됩니다.

다음 작업을 수행하여 고정을 최소화할 수 있습니다.

  • 고정을 야기할 수 있는 불필요한 데이터베이스 요청을 방지합니다.

  • 모든 연결에서 변수와 구성 설정을 일관되게 설정합니다. 그렇게 하면 이후 세션에서 특정 설정이 있는 연결을 재사용할 가능성이 증가합니다.

    그러나 PostgreSQL의 경우 변수를 설정하면 세션이 고정됩니다.

  • MySQL 엔진 패밀리 데이터베이스의 경우 프록시에 세션 고정 필터를 적용합니다. 이렇게 해도 애플리케이션의 올바른 작동에 영향을 주지 않음이 확인될 경우 특정 유형의 작업을 세션 고정에서 제외할 수 있습니다.

  • Amazon CloudWatch 지표 중 DatabaseConnectionsCurrentlySessionPinned를 모니터링하여 고정이 얼마나 자주 발생하는지 확인합니다. 이 지표와 기타 CloudWatch 지표에 대한 자세한 내용은 Amazon CloudWatch를 사용한 RDS 프록시 지표 모니터링 단원을 참조하십시오.

  • SET 문을 사용하여 각 클라이언트 연결에 대해 동일한 초기화를 수행하는 경우 트랜잭션 수준 멀티플렉싱을 유지하면서 그렇게 할 수 있습니다. 이 경우 초기 세션 상태를 설정하는 문을 프록시에서 사용하는 초기화 쿼리로 이동합니다. 이 속성은 세미콜론으로 구분된 하나 이상의 SQL 문을 포함하는 문자열입니다.

    예를 들어, 특정 구성 파라미터를 설정하는 프록시에 대한 초기화 질의를 정의할 수 있습니다. 그러면 RDS Proxy는 해당 프록시에 대해 새 연결을 설정할 때마다 해당 설정을 적용합니다. 애플리케이션 코드에서 해당 SET 문을 제거하여 트랜잭션 수준 멀티플렉싱을 방해하지 않도록 할 수 있습니다.

    특정 프록시에서 고정이 발생하는 빈도에 대한 지표를 보려면 Amazon CloudWatch를 사용한 RDS 프록시 지표 모니터링 단원을 참조하십시오.

모든 엔진 패밀리에 대해 고정을 유발하는 조건

다음과 같이 멀티플렉싱으로 예기치 않은 동작이 발생할 수 있는 상황에서 프록시는 세션을 현재 연결에 고정합니다.

  • 텍스트 크기가 16KB보다 큰 명령문을 사용하면 프록시가 세션을 고정합니다.

RDS for Microsoft SQL Server에서 고정이 발생하는 조건

RDS for SQL Server의 경우 다음 상호 작용도 고정을 유발합니다.

  • 여러 개의 활성 결과 집합(MARS) 사용 사용자 이름에 대한 자세한 정보는 SQL Server 설명서를 참조하세요.

  • 분산 트랜잭션 코디네이터(DTC) 통신 사용

  • 임시 테이블, 트랜잭션, 커서 또는 준비된 문 생성

  • 다음 SET 문 사용

    • SET ANSI_DEFAULTS

    • SET ANSI_NULL_DFLT

    • SET ARITHIGNORE

    • SET DEADLOCK_PRIORITY

    • SET FIPS_FLAGGER

    • SET FMTONLY

    • SET FORCEPLAN

    • SET IDENTITY_INSERT

    • SET NOCOUNT

    • SET NOEXEC

    • SET OFFSETS

    • SET PARSEONLY

    • SET QUERY_GOVERNOR_COST_LIMIT

    • SET REMOTE_PROC_TRANSACTIONS

    • SET ROWCOUNT

    • SET SHOWPLAN_ALL, SHOWPLAN_TEXTSHOWPLAN_XML

    • SET STATISTICS

    • SET XACT_ABORT

RDS for MariaDB 및 RDS for MySQL에서 고정이 발생하는 조건

MariaDB 및 MySQL의 경우 다음 상호 작용으로 인한 고정도 발생합니다.

  • 명시적 테이블 잠금 문인 LOCK TABLE, LOCK TABLES 또는 FLUSH TABLES WITH READ LOCK을 사용하면 프록시가 세션을 고정합니다.

  • GET_LOCK을 사용하여 명명된 잠금을 만들면 프록시가 세션을 고정합니다.

  • 사용자 변수 또는 시스템 변수(일부 예외)를 설정하면 프록시가 세션을 고정합니다. 이 경우 연결 재사용이 너무 줄어들면 SET 작업이 고정되지 않도록 선택합니다. 세션 고정 필터 속성을 설정하여 이를 수행하는 방법에 대한 자세한 내용은 RDS 프록시 생성RDS 프록시 수정 섹션을 참조하세요.

  • 임시 테이블을 생성하면 프록시가 세션을 고정합니다. 이렇게 하면 트랜잭션 경계에 관계없이 임시 테이블의 내용이 세션 전체에서 보존됩니다.

  • 함수 ROW_COUNT, FOUND_ROWSLAST_INSERT_ID를 호출하면 고정을 야기하는 경우가 있습니다.

  • 준비된 문을 사용하면 프록시가 세션을 고정합니다. 이 규칙은 준비된 문이 SQL 텍스트를 사용하는지 이진 프로토콜을 사용하는지 여부를 적용합니다.

  • SET LOCAL을 사용할 경우 RDS 프록시는 연결을 고정하지 않습니다.

  • 저장 프로시저 및 저장 함수를 호출해도 고정이 발생하지 않습니다. RDS 프록시는 이러한 호출로 인한 세션 상태 변경을 감지하지 못합니다. 트랜잭션 전반에 걸쳐 세션 상태를 유지하려고 해당 세션 상태에 의존하는 경우 저장된 루틴 내에서 애플리케이션이 세션 상태를 변경하지 않는지 확인합니다. 예를 들어, RDS 프록시는 현재 모든 트랜잭션에 걸쳐 지속되는 임시 테이블을 생성하는 저장 프로시저와 호환되지 않습니다.

애플리케이션 동작에 대한 전문 지식이 있는 경우 특정 애플리케이션 문에서 고정 동작을 건너뛸 수 있습니다. 그러려면 프록시를 생성할 때 세션 고정 필터 옵션을 선택하면 됩니다. 현재 세션 변수 및 구성 설정을 설정하기 위해 세션 고정을 옵트아웃할 수 있습니다.

RDS for PostgreSQL에서 고정이 발생하는 조건

PostgreSQL의 경우 다음 상호 작용으로 인해 고정도 발생합니다.

  • SET 명령 사용.

  • PREPARE, DISCARD, DEALLOCATE 또는 EXECUTE 명령을 사용하여 준비된 문 관리.

  • 임시 시퀀스, 테이블 또는 뷰 생성.

  • 커서 선언.

  • 세션 상태 무시.

  • 알림 채널에서 수신.

  • auto_explain과 같은 라이브러리 모듈 로드.

  • nextvalsetval과 같은 함수를 사용하여 시퀀스 조작.

  • pg_advisory_lockpg_try_advisory_lock과 같은 함수를 사용하여 잠금과 상호 작용.

  • 파라미터 설정 또는 파라미터를 기본값으로 재설정. 특히 SETset_config 명령을 사용하여 세션 변수에 기본값 할당.

  • 저장 프로시저 및 저장 함수를 호출해도 고정이 발생하지 않습니다. RDS 프록시는 이러한 호출로 인한 세션 상태 변경을 감지하지 못합니다. 트랜잭션 전반에 걸쳐 세션 상태를 유지하려고 해당 세션 상태에 의존하는 경우 저장된 루틴 내에서 애플리케이션이 세션 상태를 변경하지 않는지 확인합니다. 예를 들어, RDS 프록시는 현재 모든 트랜잭션에 걸쳐 지속되는 임시 테이블을 생성하는 저장 프로시저와 호환되지 않습니다.

RDS 프록시 삭제

더 이상 필요하지 않은 프록시는 삭제할 수 있습니다. 또는 프록시와 연결된 DB 인스턴스 또는 클러스터를 서비스 중단 상태로 전환하면 프록시를 삭제할 수 있습니다.

프록시를 삭제하려면
  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/rds/에서 Amazon RDS 콘솔을 엽니다.

  2. 탐색 창에서 Proxies(프록시)를 선택합니다.

  3. 목록에서 삭제할 프록시를 선택합니다.

  4. Delete Proxy(프록시 삭제)를 선택합니다.

DB 프록시를 삭제하려면 AWS CLI 명령 delete-db-proxy를 사용합니다. 관련 연결을 제거하려면 deregister-db-proxy-targets 명령도 사용합니다.

aws rds delete-db-proxy --name proxy_name
aws rds deregister-db-proxy-targets --db-proxy-name proxy_name [--target-group-name target_group_name] [--target-ids comma_separated_list] # or [--db-instance-identifiers instance_id] # or [--db-cluster-identifiers cluster_id]

DB 프록시를 삭제하려면 Amazon RDS API 함수 DeleteDBProxy를 호출합니다. 관련 항목 및 연결을 삭제하려면 DeleteDBProxyTargetGroupDeregisterDBProxyTargets 함수를 호출합니다.