Aurora MySQL 데이터베이스의 연결 문제 해결 - Amazon Aurora

Aurora MySQL 데이터베이스의 연결 문제 해결

워크로드를 원활하게 운영하려면 애플리케이션과 RDS DB 인스턴스 간의 안정적인 연결을 보장하는 것이 중요합니다. 그러나 네트워크 구성, 인증 문제 또는 리소스 제약과 같은 다양한 요인으로 인해 연결 문제가 발생할 수 있습니다. 이 안내서는 Aurora MySQL의 연결 문제를 해결하기 위한 포괄적인 접근 방식을 제공하는 것을 목표로 합니다.

Aurora MySQL의 데이터베이스 연결 문제 식별

연결 문제의 특정 범주를 식별하면 잠재적 원인의 범위를 좁히고 문제 해결 프로세스에 도움이 될 수 있습니다. 각 범주에는 진단 및 해결을 위한 다양한 접근 방식과 기법이 필요할 수 있습니다. 데이터베이스 연결 문제는 크게 다음 범주로 분류할 수 있습니다.

연결 오류 및 예외

연결 오류 및 예외는 잘못된 연결 문자열, 인증 실패, 네트워크 중단 또는 데이터베이스 서버 문제와 같은 다양한 이유로 발생할 수 있습니다. 잘못 구성된 연결 파라미터, 잘못된 자격 증명, 네트워크 중단 또는 데이터베이스 서버 충돌 또는 재시작이 원인일 수 있습니다. 잘못 구성된 보안 그룹, 가상 프라이빗 클라우드(VPC) 설정, 네트워크 액세스 제어 목록(ACL) 및 서브넷과 연결된 라우팅 테이블도 연결 문제로 이어질 수 있습니다.

연결 한도 도달

이 문제는 데이터베이스 서버에 대한 동시 연결 수가 최대 허용 한도를 초과할 때 발생합니다. 데이터베이스 서버에는 일반적으로 클러스터 및 인스턴스 파라미터 그룹의 파라미터 max_connections로 정의된 구성 가능한 최대 연결 한도가 있습니다. 연결 한도를 적용하면 데이터베이스 서버가 기존 연결을 효율적으로 처리하고 허용 가능한 성능을 제공하기에 충분한 리소스(예: 메모리, CPU 및 파일 핸들)를 보유하게 됩니다. 원인에는 애플리케이션의 연결 유출, 비효율적인 연결 풀링 또는 연결 요청의 예상치 못한 급증 등이 포함될 수 있습니다.

연결 시간 초과

연결 시간 초과는 클라이언트 애플리케이션이 지정된 제한 시간 내에 데이터베이스 서버와의 연결을 설정할 수 없는 경우에 발생합니다. 일반적인 원인에는 네트워크 문제, 서버 과부하, 방화벽 규칙 및 잘못 구성된 연결 설정이 포함됩니다.

유휴 연결 제한 시간

장시간 비활성 상태로 유지되는 유휴 연결은 리소스를 절약하기 위해 데이터베이스 서버에서 자동으로 닫힐 수 있습니다. 이 제한 시간은 일반적으로 wait_timeoutinteractive_timeout parameters를 사용하여 구성할 수 있으며 애플리케이션의 연결 사용 패턴에 따라 조정해야 합니다. 연결을 장시간 유휴 상태로 두는 애플리케이션 로직 또는 부적절한 연결 관리가 원인일 수 있습니다.

기존 연결의 간헐적 연결 해제

이 오류 클래스는 클라이언트 애플리케이션과 데이터베이스 간에 설정된 연결이 활성 상태이고 사용 중임에도 불구하고 불규칙한 간격으로 예기치 않게 종료되거나 연결이 끊어지는 시나리오를 나타냅니다. 이러한 연결 해제는 간헐적으로 발생하므로 불규칙한 간격으로 발생하며 일관되게 발생하지 않습니다. 원인에는 다음이 포함될 수 있습니다.

  • 재시작 또는 장애 조치와 같은 데이터베이스 서버 문제

  • 부적절한 애플리케이션 연결 처리

  • 로드 밸런싱 및 프록시 문제

  • 네트워크 불안정성

  • 연결 경로와 관련된 타사 구성 요소 또는 미들웨어 문제

  • 쿼리 실행 제한 시간

  • 서버 또는 클라이언트 측의 리소스 제약 조건

