Amazon RDS Proxy에서 연결 고정 문제를 해결하려면 어떻게 해야 합니까?
AAmazon Relational Database Service(Amazon RDS) Proxy를 사용하여 대상 데이터베이스에 액세스하면 발생하는 연결 고정 문제를 해결하려고 합니다.
해결 방법
CloudWatch 지표 검토
다음 단계를 완료하십시오.
- Amazon CloudWatch 콘솔을 엽니다.
- 탐색 창에서 지표를 선택한 다음, 모든 지표를 선택합니다.
- 찾아보기 탭에서 RDS를 선택한 다음, 프록시별 지표를 선택합니다.
- DatabaseConnectionsCurrentlySessionPinned 지표를 검색합니다.
DatabaseConnectionsCurrentlySessionPinned 지표는 RDS Proxy가 60초마다 고정하는 데이터베이스 연결 수를 보여줍니다. 클라이언트 요청의 작업으로 세션 상태가 변경되면 RDS Proxy가 연결을 고정합니다.
참고: DatabaseConnectionsCurrentlySessionPinned 지표는 RDS Proxy가 첫 번째 고정된 연결을 탐지하면 기록되기 시작하고 고정된 연결에 NULL 값이 있으면 중지됩니다.
RDS Proxy 로그 이벤트 검토
SQL 문 및 RDS Proxy 내부 작업에 대한 자세한 정보를 보려면 프록시를 수정하여 향상된 로깅을 활성화하십시오.
참고: 향상된 로깅은 24시간 후 자동으로 비활성화됩니다.
연결 고정 문제를 해결하려면 RDS Proxy 로그 이벤트를 검토하십시오.
다음 단계를 완료하십시오.
- CloudWatch 콘솔을 엽니다.
- 탐색 창에서 로그를 선택하고 로그 그룹을 선택합니다.
- 프록시의 로그 그룹(예: 프록시의 /aws/rds/proxy/name)을 선택합니다.
- 로그 스트림 탭에서 로그 스트림을 선택하여 로그 이벤트를 확인합니다.
CloudWatch Log Insights 쿼리를 실행하여 이상 징후 탐지
CloudWatch Logs Insights의 쿼리 편집기에 액세스하려면 다음 단계를 완료하십시오.
- CloudWatch 콘솔을 엽니다.
- 탐색 창에서Logs(로그)를 선택하고 Log Insights(로그 인사이트)를 선택합니다.
쿼리 편집기를 사용하여 다음 쿼리를 실행합니다. 각 쿼리에서 proxy-name을 프록시 이름으로 바꿉니다.
개별 연결이 고정된 이유를 확인하려면 다음 쿼리를 실행합니다.
fields @message | sort @timestamp asc | filter @logStream like '{proxy-name}' | filter @message like /The client session was pinned to the database connection/
가장 많이 고정된 연결을 개수별로 가져오려면 다음 쿼리를 실행합니다.
fields @message | sort @timestamp asc | filter @logStream like '{proxy-name}' | filter @message like /The client session was pinned to the database connection/ | parse 'Reason: \\\*' as reason | stats count() as reasonCount by reason | sort by reasonCount desc | limit 20
세션 설정 변경 사항 해결
참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.
클라이언트 연결에서 세션 수준 변수 설정을 변경하면 다시 사용할 수 없으므로 RDS Proxy가 연결을 고정합니다.
그러면 다음과 같은 오류 메시지를 받습니다.
"The client session was pinned to the database connection [dbConnection=xxxx] for the remainder of the session. The proxy can't reuse this connection until the session ends. Reason: SQL changed session settings that the proxy doesn't track. Consider moving session configuration to the proxy's initialization query."
모든 데이터베이스 연결의 설정이 동일해야 합니다. 이 문제를 해결하려면 프록시를 만들 때 초기화 쿼리 설정을 추가하십시오. 프록시가 각각의 새 데이터베이스 연결을 열면 실행할 프록시의 SQL 문을 지정합니다. 기존 프록시를 수정하려면 Amazon RDS 콘솔을 사용하거나 modify-db-proxy-target-group AWS CLI 명령을 실행할 수 있습니다.
중요: 암호 또는 수명이 긴 암호화 키와 같은 중요한 데이터를 초기화 쿼리에 추가하지 마십시오. 프록시 대상 그룹 구성에 액세스할 수 있는 사용자는 누구나 초기화 쿼리를 볼 수 있기 때문에 인증 또는 암호화 방법으로는 보호하지 못합니다.
일반적으로 각 연결의 설정이 동일하도록 SET 문과 함께 초기화 쿼리 설정을 사용합니다. 단일 SET 문에 여러 변수를 포함하려면 쉼표 구분자를 사용하십시오.
예를 들어, 다음 명령을 실행하여 초기화 쿼리에서 시간대 변수를 설정할 수 있습니다.
aws rds modify-db-proxy-target-group --target-group-name default --db-proxy-name proxy --connection-pool-config '{ > "InitQuery": "SET time_zone = \"+00:00\";" > }'
참고: proxy를 프록시 이름으로 바꿉니다.
구문 분석 메시지 및 프로토콜 수준의 준비된 명령문 오류 해결
asyncpg/mysql.connector와 같은 특정 라이브러리가 내부적으로 프로토콜 수준의 준비된 명령문을 사용하는 경우 다음 오류 메시지 중 하나를 받습니다.
- "The client session was pinned to the database connection [dbConnection=xxxx] for the remainder of the session. The proxy can't reuse this connection until the session ends. Reason: A parse message was detected."
- "The client session was pinned to the database connection [dbConnection=xxxx] for the remainder of the session. The proxy can't reuse this connection until the session ends. Reason: A protocol-level prepared statement was detected."
클라이언트가 준비된 명령문을 사용하는 경우 RDS Proxy가 연결을 고정합니다.
이 문제를 해결하려면 프록시가 연결을 명시적으로 사용한 후 준비된 명령문을 사용하는 모든 연결을 닫으십시오.
대규모 SQL 쿼리 해결
다음과 같은 오류 메시지를 받을 수 있습니다.
"The client session was pinned to the database connection [dbConnection=xxxx] for the remainder of the session. The proxy can't reuse this connection until the session ends. Reason: The connection ran a SQL query which exceeded the 16384 byte limit."
RDS Proxy가 지원하는 모든 DB 엔진에서 RDS Proxy는 16KB보다 큰 SQL 문을 발견하면 세션을 고정합니다. SQL 문의 크기를 줄이는 것이 모범 사례입니다. 예를 들어 주석을 제거하거나 별칭 사용을 제한할 수 있습니다.
연결 고정 줄이기
프록시에서 연결을 고정하는 원인이 될 수 있는 불필요한 데이터베이스 요청을 방지하려면 다음 작업을 수행하십시오.
- 연결 고정을 시작하는 데이터베이스 작업을 제거합니다.
- 배치 작업을 사용하여 관련 요청을 단일 쿼리로 결합합니다.
연결 설정을 표준화하려면 다음 작업을 수행하십시오.
- 연결 전반에서 일관된 변수 및 구성 설정을 유지하여 트랜잭션 수준의 재사용을 관리합니다.
- Amazon RDS for PostgreSQL의 경우 데이터베이스 쪽에서 변수를 설정합니다. 클라이언트 쪽에서 변수를 설정하면 RDS Proxy가 데이터베이스 연결을 고정합니다.
- Amazon RDS for MySQL 데이터베이스의 경우 세션 고정 필터를 사용하여 세션 고정 요구 사항을 안전하게 방지할 수 있는 데이터베이스 작업을 지정합니다.
모든 연결에서 동일한 초기화를 수행하고 트랜잭션 수준의 재사용을 유지하려면 공통 SET 문을 프록시의 초기화 쿼리로 이동하는 것이 모범 사례입니다.
