문서 메뉴
문서 홈
/ / /
Java 동기화 드라이버

연결 문제 해결

이 페이지의 내용

  • 서버 연결 오류
  • 연결 문자열 확인
  • 방화벽 구성
  • 연결 횟수 확인
  • 인증 오류
  • 자격 증명 서식 확인
  • 인증 메커니즘 확인
  • 사용자가 인증 데이터베이스에 있는지 확인
  • DNS 확인 오류
  • 데이터베이스 배포 가용성 확인
  • 네트워크 주소 확인
  • 보안 인증서 오류
  • 시간 초과 오류
  • 세트 maxConnectionTimeoutMS
  • maxConnectionLifeTimemaxConnectionIdleTime설정
  • MongoDB 서버 선택 시간 초과 예외
  • 기타 오류
  • 스레드 예외 모니터링
  • 인증서 요청 예외
  • 디버깅 팁
  • TLS/SSL을 위한 상세 로깅

이 페이지에서는 MongoDB Java 드라이버를 사용하여 MongoDB 배포에 연결할 때 발생할 수 있는 문제에 대한 잠재적인 해결 방법을 제공합니다.

참고

이 페이지에서는 연결 문제만 다룹니다. MongoDB 또는 드라이버를 사용할 때 다른 문제가 발생하는 경우 다음 리소스를 방문하세요.

  • 문제 및 도움말 페이지에서 버그 신고, 드라이버 기여, 추가 리소스 찾기에 대한 정보를 확인할 수 있습니다.

  • 질문, 토론 또는 일반적인 기술 지원을 위한 MongoDB Community 포럼

  • Java 드라이버에 대한 일반적인 질문에 대한 답변을 제공하는 자주 묻는 질문(FAQ) 페이지

서버에 연결하려고 할 때 문제가 발생하면 Java 드라이버는 오류 메시지를 반환합니다. 이 오류가 다음 메시지와 유사하면 드라이버가 MongoDB 배포에 연결할 수 없다는 뜻입니다.

Error: couldn't connect to server 127.0.0.1:27017

다음 섹션에서는 문제 해결에 도움이 될 수 있는 방법에 대해 설명합니다.

연결 문자열의 호스트 이름과 포트 번호가 모두 정확한지 확인합니다. 이 샘플 오류 메시지에서 호스트 이름은 127.0.0.1 이고 포트는 27017 입니다. MongoDB Server 인스턴스의 기본 포트 값은 27017 이지만 다른 포트에서 수신 대기하도록 MongoDB를 구성할 수 있습니다.

복제본 세트에 연결할 때 연결 문자열에 모든 복제본 세트 호스트를 포함합니다. 연결 문자열의 각 호스트를 쉼표로 구분합니다. 이렇게 하면 호스트 중 하나에 연결할 수 없는 경우 드라이버가 연결을 설정할 수 있습니다.

여러 복제본 세트 호스트를 지정하는 방법을 알아보려면 연결 가이드의 복제본 세트 연결 섹션을 참조하세요.

MongoDB 배포서버가 방화벽 뒤에서 호스팅되는 경우 MongoDB가 수신 대기하는 포트가 방화벽에서 열려 있는지 확인합니다. 배포가 기본 네트워크 포트에서 수신 대기하는 경우 방화벽에서 포트 27017이 열려 있는지 확인합니다. 배포가 다른 포트에서 수신 대기하는 경우 포트가 방화벽에서 열려 있는지 확인합니다.

경고

MongoDB deployment에서 수신 대기하는 방화벽 포트인지 확실하지 않은 경우 방화벽 포트를 열지 마세요.

MongoClient 인스턴스는 연결 풀에서 최대 동시 개방 연결 수를 지원합니다. 구성 매개 변수 maxPoolSize는 이 값을 정의하며 기본적으로 100으로 설정됩니다. maxPoolSize만큼 열려 있는 연결이 이미 여러 개 있는 경우 서버는 연결을 사용할 수 있을 때까지 기다립니다. 이 대기 시간이 maxIdleTimeMS 값을 초과하면 드라이버는 오류로 응답합니다.

드라이버에서 연결 풀링이 작동하는 방식에 대해 자세히 알아보려면 FAQ에서 연결 풀링이 Java 드라이버에서 작동하는 방식을 참조하세요.