포괄적인 모니터링, 로깅 및 분석을 통해 근본 원인을 식별하는 것이 중요하며, 적절한 오류 처리, 연결 풀링 및 재시도 메커니즘을 구현하면 이러한 간헐적 연결 해제가 애플리케이션의 기능 및 사용자 경험에 미치는 영향을 완화하는 데 도움이 될 수 있습니다.

Aurora MySQL의 연결 문제에 대한 데이터 수집

애플리케이션, 데이터베이스, 네트워크 및 인프라 구성 요소와 관련된 포괄적인 데이터를 수집하는 것은 애플리케이션과 Aurora MySQL 데이터베이스 간의 연결 문제를 효과적으로 해결하는 데 매우 중요합니다. 관련 로그, 구성 및 진단 정보를 수집하면 연결 문제의 근본 원인을 파악하고 적절한 해결 방법을 수행하는 데 도움이 되는 가치 있는 인사이트를 얻을 수 있습니다.

보안 그룹 규칙, VPC 설정 및 라우팅 테이블과 같은 네트워크 로그 및 구성은 애플리케이션이 데이터베이스와 성공적으로 연결되지 못하게 할 수 있는 잠재적인 네트워크 관련 병목 현상 또는 잘못된 구성을 식별하는 데 필수적입니다. 이러한 네트워크 구성 요소를 분석하여 필요한 포트가 열려 있고 IP 주소가 허용되며 라우팅 구성이 올바르게 설정되었는지 확인할 수 있습니다.

타임스탬프

연결 문제가 발생할 때 정확한 타임스탬프를 기록합니다. 이를 통해 패턴을 식별하거나 문제를 다른 이벤트 또는 활동과 상호 연관시킬 수 있습니다.

DB 엔진 로그

일반 데이터베이스 로그 외에도 데이터베이스 엔진 로그(예: MySQL 오류 로그 및 느린 쿼리 로그)에서 간헐적 연결 문제와 관련이 있을 수 있는 관련 정보 또는 오류를 검토합니다. 자세한 내용은 Aurora MySQL 데이터베이스에 대한 로깅 단원을 참조하십시오.

클라이언트 애플리케이션 로그

데이터베이스에 연결하는 클라이언트 애플리케이션에서 세부 로그를 수집합니다. 애플리케이션 로그는 애플리케이션의 관점에서 연결 시도, 오류 및 관련 정보를 볼 수 있는 가시성을 제공하여 연결 문자열, 인증 자격 증명 또는 애플리케이션 수준 연결 처리와 관련된 문제를 드러낼 수 있습니다.

반면 데이터베이스 로그는 데이터베이스 측 오류, 느린 쿼리 또는 연결 문제에 기여할 수 있는 이벤트에 대한 통찰력을 제공합니다. 자세한 내용은 Aurora MySQL 데이터베이스에 대한 로깅 단원을 참조하십시오.

클라이언트 환경 변수

클라이언트 측의 환경 변수 또는 구성 설정이 프록시 설정, SSL/TLS 설정 또는 기타 관련 변수와 같은 데이터베이스 연결에 영향을 미칠 수 있는지 확인합니다.

클라이언트 라이브러리 버전

클라이언트가 데이터베이스 연결에 사용되는 모든 데이터베이스 드라이버, 라이브러리 또는 프레임워크의 최신 버전을 사용하고 있는지 확인합니다. 오래된 버전에는 알려진 문제 또는 호환성 문제가 있을 수 있습니다.

클라이언트 네트워크 캡처

연결 문제가 발생하는 동안 Wireshark 또는 tcpdump와 같은 도구를 사용하여 클라이언트 측에서 네트워크 캡처를 수행합니다. 이렇게 하면 클라이언트 측에서 네트워크 관련 문제 또는 이상을 식별하는 데 도움이 될 수 있습니다.

클라이언트 네트워크 토폴로지

클라이언트가 직접 연결하는 대신 데이터베이스에 연결하는 방화벽, 로드 밸런서 또는 RDS 프록시 또는 프록시 SQL과 같은 기타 구성 요소를 포함하여 클라이언트의 네트워크 토폴로지를 이해합니다.

클라이언트 운영 체제 설정

방화벽 규칙, 네트워크 어댑터 설정 및 기타 관련 설정과 같이 네트워크 연결에 영향을 미칠 수 있는 클라이언트의 운영 체제 설정을 확인합니다.

