연결 문제 - Amazon DocumentDB

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

연결 문제

연결에 문제가 있으신가요? 다음에서는 몇 가지 일반적인 시나리오와 이에 대한 해결 방법에 대해 설명합니다.

주제

Amazon DocumentDB 엔드포인트에 연결할 수 없습니다.

다음은 Amazon DocumentDB에 연결하려고 할 때 표시될 수 있는 가장 일반적인 오류 메시지 중 하나입니다.

connecting to: mongodb://docdb-2018-11-08-21-47-27.cluster-ccuszbx3pn5e.us-east- 1.docdb.amazonaws.com:27017/ 2018-11-14T14:33:46.451-0800 W NETWORK [thread1] Failed to connect to 172.31.91.193:27017 after 5000ms milliseconds, giving up. 2018-11-14T14:33:46.452-0800 E QUERY [thread1] Error: couldn't connect to server docdb-2018-11-08-21-47-27.cluster-ccuszbx3pn5e.us-east-1.docdb.amazonaws.com:27017, connection attempt failed : connect@src/mongo/shell/mongo.js:237:13 @(connect):1:6 exception: connect failed

이 오류 메시지의 일반적인 의미는 클라이언트(이 예제에서는 mongo 쉘)가 Amazon DocumentDB 엔드포인트에 액세스할 수 없다는 것입니다. 다음과 같이 여러 가지 원인이 있을 수 있습니다.

퍼블릭 엔드포인트로부터 연결

노트북 또는 로컬 개발 머신에서 직접 Amazon DocumentDB 클러스터에 연결하려고 시도하는 중입니다.

노트북 또는 로컬 개발 머신과 같은 퍼블릭 엔드포인트에서 직접 Amazon DocumentDB 클러스터에 연결하려고 시도하는 것은 실패하게 됩니다. Amazon DocumentDB는 Virtual Private Cloud(VPC) 전용이며 현재 퍼블릭 엔드포인트를 지원하지 않습니다. 따라서 VPC 외부의 노트북 또는 개발 환경에서 Amazon DocumentDB 클러스터에 직접 연결할 수 없습니다.

Amazon VPC 외부에서 Amazon DocumentDB 클러스터에 연결하려면 SSH 터널을 사용할 수 있습니다. 자세한 내용은 Amazon VPC 외부에서 Amazon DocumentDB 클러스터에 연결 섹션을 참조하세요. 또한, 개발 환경이 다른 Amazon VPC에 있을 경우에는 VPC 피어링을 사용하여 동일한 리전 또는 다른 리전의 다른 Amazon VPC에서 Amazon DocumentDB 클러스터에 연결할 수 있습니다.

리전 간 연결

또 다른 리전에 있는 Amazon DocumentDB 클러스터에 연결하려고 합니다.

