View a markdown version of this page

Amazon DocumentDB 연결 문제 - Amazon DocumentDB

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon DocumentDB 연결 문제

식별 - 문제 발견

일반적인 원인

연결 문제는 일반적으로 세 가지 주요 영역에서 비롯됩니다.

연결 풀 소진은 애플리케이션이 클라이언트 측 연결 풀 제한 또는 서버 측 인스턴스 제한을 통해 Amazon DocumentDB에 허용되는 최대 연결에 도달하면 발생합니다. 이 조건은 새 연결 요청이 대기열에 추가되거나 거부될 때 애플리케이션 성능 저하, 제한 시간 초과 및 잠재적 실패로 이어집니다.

인증 오버로드는 Amazon DocumentDB에 과도한 동시 인증 요청이 발생할 때, 특히 단기간에 1,000개 이상의 새 연결을 처리할 때 발생합니다. 인증 유지 관리 중에 Amazon DocumentDB는 세션 맵에서 독점적 잠금을 유지하여 유지 관리가 완료될 때까지 후속 인증 시도를 대기열에 넣습니다.

Amazon DocumentDB의 구성 문제는 종종 네트워킹, 보안 및 클라이언트 설정의 잘못된 구성으로 인해 발생합니다. 여기에는 잘못된 보안 그룹 설정, 잘못된 VPC 구성 또는 SSL/TLS 인증서 문제와 같은 항목이 포함됩니다. 안전하고 안정적인 데이터베이스 액세스를 유지하려면 적절한 구성을 이해하는 것이 중요합니다.

진단 - 근본 원인 찾기

연결 풀

MongoClient 인스턴스를 생성할 때 연결 풀이 초기화됩니다. 각 풀은 두 가지 주요 파라미터를 기반으로 연결을 유지합니다.

minPoolSize - 유지 관리되는 최소 연결 수

maxPoolSize - 허용되는 최대 연결 수

요청에 연결이 필요한 경우:

  1. 풀은 사용 가능한 유휴 연결을 확인합니다.

  2. 존재하지 않고 풀 크기가 < maxPoolSize인 경우 새 연결이 생성됩니다.

  3. maxPoolSize인 경우 요청은 대기열에 들어갑니다.

  4. 대기열이 가득 찼거나 제한 시간에 도달하면 MongoWaitQueueFullException이 발생합니다.

대기열의 동작은 다음 파라미터를 통해 처리됩니다.

waitQueueTimeoutMS - 최대 연결 대기 시간

waitQueueSize - 최대 대기 요청 수

다음은 매번 새 풀이 생성되는 Amazon DocumentDB에 연결하기 위한 문제가 있는 접근 방식의 예입니다.