연결 풀링 구성

애플리케이션에서 연결 풀링 메커니즘을 사용하는 경우 구성 설정을 검토하고 풀 지표(예: 활성 연결, 유휴 연결 및 연결 제한 시간)를 모니터링하여 풀이 올바르게 작동하는지 확인합니다. 또한 최대 풀 크기, 최소 풀 크기 및 연결 검증 설정과 같은 풀 설정을 검토하여 올바르게 구성되었는지 확인합니다.

연결 문자열

연결 문자열에는 일반적으로 호스트 이름 또는 엔드포인트, 포트 번호, 데이터베이스 이름 및 인증 자격 증명과 같은 파라미터가 포함됩니다. 연결 문자열을 분석하면 연결 문제를 일으킬 수 있는 구성 오류 또는 잘못된 설정을 식별하는 데 도움이 될 수 있습니다. 예를 들어 호스트 이름이나 포트 번호가 올바르지 않으면 클라이언트가 데이터베이스 인스턴스에 도달하지 못할 수 있지만 잘못된 인증 자격 증명은 인증 실패 및 연결 거부로 이어질 수 있습니다. 또한 연결 문자열은 연결 풀링, 제한 시간 또는 연결 문제에 기여할 수 있는 기타 연결별 설정과 관련된 문제를 드러낼 수 있습니다. 클라이언트 애플리케이션에서 사용하는 전체 연결 문자열을 제공하면 클라이언트의 잘못된 구성을 정확히 파악하는 데 도움이 될 수 있습니다.

데이터베이스 지표

연결 문제가 발생하는 동안 CPU 사용량, 메모리 사용량 및 디스크 I/O와 같은 데이터베이스 지표를 모니터링합니다. 이를 통해 DB 인스턴스에 리소스 경합 또는 성능 문제가 있는지 확인할 수 있습니다.

DB 엔진 버전

Aurora MySQL DB 엔진 버전을 참조하세요. AWS는 알려진 문제, 보안 취약성을 해결하고 성능 향상을 도입하는 업데이트를 정기적으로 릴리스합니다. 따라서 이러한 업데이트에는 특히 연결, 성능 및 안정성과 관련된 버그 수정 및 개선 사항이 포함되어 있으므로 사용 가능한 최신 버전으로 업그레이드하는 것이 좋습니다. 데이터베이스 버전 정보를 다른 수집된 세부 정보와 함께 제공하면 지원가 연결 문제를 효과적으로 진단하고 해결하는 데 도움이 될 수 있습니다.

네트워크 지표

연결 문제가 발생하는 동안 지연 시간, 패킷 손실 및 처리량과 같은 네트워크 지표를 수집합니다. ping, traceroute 및 네트워크 모니터링 도구와 같은 도구는 이 데이터를 수집하는 데 도움이 될 수 있습니다.

소스 및 클라이언트 세부 정보

애플리케이션 서버, 로드 밸런서 또는 데이터베이스 연결을 시작하는 기타 구성 요소의 IP 주소를 확인합니다. 이는 단일 IP 주소 또는 IP 주소 범위(CIDR 표기법)일 수 있습니다. 소스가 Amazon EC2 인스턴스인 경우 인스턴스 유형, 가용 영역, 서브넷 ID 및 인스턴스와 연결된 보안 그룹, 프라이빗 IP 주소 및 퍼블릭 IP 주소와 같은 네트워크 인터페이스 세부 정보를 검토하는 것도 도움이 됩니다.

수집된 데이터를 철저히 분석하면 구성 오류, 리소스 제약, 네트워크 중단 또는 간헐적이거나 지속적인 연결 문제를 유발하는 기타 기본 문제를 식별할 수 있습니다. 이 정보를 사용하면 구성 조정, 네트워크 문제 해결 또는 애플리케이션 수준 연결 처리 처리와 같은 대상 작업을 수행할 수 있습니다.

Aurora MySQL에 대한 데이터베이스 연결 모니터링

연결 문제를 모니터링하고 해결하기 위해 다음 지표와 기능을 사용할 수 있습니다.