권한 부여가 올바르게 구성되지 않은 경우 Java 드라이버가 MongoDB 배포에 연결하지 못할 수 있습니다. 이 경우 드라이버는 다음 메시지와 비슷한 오류 메시지를 표시합니다.

Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server localhost:27017.

다음 섹션에서는 문제 해결에 도움이 될 수 있는 방법을 설명합니다.

인증 문제의 가장 일반적인 원인 중 하나는 MongoDB 연결 문자열의 잘못된 자격 증명 형식입니다.

연결 문자열 사용에 대한 자세한 내용은 연결 가이드의 연결 URI를 참조하세요.

연결 문자열에 사용자 이름과 암호가 포함된 경우 올바른 형식인지 확인합니다.

참고

사용자 이름 또는 암호에 다음 문자가 포함된 경우 백분율로 인코딩해야 합니다.

: / ? # [ ] @

연결 문자열에 퍼센트 인코딩된 사용자 이름과 비밀번호를 사용합니다.

자격 증명 및 인증 메커니즘이 올바른지 확인합니다. 연결 문자열의 옵션에서 인증 자격 증명을 지정할 수 있습니다.

MongoCredential(을)를 사용하여 클라이언트를 구성하는 경우 빌더 메서드는 인증 메커니즘에 해당합니다. 다음 코드는 SCRAM-SHA-256 인증 메커니즘에 대한 빌더 메서드를 보여 줍니다.

MongoCredential credential = MongoCredential.createScramSha256Credential("<username>", "<authenticationDb>", "<password>");

인증 메커니즘 지정에 대해 자세히 알아보려면 인증 메커니즘엔터프라이즈 인증 메커니즘 가이드를 참조하세요.

사용자 이름 및 비밀번호 기반 인증 방법을 사용하는 경우 사용자 이름을 인증 데이터베이스에 정의해야 합니다.

기본 인증 데이터베이스는 admin 데이터베이스입니다. 인증에 다른 데이터베이스를 사용하려면 연결 문자열에 authSource 옵션을 지정합니다.

다음 예시에서는 MongoDB가 users 데이터베이스를 인증 데이터베이스로 사용하도록 지시합니다.

MongoClient mongoClient = MongoClients.create("mongodb://<username>:<password>@<hostname>:<port>/?authSource=users");

Java 드라이버가 DNS 연결을 확인하지 못할 수 있습니다. 이 경우 다음 메시지와 유사한 오류 메시지가 나타날 수 있습니다.

com.mongodb.MongoSocketWriteException: Exception sending message

드라이버에서 이 오류를 보고하면 다음 섹션의 방법을 시도하여 문제를 해결합니다.

MongoDB Atlas에 연결하는데 드라이버가 Atlas 데이터베이스 배포의 DNS 호스트를 찾을 수 없는 경우, 데이터베이스 배포가 일시 중지되거나 삭제될 수 있습니다.

데이터베이스 배포가 Atlas에 존재하는지 확인합니다. 클러스터가 일시 중지된 경우 Atlas UI 또는 Atlas 명령줄 인터페이스에서 클러스터를 재개할 수 있습니다.

클러스터를 재개하는 방법을 알아보려면 Atlas 설명서의 Resume One Cluster를 참조하세요.

연결 문자열의 네트워크 주소 또는 호스트 이름이 정확한지 확인합니다.

배포가 MongoDB Atlas에서 호스팅되는 경우 클러스터에 연결 튜토리얼을 따라 Atlas 연결 문자열을 찾을 수 있습니다.

Java 버전 8 이하를 사용하는 경우 신뢰 저장소에 인증서를 추가해야 할 수 있습니다. 이후 버전의 JDK로 업그레이드하거나 Atlas 설명서의 보안 FAQ 지침에서 인증서를 추가하는 방법에 대한 정보를 읽을 수 있습니다.

드라이버를 통해 서버에 메시지를 보낼 때 메시지가 응답하는 데 시간이 걸리는 경우가 있습니다. 이 경우 다음 메시지 중 하나와 유사한 오류 메시지가 나타날 수 있습니다.

Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}.
No server chosen by ReadPreferenceServerSelector{readPreference=primary} from cluster description

