RDS 프록시 고정 방지
멀티플렉싱은 데이터베이스 요청이 이전 요청의 상태 정보에 의존하지 않을 때 더 효율적입니다. 이 경우 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_TEXT
및SHOWPLAN_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_ROWS
및LAST_INSERT_ID
를 호출하면 고정을 야기하는 경우가 있습니다. -
준비된 문을 사용하면 프록시가 세션을 고정합니다. 이 규칙은 준비된 문이 SQL 텍스트를 사용하는지 이진 프로토콜을 사용하는지 여부를 적용합니다.
-
SET LOCAL을 사용할 경우 RDS 프록시는 연결을 고정하지 않습니다.
-
저장 프로시저 및 저장 함수를 호출해도 고정이 발생하지 않습니다. RDS 프록시는 이러한 호출로 인한 세션 상태 변경을 감지하지 못합니다. 트랜잭션 전반에 걸쳐 세션 상태를 유지하려고 해당 세션 상태에 의존하는 경우 저장된 루틴 내에서 애플리케이션이 세션 상태를 변경하지 않는지 확인합니다. 예를 들어, RDS 프록시는 현재 모든 트랜잭션에 걸쳐 지속되는 임시 테이블을 생성하는 저장 프로시저와 호환되지 않습니다.
애플리케이션 동작에 대한 전문 지식이 있는 경우 특정 애플리케이션 문에서 고정 동작을 건너뛸 수 있습니다. 그러려면 프록시를 생성할 때 세션 고정 필터 옵션을 선택하면 됩니다. 현재 세션 변수 및 구성 설정을 설정하기 위해 세션 고정을 옵트아웃할 수 있습니다.
RDS for PostgreSQL에서 고정이 발생하는 조건
PostgreSQL의 경우 다음 상호 작용으로 인해 고정도 발생합니다.
-
SET
명령 사용. -
PREPARE
,DISCARD
,DEALLOCATE
또는EXECUTE
명령을 사용하여 준비된 문 관리. -
임시 시퀀스, 테이블 또는 뷰 생성.
-
커서 선언.
-
세션 상태 무시.
-
알림 채널에서 수신.
-
auto_explain
과 같은 라이브러리 모듈 로드. -
nextval
및setval
과 같은 함수를 사용하여 시퀀스 조작. -
pg_advisory_lock
및pg_try_advisory_lock
과 같은 함수를 사용하여 잠금과 상호 작용.참고
RDS 프록시는 트랜잭션 수준 권고 잠금(특히
pg_advisory_xact_lock
,pg_advisory_xact_lock_shared
,pg_try_advisory_xact_lock
,pg_try_advisory_xact_lock_shared
)을 고정하지 않습니다. -
파라미터 설정 또는 파라미터를 기본값으로 재설정. 특히
SET
및set_config
명령을 사용하여 세션 변수에 기본값 할당. -
저장 프로시저 및 저장 함수를 호출해도 고정이 발생하지 않습니다. RDS 프록시는 이러한 호출로 인한 세션 상태 변경을 감지하지 못합니다. 트랜잭션 전반에 걸쳐 세션 상태를 유지하려고 해당 세션 상태에 의존하는 경우 저장된 루틴 내에서 애플리케이션이 세션 상태를 변경하지 않는지 확인합니다. 예를 들어, RDS 프록시는 현재 모든 트랜잭션에 걸쳐 지속되는 임시 테이블을 생성하는 저장 프로시저와 호환되지 않습니다.