CloudWatch 지표
  • CPUUtilization – DB 인스턴스에서 CPU 사용량이 높으면 쿼리 실행이 느려져 연결 시간 초과 또는 거부가 발생할 수 있습니다.

  • DatabaseConnections – DB 인스턴스에 대한 활성 연결 수를 모니터링합니다. 구성된 최댓값에 가까운 연결 수가 많으면 잠재적 연결 문제 또는 연결 풀 소진을 나타낼 수 있습니다.

  • FreeableMemory – 사용 가능한 메모리가 적으면 리소스 제약으로 인해 성능 문제와 연결 문제가 발생할 수 있습니다.

  • NetworkReceiveThroughputNetworkTransmitThroughput - 비정상적인 네트워크 처리량 급증 또는 하락은 연결 문제 또는 네트워크 병목 현상을 나타낼 수 있습니다.

성능 개선 도우미 지표

성능 개선 도우미를 사용하여 Aurora MySQL의 연결 문제를 해결하려면 다음과 같은 데이터베이스 지표를 분석합니다.

  • Aborted_clients

  • Aborted_connects

  • 연결

  • max_connections

  • Threads_connected

  • Threads_created

  • Threads_running

이러한 지표는 연결 병목 현상을 식별하고, 네트워크 또는 인증 문제를 감지하며, 연결 풀링을 최적화하고, 효율적인 스레드 관리를 보장하는 데 도움이 될 수 있습니다. 자세한 내용은 Aurora MySQL용 성능 개선 도우미 카운터 단원을 참조하십시오.

성능 개선 도우미 기능
  • 데이터베이스 로드 - 시간 경과에 따라 데이터베이스 로드를 시각화하고 연결 문제 또는 성능 저하와 상호 연관시킵니다.

  • SQL 통계 - SQL 통계를 분석하여 연결 문제에 기여할 수 있는 비효율적인 쿼리 또는 데이터베이스 작업을 식별합니다.

  • 상위 쿼리 - 가장 리소스 집약적인 쿼리를 식별하고 분석하여 연결 문제를 일으킬 수 있는 잠재적 성능 병목 현상 또는 장기 실행 쿼리를 식별하는 데 도움이 될 수 있습니다.

이러한 지표를 모니터링하고 성능 개선 도우미를 활용하면 연결 문제를 일으킬 수 있는 데이터베이스 인스턴스의 성능, 리소스 사용량 및 잠재적 병목 현상을 파악할 수 있습니다. 예시:

  • 최대 한도에 가까운 높은 DatabaseConnections는 연결 풀 소진 또는 부적절한 연결 처리로 인해 연결 문제가 발생함을 나타낼 수 있습니다.

  • 높은 CPUUtilization 또는 낮은 FreeableMemory은 리소스 제약을 나타낼 수 있으며, 이로 인해 쿼리 실행이 느려지고 연결 제한 시간이 초과되거나 거부될 수 있습니다.

  • 상위 쿼리SQL 통계를 분석하면 연결 문제에 기여할 수 있는 비효율적이거나 리소스 집약적인 쿼리를 식별하는 데 도움이 될 수 있습니다.

또한 CloudWatch Logs를 모니터링하고 경보를 설정하면 연결 문제가 에스컬레이션되기 전에 사전에 식별하고 대응하는 데 도움이 될 수 있습니다.

이러한 지표와 도구는 가치 있는 인사이트를 제공할 수 있지만 다른 문제 해결 단계와 함께 사용해야 합니다. 또한 네트워크 구성, 보안 그룹 규칙 및 애플리케이션 수준 연결 처리를 검토하여 Aurora MySQL DB 인스턴스의 연결 문제를 포괄적으로 진단하고 해결할 수 있습니다.

Aurora MySQL에 대한 추가 모니터링

CloudWatch 지표
  • AbortedClients - 제대로 종료되지 않은 클라이언트 연결 수를 추적합니다.

  • AuroraSlowConnectionHandleCount - 느린 연결 핸들 작업 수를 추적하여 잠재적 연결 문제 또는 성능 병목 현상을 나타냅니다.

  • AuroraSlowHandshakeCount - 느린 핸드셰이크 작업 수를 측정하며, 이는 연결 문제를 나타내는 지표일 수도 있습니다.

  • ConnectionAttempts - Aurora MySQL DB 인스턴스에 대한 연결 시도 횟수를 측정합니다.

글로벌 상태 변수

Aurora_external_connection_count - DB 인스턴스에 대한 데이터베이스 연결 수를 나타내며, 데이터베이스 상태 확인에 사용되는 RDS 서비스 연결은 제외됩니다.