이러한 오류 중 하나가 발생하면 다음 방법을 시도하여 문제를 해결하세요.

maxConnectionTimeoutMS 옵션은 제한시간이 초과되기 전에 Java 드라이버가 연결을 기다리는 시간을 표시합니다. 기본값은 10000입니다. 이 값을 늘리거나 드라이버가 시간 초과되지 않도록 하려면 0으로 설정할 수 있습니다.

maxConnectionLifeTimemaxConnectionIdleTime 설정을 고려하세요. 이러한 매개변수는 드라이버가 MongoDB 인스턴스에 대한 연결을 유지하는 기간을 구성합니다. 이러한 매개 변수에 대한 자세한 내용은 연결 풀 설정을 참조하세요.

일부 서버를 사용할 수 있는 경우에도 애플리케이션이 요청을 완료하지 못할 수 있으며, 이로 인해 드라이버가 서버 선택 시간 초과 예외를 반환하게 됩니다.

이 예외는 MongoTimeoutException 유형입니다. 다음은 프라이머리 세트에 연결할 수 없는 복제본 세트에 요청을 보내려고 할 때 발생하는 예외의 샘플입니다.

com.mongodb.MongoTimeoutException:
Timed out while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}.
Client view of cluster state is
{type=REPLICA_SET,
servers=[
{address=localhost:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused}},
{address=localhost:27018, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused}},
{address=localhost:27019, type=REPLICA_SET_SECONDARY, roundTripTime=15.0 ms, state=CONNECTED}
]
}

이 오류에는 연결 문제의 원인을 식별하는 데 도움이 될 수 있는 각 노드의 연결 상태를 설명하는 클러스터 상태 보기가 포함되어 있습니다.

앞의 오류에서 연결된 유일한 서버는 localhost:27019 세컨더리 노드입니다. 이로 인해 드라이버가 primary 의 읽기 설정을 충족하는 서버를 선택할 수 없으므로 요청 시간이 초과됩니다. 이 상황에서도 읽기 설정을 secondary, secondaryPreferred 또는 nearest 로 설정하면 연결된 세컨더리 노드에 대해 읽기 작업을 계속 수행할 수 있습니다.

serverSelectionTimeoutMS 연결 옵션을 지정하여 드라이버가 서버를 선택해야 하는 시간을 조정할 수도 있습니다. 자세한 내용은 연결 옵션 가이드를 참조하세요.

이 섹션에서는 더 넓은 범주에 속하지 않는 연결 오류를 보여줍니다.

INFO: Exception in monitor thread while connecting to server ssc-cluster-01-shard-00-02.9cbnp.mongodb.net:27017

이 오류를 해결하려면 보안 인증서 오류에 설명된 대로 인증서를 설치해야 합니다.

javax.net.ssl.SSLHandshakeException: extension (5) should not be presented in certificate_request

이는 특정 버전의 JDK에서 TLS 1.3 프로토콜을 사용하여 연결하려고 할 때 발생할 수 있는 알려진 문제입니다.

MongoDB 인스턴스 또는 클러스터에 연결할 때 이 오류가 발생하면 JDK를 다음 패치 버전 이상으로 업데이트하세요.

  • JDK 11.0.7

  • JDK 13.0.3

  • JDK 14.0.2

이 문제에 대해 자세히 알아보려면 문제 설명 을 참조하세요. OpenJDK 버그 시스템 추적기 문제에서 확인할 수 있습니다.

이 섹션은 특정 오류 메시지와 관련은 없지만 연결 문제 해결 과정에 도움이 될 수 있는 정보가 포함되어 있습니다.

-Djavax.net.debug=all 시스템 특성을 사용하여 TLS/SSL을 사용하여 설정된 연결을 포함하여 모든 연결과 관련된 디버그 레벨 로깅을 사용하도록 설정할 수 있습니다.

디버그 수준 로깅을 활성화하면 연결 문제의 근본적인 문제를 진단하는 데 도움이 될 수 있습니다. TLS/SSL 로깅 메시지에 대해 자세히 알아보려면 SSL/TLS 연결 디버깅 하기를 참조하세요. Java 문서.

← FAQ