클러스터 지역이 아닌 지역의 Amazon EC2 인스턴스에서 Amazon DocumentDB 클러스터에 연결하려고 시도할 경우(예: 미국 서부(오레곤) 지역(us-west-2)에서 미국 동부(버지니아 북부) 지역(us-east-1)의 클러스터에 연결하려고 하면 연결이 실패합니다.

Amazon DocumentDB 클러스터의 리전을 확인하려면 다음 명령을 실행합니다. 리전이 엔드포인트에 있습니다.

aws docdb describe-db-clusters \ --db-cluster-identifier sample-cluster \ --query 'DBClusters[*].Endpoint'

이 작업의 출력은 다음과 같습니다.

[ "sample-cluster.node.us-east-1.docdb.amazonaws.com" ]

EC2 인스턴스의 리전을 확인하려면 다음 명령을 실행합니다.

aws ec2 describe-instances \ --query 'Reservations[*].Instances[*].Placement.AvailabilityZone'

이 작업의 출력은 다음과 같습니다.

[ [ "us-east-1a" ] ]

다른 Amazon VPC에서 연결

클러스터가 배포된 Amazon VPC가 아닌 다른 Amazon DocumentDB 클러스터에 연결하려고 합니다.

Amazon DocumentDB 클러스터와 Amazon EC2 인스턴스가 동일하지만 AWS 리전동일한 Amazon VPC에 있지 않은 경우, 두 Amazon VPC 간에 VPC 피어링을 활성화하지 않는 한 Amazon DocumentDB 클러스터에 직접 연결할 수 없습니다.

Amazon DocumentDB 인스턴스의 Amazon VPC를 확인하려면 다음 명령을 실행합니다.

aws docdb describe-db-instances \ --db-instance-identifier sample-instance \ --query 'DBInstances[*].DBSubnetGroup.VpcId'

Amazon EC2 인스턴스의 Amazon VPC를 확인하려면 다음 명령을 실행합니다.

aws ec2 describe-instances \ --query 'Reservations[*].Instances[*].VpcId'

보안 그룹이 인바운드 연결을 차단

Amazon DocumentDB 클러스터에 연결하려고 하는데 클러스터의 보안 그룹이 클러스터 포트(기본 포트: 27017)의 인바운드 연결을 허용하지 않습니다.

Amazon DocumentDB 클러스터와 Amazon EC2 인스턴스가 모두 동일한 리전 및 Amazon VPC에 있고 동일한 Amazon VPC 보안 그룹을 사용한다고 가정합니다. Amazon DocumentDB 클러스터에 연결할 수 없는 경우 가능성이 높은 원인은 클러스터에 대한 보안 그룹(예: 방화벽)이 Amazon DocumentDB 클러스터에 대해 선택한 포트(기본 포트: 27017)의 인바운드 연결을 허용하지 않기 때문입니다.

Amazon DocumentDB 클러스터의 포트를 확인하려면 다음 명령을 실행합니다.

aws docdb describe-db-clusters \ --db-cluster-identifier sample-cluster \ --query 'DBClusters[*].[DBClusterIdentifier,Port]'

클러스터에 대한 Amazon DocumentDB 보안 그룹을 가져오려면 다음 명령을 실행합니다.

aws docdb describe-db-clusters \ --db-cluster-identifier sample-cluster \ --query 'DBClusters[*].[VpcSecurityGroups[*],VpcSecurityGroupId]'

보안 그룹에 대한 인바운드 규칙을 확인하려면 Amazon EC2 설명서에서 다음 주제를 참조하십시오.

Java Mongo 드라이버 읽기 기본 설정 문제

클라이언트의 읽기 기본 설정이 적용되지 않으며 일부 클라이언트는 재부팅하지 않는 한 장애 조치 후 Amazon DocumentDB에 쓸 수 없습니다.

Java Mongo Driver 3.7.x에서 처음 발견된 이 문제는 클라이언트가 특히 MongoClientSettings 메서드를 사용하여 Amazon DocumentDB에 연결할 때, 특히 applyToClusterSettings 메서드를 체인으로 연결할 때 발생합니다. MongoClient 클러스터 설정은, 및 같은 몇 가지 방법을 사용하여 정의할 수 있습니다. hosts() requiredReplicaSetName() mode()

클라이언트가 hosts() 메서드에서 호스트를 하나만 지정하면 모드가 ClusterConnectionMode.SINGLE 대신 ClusterConnectionMode.MULTIPLE으로 설정됩니다. 이렇게 하면 클라이언트는 읽기 기본 설정을 무시하고 hosts()에서 구성된 서버에만 연결합니다. 따라서 아래와 같이 클라이언트 설정을 초기화하더라도 모든 읽기는 여전히 보조 서버 대신 기본 서버로 이동합니다.

final ServerAddress serverAddress0 = new ServerAddress("cluster-endpoint", 27317)); final MongoCredential credential = MongoCredential.createCredential("xxx", "admin", "xxxx".toCharArray()); final MongoClientSettings settings = MongoClientSettings.builder() .credential(credential) .readPreference(ReadPreference.secondaryPreferred()) .retryWrites(false) .applyToSslSettings(builder -> builder .enabled(false)) .applyToClusterSettings(builder -> builder.hosts( Arrays.asList(serverAddress0 )) .requiredReplicaSetName("rs0")) .build(); MongoClient mongoClient = MongoClients.create(settings);

장애 조치 사례

위의 클라이언트 연결 설정을 사용하면 클러스터 작성기 엔드포인트에 대한 장애 조치 및 지연된 DNS 레코드 업데이트가 발생하는 경우 클라이언트는 여전히 이전 작성기(이제는 장애 조치 후 리더)에 쓰기를 시도합니다. 이로 인해 서버 측 오류(마스터 아님)가 발생하는데, 이 오류는 Java 드라이버에서 적절하게 처리되지 않습니다(이 내용은 아직 조사 중임). 따라서 예를 들어 애플리케이션 서버가 재부팅될 때까지 클라이언트는 잘못된 상태로 남아 있을 수 있습니다.