이러한 지표와 글로벌 상태 변수를 모니터링하면 Amazon Aurora MySQL 인스턴스에 연결 문제를 일으킬 수 있는 연결 패턴, 오류 및 잠재적 병목 현상을 파악할 수 있습니다.

예를 들어 AbortedClients 또는 AuroraSlowConnectionHandleCount의 수가 많으면 연결 문제를 나타낼 수 있습니다.

또한 CloudWatch 경보 및 알림을 설정하면 연결 문제가 에스컬레이션되고 애플리케이션 성능에 영향을 미치기 전에 사전에 식별하고 대응하는 데 도움이 될 수 있습니다.

Aurora MySQL의 연결 오류 코드

다음은 Aurora MySQL 데이터베이스의 몇 가지 일반적인 연결 오류와 오류 코드 및 설명입니다.

오류 코드 1040: 연결이 너무 많음

이 오류는 클라이언트가 데이터베이스 서버에서 허용하는 최댓값보다 많은 연결을 설정하려고 할 때 발생합니다. 가능한 값은 다음을 포함합니다.

  • 연결 풀링 구성 오류 - 연결 풀링 메커니즘을 사용하는 경우 최대 풀 크기가 너무 높게 설정되지 않았는지, 연결이 풀로 다시 제대로 릴리스되고 있는지 확인합니다.

  • 데이터베이스 인스턴스 구성 - 데이터베이스 인스턴스에 허용되는 최대 연결 설정을 확인하고 필요한 경우 max_connections 파라미터를 설정하여 조정합니다.

  • 높은 동시성 - 여러 클라이언트 또는 애플리케이션이 데이터베이스에 동시에 연결하는 경우 허용되는 최대 연결 한도에 도달할 수 있습니다.

오류 코드 1045: 사용자 '...'@'...'에 대한 액세스 거부됨(암호 사용: YES/NO)

이 오류는 데이터베이스에 연결을 시도할 때 인증 실패를 나타냅니다. 가능한 값은 다음을 포함합니다.

  • 인증 플러그인 호환성 - 클라이언트에서 사용하는 인증 플러그인이 데이터베이스 서버의 인증 메커니즘과 호환되는지 확인합니다.

  • 잘못된 사용자 이름 또는 암호 - 연결 문자열 또는 인증 메커니즘에서 올바른 사용자 이름과 암호가 사용되고 있는지 확인합니다.

  • 사용자 권한 - 사용자에게 지정된 호스트 또는 네트워크에서 데이터베이스 인스턴스에 연결하는 데 필요한 권한이 있는지 확인합니다.

오류 코드 1049: 알 수 없는 데이터베이스 '...'

이 오류는 클라이언트가 서버에 없는 데이터베이스에 연결을 시도하고 있음을 나타냅니다. 가능한 값은 다음을 포함합니다.

  • 데이터베이스가 생성되지 않음 - 지정된 데이터베이스가 데이터베이스 서버에서 생성되었는지 확인합니다.

  • 잘못된 데이터베이스 이름 - 연결 문자열 또는 쿼리에 사용된 데이터베이스 이름이 정확한지 다시 확인합니다.

  • 사용자 권한 - 사용자에게 지정된 데이터베이스에 액세스하는 데 필요한 권한이 있는지 확인합니다.

오류 코드 1153: 'max_allowed_packet' 바이트보다 큰 패킷을 가져옴

이 오류는 클라이언트가 데이터베이스 서버에서 허용하는 최대 패킷 크기를 초과하는 데이터를 보내거나 받으려고 할 때 발생합니다. 가능한 값은 다음을 포함합니다.

  • 대규모 쿼리 또는 결과 세트 - 대량의 데이터가 포함된 쿼리를 실행하는 경우 패킷 크기 제한을 초과할 수 있습니다.

  • 잘못 구성된 패킷 크기 설정 - 데이터베이스 서버의 max_allowed_packet 설정을 확인하고 필요한 경우 조정합니다.

  • 네트워크 구성 문제 - 네트워크 구성(예: MTU 크기)이 필요한 패킷 크기를 허용하는지 확인합니다.

오류 코드 1226: '...' 사용자가 'max_user_connections' 리소스를 초과했습니다(현재 값: ...).