for(Request request : requests) { MongoClient client = MongoClients.create(settings); // Process request client.close(); }

모니터링할 중요한 CloudWatch 지표는 다음과 같습니다.

  • DatabaseConnections - 1분 간격으로 인스턴스에서 열린 연결 수(활성 및 유휴)입니다.

  • DatabaseConnectionsMax - 1분 동안 인스턴스에서 열린 데이터베이스 연결(활성 및 유휴)의 최대 수입니다.

  • DatabaseConnectionsLimit - 지정된 시간에 인스턴스에 허용되는 최대 동시 데이터베이스 연결 수(활성 및 유휴)입니다.

  • LowMemNumOperationsThrottled - 1분 동안 사용 가능한 메모리 부족으로 인해 제한된 요청 수입니다.

인스턴스 클래스당 제한은 할당량 및 제한을 참조하세요.

애플리케이션 수준에서 연결 풀 문제의 일반적인 경고 신호는 다음과 같습니다.

  • 연결 획득 시간 증가

  • 대기열 크기 증가

  • 제한 시간 예외 수 증가

인증 오버로드

Amazon DocumentDB에 연결하는 방법은 다음과 비슷합니다.

연결 요청 → SSL 핸드셰이크 → 인증 → 세션 생성 → 연결 준비 완료

>1,000개의 새 연결을 처리할 때 SSL 핸드셰이크를 완료한 후 추가 연결 요청이 인증을 위한 대기열에 들어갑니다. 이러한 오버로드 이벤트 중에는 애플리케이션의 평균 연결 시간이 증가합니다.

모니터링할 중요한 CloudWatch 지표는 다음과 같습니다.

  • DatabaseConnections - 1분 간격으로 인스턴스에서 열린 연결 수(활성 및 유휴)입니다.

  • DatabaseConnectionsMax - 1분 동안 인스턴스에서 열린 데이터베이스 연결(활성 및 유휴)의 최대 수입니다.

  • DatabaseConnectionsLimit - 지정된 시간에 인스턴스에 허용되는 최대 동시 데이터베이스 연결 수(활성 및 유휴)입니다.

구성 문제

가장 일반적인 구성 문제는 프라이빗 네트워크 환경에 액세스하지 않고 환경에서 프라이빗 Amazon DocumentDB 클러스터 엔드포인트에 연결하려고 할 때 발생합니다. Amazon DocumentDB는 Virtual Private Cloud(VPC) 전용이며 현재 퍼블릭 엔드포인트를 지원하지 않습니다. 노트북 또는 VPC 외부의 로컬 개발 환경에서 Amazon DocumentDB 클러스터에 직접 연결할 수 없습니다.

이는 다음과 같은 오류로 표시됩니다.

Error: couldn't connect to server... Failed to connect to... exception: connect failed connection attempt failed

잘못된 보안 그룹 구성으로 인해 연결 실패가 발생할 수도 있습니다. Amazon DocumentDB 클러스터는 기본적으로 TCP 포트 27017에서 연결을 수신합니다. 클러스터가 배포된 포트와 다른 포트에 연결하려고 하거나 애플리케이션이 클러스터의 수신 보안 그룹 구성에서 다루지 않는 경우 애플리케이션이 실패합니다.

인증서 관리가 잘못되면 연결 문제가 발생할 수도 있습니다. 기본적으로 전송 중인 암호화는 새로 생성된 Amazon DocumentDB 클러스터에 대해 활성화됩니다. 전송 중 암호화가 활성화된 경우 global-bundle.pem 인증서를 사용하여 클러스터에 연결하려면 TLS를 사용하는 보안 연결이 필요합니다. 잘못된 인증서를 사용하려고 하면 다음과 같은 오류가 발생합니다.

unable to get local issuer certificate

TLS 파라미터를 지정하지 않고 TLS가 활성화된 클러스터에 연결하려고 하면 다음과 같은 오류가 발생합니다.

Server selection timed out after 30000 ms

해결 - 문제 해결

연결 풀: 워크로드 요구 사항에 맞게 풀 크기를 구현하거나 조정하여 연결 풀링을 검토합니다. 최적의 풀 구성은 워크로드 및 요구 사항에 따라 달라집니다. 코어 연결을 준비하고 사용할 수 있도록 minPoolSize를 유지하고 풀이 소진된 경우 빠르게 실패할 수 있을 만큼 maxWaitTime을 짧게 유지해야 합니다.

다음은 매번 새 풀을 생성하지 않고 단일 풀을 재사용하는 방법의 예입니다.

MongoClient client = MongoClients.create(settings); for(Request request : requests) { // Process request }

인증 오버로드: 점진적 연결 확장을 구현하고 새 연결을 한 번에 1,000개로 제한하여 인증을 관리합니다. 연결 풀링을 사용하여 인증된 연결을 효과적으로 재사용합니다. Amazon DocumentDB 클러스터에 연결이 과부하되지 않도록 하려면 연결 램프 업 전략을 구현합니다.

public class ConnectionManager { private static final int BATCH_SIZE = 100; private static final int DELAY_MS = 1000; public void establishConnections(int totalRequired) { int established = 0; while (established < totalRequired) { int batch = Math.min(BATCH_SIZE, totalRequired - established); createConnections(batch); Thread.sleep(DELAY_MS); established += batch; } } }

허용되는 총 연결 수를 제한하도록 연결 풀 설정을 구성할 수도 있습니다.

MongoClientSettings settings = MongoClientSettings.builder() .applyToConnectionPoolSettings(builder -> { builder.maxSize(500) // Limit total connections .minSize(10) // Maintain base connections .maxConnectionLifeTime(3600000) // Rotate connections hourly }) .applyToServerSettings(builder -> { builder.heartbeatFrequency(10000) // Regular server checks }) .build();

구성 문제: 애플리케이션이 Amazon DocumentDB 리소스가 있는 프라이빗 VPC 및 서브넷에 액세스할 수 있는지 확인합니다. VPC 피어링을 사용하는 경우 자세한 내용은 개발자 안내서 VPC 피어링 연결 문제 해결을 참조하세요. 지식 센터 문서인 인터넷에서 VPC 내 Amazon EC2 인스턴스로의 연결 문제를 해결하려면 어떻게 해야 합니까?를 검토할 수도 있습니다.

보안 그룹 구성의 경우 애플리케이션에서 연결을 허용하려면 Amazon DocumentDB 보안 그룹에 수신 규칙을 포함해야 합니다.

{ "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 27017, "ToPort": 27017, "SourceSecurityGroupId": "<application-security-group>", "Description": "DocumentDB access from application tier" } ], "SecurityGroupEgress": [ { "IpProtocol": "-1", "FromPort": -1, "ToPort": -1, "CidrIp": "0.0.0.0/0" } ] }

클러스터가 TLS 암호화로 구성된 경우 global-bundle.pem이라는 Amazon DocumentDB용 TLS 인증서를 다운로드하여 클러스터에 연결할 때 사용합니다.

wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem

장기 솔루션

더 큰 인스턴스 클래스로 업그레이드하거나 연결 로드를 분산하기 위해 읽기 전용 복제본을 추가하여 인스턴스 규모 조정이 필요할 수 있습니다. 적절한 로드 밸런싱 구현은 클러스터 전체에서 최적의 리소스 사용률을 보장합니다.

애플리케이션 변경은 강력한 연결 처리, 포괄적인 모니터링 및 연결 풀링 모범 사례 준수를 구현하는 데 중점을 두어야 합니다. 여기에는 적절한 오류 처리 및 연결 수명 주기 관리가 포함됩니다.

아키텍처 개선에는 가변 워크로드를 위한 Amazon DocumentDB Serverless 채택, 정교한 재시도 로직 구현, 내결함성을 위한 설계가 포함될 수 있습니다. 연결 관리를 더 잘 처리하려면 애플리케이션 아키텍처를 재구성하는 것이 좋습니다.

모범 사례

연결 풀

적절한 연결 풀 관리 및 모니터링을 통해 애플리케이션은 안정적인 데이터베이스 연결을 유지하면서 시스템 신뢰성 및 성능에 영향을 미칠 수 있는 소진 시나리오를 방지할 수 있습니다. 워크로드의 특성에 따라 적절한 제한 시간을 구성하고 풀 크기를 조정합니다.

연결 풀 설정 예제

MongoClientSettings settings = MongoClientSettings.builder() .applyToConnectionPoolSettings(builder -> builder.maxSize(10)) .applyToConnectionPoolSettings(builder -> builder.maxWaitQueueSize(2)) .applyToConnectionPoolSettings(builder -> builder.maxConnectionIdleTime(10, TimeUnit.MINUTES)) .build();

자세한 내용은 https://aws.amazon.com/blogs/database/building-resilient-applications-with-amazon-documentdb-with-mongodb-compatibility-part-1-client-configuration/ 참조하십시오.

인증 오버로드

항상 워크로드에 따라 파라미터에 적절한 값을 사용하여 연결 풀링을 구현합니다. 점진적 연결 설정 기법을 사용하고 가능한 경우 지속적인 연결을 유지합니다. 유휴 리소스가 낭비되지 않도록 적절한 연결 정리를 구현합니다.

구성 문제

애플리케이션에서 Amazon DocumentDB 리소스로 적절한 라우팅을 구성했는지 확인합니다. 전송 중 암호화에 TLS를 활용하고 최소 권한 액세스를 구현합니다. Amazon DocumentDB 자격 증명을 확인하고 연결 문자열 값을 검증합니다.