이에 대한 두 가지 해결 방법이 있습니다.

  • 연결 문자열을 통해 Amazon DocumentDB에 연결하는 클라이언트는 읽기 기본 설정을 지정할 때 ClusterConnectionModeMULTIPLE로 설정되므로 이 문제가 발생하지 않습니다.

    MongoClientURI mongoClientURI = new MongoClientURI("mongodb://usr:pass:cluster-endpoint:27317/test?ssl=false&replicaSet=rs0&readpreference=secondaryPreferred"); MongoClient mongoClient = MongoClients.create(mongoClientURI.getURI());

    applyConnectionString 메서드와 함께 MongoClientSettings 빌더를 사용할 수도 있습니다.

    final MongoClientSettings settings = MongoClientSettings.builder() .credential(credential) .applyConnectionString(new ConnectionString("usr:pass:cluster-endpoint:27317/test?ssl=false&replicaSet=rs0&readpreference=secondaryPreferred")) .retryWrites(false) .applyToSslSettings(builder → builder .enabled(false)) .build(); MongoClient mongoClient = MongoClients.create(settings);
  • 명시적으로 ClusterConnectionModeMULTIPLE으로 설정합니다. 이는 applyToClusterSettingshosts().size() == 1를 사용할 때만 필요합니다.

    final ServerAddress serverAddress0 = new ServerAddress("cluster-endpoint", 27317)); final MongoCredential credential = MongoCredential.createCredential("xxx","admin", "xxxx".toCharArray()); final MongoClientSettings settings = MongoClientSettings.builder() .credential(credential) .readPreference(ReadPreference.secondaryPreferred()) .retryWrites(false) .applyToSslSettings(builder → builder .enabled(false)) .applyToClusterSettings(builder → builder .hosts(Arrays.asList(serverAddress0)) .requiredReplicaSetName("rs0")) .mode(ClusterConnectionMode.MULTIPLE)) .build(); MongoClient mongoClient = MongoClients.create(settings);

Amazon DocumentDB 인스턴스 연결 테스트

공통 Linux 또는 Windows 도구를 사용하여 클러스터에 대한 연결을 테스트할 수 있습니다.

Linux 또는 Unix 터미널에서 다음을 입력하여 연결을 테스트할 수 있습니다(cluster-endpoint를 해당 엔드포인트로 바꾸고 port를 인스턴스의 포트로 바꿈).

nc -zv cluster-endpoint port

다음은 샘플 작업 및 반환 값의 예입니다.

nc -zv docdbTest.d4c7nm7stsfc0.us-west-2.docdb.amazonaws.com 27017 Connection to docdbTest.d4c7nm7stsfc0.us-west-2.docdb.amazonaws.com 27017 port [tcp/*] succeeded!

유효하지 않은 엔드포인트에 연결

Amazon DocumentDB 클러스터에 연결하고 유효하지 않은 클러스터 엔드포인트를 사용할 때 다음과 유사한 오류가 표시됩니다.

mongo --ssl \ --host sample-cluster.node.us-east-1.docdb.amazonaws.com:27017 \ --sslCAFile global-bundle.pem \ --username <user-name> \ --password <password>

출력은 다음과 같습니다.

MongoDB shell version v3.6 connecting to: mongodb://sample-cluster.node.us-east-1.docdb.amazonaws.com:27017/ 2018-11-14T17:21:18.516-0800 I NETWORK [thread1] getaddrinfo("sample-cluster.node.us-east-1.docdb.amazonaws.com") failed: nodename nor servname provided, or not known 2018-11-14T17:21:18.537-0800 E QUERY [thread1] Error: couldn't initialize connection to host sample-cluster.node.us-east-1.docdb.amazonaws.com, address is invalid : connect@src/mongo/shell/mongo.js:237:13@(connect):1:6 exception: connect failed

클러스터에 대해 유효한 엔드포인트를 가져오려면 다음 명령을 실행합니다.

aws docdb describe-db-clusters \ --db-cluster-identifier sample-cluster \ --query 'DBClusters[*].[Endpoint,Port]'

인스턴스에 대해 유효한 엔드포인트를 가져오려면 다음 명령을 실행합니다.

aws docdb describe-db-instances \ --db-instance-identifier sample-instance \ --query 'DBInstances[*].[Endpoint.Address,Endpoint.Port]'

자세한 정보는 Amazon DocumentDB 엔드포인트에 대한 이해을 참조하세요.

연결 수에 영향을 미치는 드라이버 구성

클라이언트 드라이버를 사용하여 Amazon DocumentDB 클러스터에 연결할 때는 구성 파라미터를 고려하는 maxPoolSize 것이 중요합니다. maxPoolSize설정은 클라이언트 드라이버가 연결 풀에서 유지할 최대 연결 수를 결정합니다.