이 오류는 사용자가 데이터베이스 서버에서 허용하는 최대 동시 연결 수를 초과했음을 나타냅니다. 가능한 값은 다음을 포함합니다.

  • 연결 풀링 구성 오류 - 연결 풀링 메커니즘을 사용하는 경우 최대 풀 크기가 사용자의 연결 한도에 비해 너무 높게 설정되지 않았는지 확인합니다.

  • 데이터베이스 인스턴스 구성 - 데이터베이스 인스턴스의 max_user_connections 설정을 확인하고 필요한 경우 조정합니다.

  • 높은 동시성 - 여러 클라이언트 또는 애플리케이션이 동일한 사용자를 사용하여 데이터베이스에 동시에 연결하는 경우 사용자별 연결 한도에 도달할 수 있습니다.

오류 코드 2003: '...'에서 MySQL 서버에 연결할 수 없음(10061)

이 오류는 일반적으로 클라이언트가 데이터베이스 서버와 TCP/IP 연결을 설정할 수 없을 때 발생합니다. 다음과 같은 다양한 문제로 인해 발생할 수 있습니다.

  • 데이터베이스 인스턴스 상태 - 데이터베이스 인스턴스가 available 상태이고 유지 관리 또는 백업 작업을 수행하지 않는지 확인합니다.

  • 방화벽 규칙 - 방화벽(운영 체제, 네트워크 또는 보안 그룹)이 지정된 포트(일반적으로 MySQL의 경우 3306)에서 연결을 차단하고 있는지 확인합니다.

  • 잘못된 호스트 이름 또는 엔드포인트 - 연결 문자열에 사용된 호스트 이름 또는 엔드포인트가 올바르고 데이터베이스 인스턴스와 일치하는지 확인합니다.

  • 네트워크 연결 문제 - 클라이언트 시스템이 네트워크를 통해 데이터베이스 인스턴스에 도달할 수 있는지 확인합니다. 네트워크 중단, 라우팅 문제 또는 VPC 또는 서브넷 구성 오류가 있는지 확인합니다.

오류 코드 2005: 알 수 없는 MySQL 서버 호스트 '...'(11001)

이 오류는 클라이언트가 데이터베이스 서버의 호스트 이름 또는 엔드포인트를 IP 주소로 확인할 수 없을 때 발생합니다. 가능한 값은 다음을 포함합니다.

  • DNS 해결 문제 - 클라이언트 시스템이 DNS를 사용하여 호스트 이름을 올바르게 해결할 수 있는지 확인합니다. DNS 설정, DNS 캐시를 확인하고 호스트 이름 대신 IP 주소를 사용해 보세요.

  • 잘못된 호스트 이름 또는 엔드포인트 - 연결 문자열에 사용된 호스트 이름 또는 엔드포인트가 정확한지 다시 확인합니다.

  • 네트워크 구성 문제 - 클라이언트의 네트워크 구성(예: VPC, 서브넷 및 라우팅 테이블)이 DNS 확인 및 데이터베이스 인스턴스에 대한 연결을 허용하는지 확인합니다.

오류 코드 2026: SSL 연결 오류

이 오류는 연결 시도 중에 SSL/TLS 구성 또는 인증서 검증에 문제가 있을 때 발생합니다. 가능한 값은 다음을 포함합니다.

  • 인증서 만료 - 서버에서 사용하는 SSL/TLS 인증서가 만료되어 갱신해야 하는지 확인합니다.

  • 인증서 검증 문제 - 클라이언트가 서버의 SSL/TLS 인증서를 올바르게 검증할 수 있고 인증서가 신뢰할 수 있는지 확인합니다.

  • 네트워크 구성 문제 - 네트워크 구성이 SSL/TLS 연결을 허용하고 SSL/TLS 핸드셰이크 프로세스를 차단하거나 방해하지 않는지 확인합니다.

  • SSL/TLS 구성 불일치 - 클라이언트 및 서버의 SSL/TLS 설정(예: 암호 제품군 및 프로토콜 버전)이 호환되는지 확인합니다.

각 오류 코드에 대한 자세한 설명과 잠재적 원인을 이해하면 Aurora MySQL 데이터베이스 작업 시 연결 문제를 더 잘 해결할 수 있습니다.

Aurora MySQL에 대한 파라미터 튜닝 권장 사항

최대 연결 수

