RDS 프록시 고정 방지 - Amazon Aurora

RDS 프록시 고정 방지

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

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

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

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

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

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

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

  • DROP DATABASE

  • DROP SCHEMA

  • USE

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

  • 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보다 큰 명령문을 사용하면 프록시가 세션을 고정합니다.

Aurora MySQL에서 고정이 발생하는 조건

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

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

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

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

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

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

    이러한 함수가 고정을 야기하는 정확한 상황은 MySQL 5.7과 호환되는 Aurora MySQL 버전에 따라 다를 수 있습니다.

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

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

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

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

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

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

  • SET 명령 사용.

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

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

  • 커서 선언.

  • 세션 상태 무시.

  • 알림 채널에서 수신.

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

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

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

    참고

    RDS 프록시는 트랜잭션 수준 권고 잠금(특히 pg_advisory_xact_lock, pg_advisory_xact_lock_shared, pg_try_advisory_xact_lock, pg_try_advisory_xact_lock_shared)을 고정하지 않습니다.

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

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