이러한 파라미터를 조정하면 허용되는 최대 연결 한도에 도달하여 발생하는 연결 문제를 방지하는 데 도움이 될 수 있습니다. 애플리케이션의 동시성 요구 사항 및 리소스 제약 조건에 따라 이러한 값이 적절하게 설정되었는지 확인합니다.

  • max_connections - 이 파라미터는 DB 인스턴스에 허용되는 최대 동시 연결 수를 지정합니다.

  • max_user_connections - 이 파라미터는 사용자 생성 및 수정 중에 지정할 수 있으며 특정 사용자 계정에 허용되는 최대 동시 연결 수를 설정합니다.

네트워크 버퍼 크기

이러한 값을 늘리면 네트워크 성능이 향상될 수 있습니다. 특히 대규모 데이터 전송 또는 결과 세트가 포함된 워크로드의 경우 더욱 그렇습니다. 그러나 버퍼 크기가 클수록 메모리를 더 많이 사용할 수 있으므로 주의해야 합니다.

  • net_buffer_length - 이 파라미터는 클라이언트 연결 및 결과 버퍼의 초기 크기를 설정하여 메모리 사용량과 쿼리 성능의 균형을 맞춥니다.

  • max_allowed_packet - 이 파라미터는 DB 인스턴스에서 전송하거나 수신할 수 있는 단일 네트워크 패킷의 최대 크기를 지정합니다.

네트워크 압축(클라이언트 측)

네트워크 압축을 활성화하면 네트워크 대역폭 사용량이 줄어들 수 있지만 클라이언트와 서버 측 모두에서 CPU 오버헤드가 증가할 수 있습니다.

  • compress – 이 파라미터는 클라이언트/서버 통신을 위한 네트워크 압축을 활성화하거나 비활성화합니다.

  • compress_protocol - 이 파라미터는 네트워크 통신에 사용할 압축 프로토콜을 지정합니다.

네트워크 성능 튜닝

이러한 제한 시간을 조정하면 유휴 연결을 관리하고 리소스 소진을 방지하는 데 도움이 될 수 있지만 값이 낮으면 연결이 조기에 종료될 수 있으므로 주의해야 합니다.

  • interactive_timeout - 이 파라미터는 서버가 대화형 연결을 닫기 전에 활동을 기다리는 초 수를 지정합니다.

  • wait_timeout - 이 파라미터는 서버가 비대화형 연결을 닫기 전에 활동을 기다리는 초 수를 정합니다.

네트워크 제한 시간 설정

이러한 제한 시간을 조정하면 느리거나 응답하지 않는 연결과 관련된 문제를 해결하는 데 도움이 될 수 있습니다. 하지만 연결이 조기에 실패할 수 있으므로 너무 낮게 설정하지 않도록 주의하세요.

  • net_read_timeout - 이 파라미터는 읽기 작업을 종료하기 전에 연결에서 더 많은 데이터를 기다리는 초 수를 지정합니다.

  • net_write_timeout - 이 파라미터는 쓰기 작업을 종료하기 전에 블록이 연결에 기록될 때까지 기다릴 초 수를 결정합니다.

Aurora MySQL에 대한 데이터베이스 연결 문제 해결 예제

다음 예제에서는 Aurora MySQL에 대한 데이터베이스 연결 문제를 식별하고 해결하는 방법을 보여줍니다.

예제 1: 실패한 연결 시도 문제 해결

연결 시도는 인증 실패, SSL/TLS 핸드셰이크 실패, max_connections 한도 도달, DB 인스턴스의 리소스 제약 등 여러 가지 이유로 실패할 수 있습니다.

성능 개선 도우미에서 또는 다음 명령을 사용하여 실패한 연결 수를 추적할 수 있습니다.

mysql> show global status like 'aborted_connects'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | Aborted_connects | 7 | +------------------+-------+ 1 row in set (0.00 sec)

시간이 지남에 따라 Aborted_connects 수가 증가하면 애플리케이션에 간헐적인 연결 문제가 발생할 수 있습니다.

Aurora 고급 감사를 사용하여 클라이언트 연결에서 연결 및 연결 해제를 로깅할 수 있습니다. DB 클러스터 파라미터 그룹에서 다음 파라미터를 설정하여 이 작업을 수행할 수 있습니다.

  • server_audit_logging = 1

  • server_audit_events = CONNECT

다음은 실패한 로그인에 대한 감사 로그에서 발췌한 것입니다.

1728498527380921,auora-mysql-node1,user_1,172.31.49.222,147189,0,FAILED_CONNECT,,,1045 1728498527380940,auora-mysql-node1,user_1,172.31.49.222,147189,0,DISCONNECT,,,0

위치:

  • 1728498527380921 - 실패한 로그인이 발생한 시점의 에포크 타임스탬프

  • aurora-mysql-node1 - 연결이 실패한 Aurora MySQL 클러스터 노드의 인스턴스 식별자

  • user_1 - 로그인에 실패한 데이터베이스 사용자의 이름

  • 172.31.49.222 – 연결이 설정된 클라이언트의 프라이빗 IP 주소

  • 147189 – 실패한 로그인의 연결 ID

  • FAILED_CONNECT - 연결이 실패했음을 나타냄.

  • 1045 - 반환 코드. 0이 아닌 값은 오류를 나타냅니다. 이 경우 1045는 액세스 거부에 해당합니다.

자세한 내용은 MySQL 설명서의 서버 오류 코드클라이언트 오류 코드를 참조하세요.

Aurora MySQL 오류 로그에서 다음과 같은 관련 오류 메시지를 검사할 수도 있습니다.

2024-10-09T19:26:59.310443Z 220 [Note] [MY-010926] [Server] Access denied for user 'user_1'@'172.31.49.222' (using password: YES) (sql_authentication.cc:1502)

예제 2: 비정상적인 클라이언트 연결 해제 문제 해결

성능 개선 도우미에서 또는 다음 명령을 사용하여 비정상적인 클라이언트 연결 해제 수를 추적할 수 있습니다.

mysql> show global status like 'aborted_clients'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | Aborted_clients | 9 | +-----------------+-------+ 1 row in set (0.01 sec)

시간이 지남에 따라 Aborted_clients의 수가 증가하면 애플리케이션이 데이터베이스에 대한 연결을 올바르게 닫지 않는 것입니다. 연결이 제대로 닫히지 않으면 리소스 누출과 잠재적인 성능 문제가 발생할 수 있습니다. 연결을 불필요하게 열어 두면 메모리 및 파일 설명자와 같은 시스템 리소스를 사용할 수 있으며, 이로 인해 애플리케이션 또는 서버가 응답하지 않거나 다시 시작될 수 있습니다.

다음 쿼리를 사용하여 연결을 제대로 종료하지 않는 계정을 식별할 수 있습니다. 사용자 계정 이름, 사용자가 연결하는 호스트, 종료되지 않은 연결 수, 종료되지 않은 연결 백분율을 검색합니다.

SELECT ess.user, ess.host, (a.total_connections - a.current_connections) - ess.count_star AS not_closed, (((a.total_connections - a.current_connections) - ess.count_star) * 100) / (a.total_connections - a.current_connections) AS pct_not_closed FROM performance_schema.events_statements_summary_by_account_by_event_name AS ess JOIN performance_schema.accounts AS a ON (ess.user = a.user AND ess.host = a.host) WHERE ess.event_name = 'statement/com/quit' AND (a.total_connections - a.current_connections) > ess.count_star; +----------+---------------+------------+----------------+ | user | host | not_closed | pct_not_closed | +----------+---------------+------------+----------------+ | user1 | 172.31.49.222 | 1 | 33.3333 | | user1 | 172.31.93.250 | 1024 | 12.1021 | | user2 | 172.31.93.250 | 10 | 12.8551 | +----------+---------------+------------+----------------+ 3 rows in set (0.00 sec)

연결이 종료되지 않은 사용자 계정과 호스트를 식별한 후 연결을 정상적으로 종료하지 않는 코드를 계속 확인할 수 있습니다.

예를 들어 Python의 MySQL 커넥터를 사용하여 연결 객체의 close() 메서드를 사용하여 연결을 닫습니다. 다음은 데이터베이스에 대한 연결을 설정하고, 쿼리를 수행하고, 연결을 닫는 함수의 예입니다.

import mysql.connector def execute_query(query): # Establish a connection to the database connection = mysql.connector.connect( host="your_host", user="your_username", password="your_password", database="your_database" ) try: # Create a cursor object cursor = connection.cursor() # Execute the query cursor.execute(query) # Fetch and process the results results = cursor.fetchall() for row in results: print(row) finally: # Close the cursor and connection cursor.close() connection.close()

이 예제에서는 예외 발생 여부에 관계없이 연결이 닫혀 있는지 확인하기 위해 finally 블록에서 connection.close() 메서드를 호출합니다.