문서 메뉴
문서 홈
/ / /
Node.js 드라이버

FAQ

이 페이지의 내용

이 페이지에는 자주 묻는 질문(FAQ)과 해당 답변이 포함되어 있습니다.

이 페이지에서 문제에 대한 답변을 찾을 수 없는 경우 문제 및 도움말 페이지에서 다음 단계와 추가 리소스를 참조하세요.

MongoDB deployment에 연결하는 데 문제가 있는 경우 연결 문제 해결 가이드에서 가능한 해결 방법을 참조하세요.

모든 MongoClient 인스턴스에는 MongoDB 토폴로지의 각 서버에 대한 내장 연결 풀이 있습니다. 연결 풀은 요청 시 소켓을 열어 애플리케이션에서 MongoDB에 대한 동시 요청을 지원합니다.

각 연결 풀의 최대 크기는 maxPoolSize 옵션으로 설정되며 기본값은 100입니다. 서버에 대한 사용 중인 연결 수가 maxPoolSize 값에 도달하면 해당 서버에 대한 다음 요청은 연결이 가능해질 때까지 대기합니다.

애플리케이션의 요청을 지원하는 데 필요한 소켓 외에도 각 MongoClient 인스턴스는 MongoDB 토폴로지에서 서버당 두 개의 소켓을 더 열어 서버 상태를 모니터링합니다. 예를 들어, 3노드 복제본 세트에 연결된 클라이언트는 6개의 모니터링 소켓을 엽니다. 애플리케이션이 maxPoolSize 에 대한 기본 설정을 사용하고 프라이머리(기본) 노드만 쿼리하는 경우 연결 풀에는 최대 106 개의 연결이 있을 수 있습니다. 애플리케이션이 읽기 설정 을 사용하여 세컨더리 노드를 쿼리하는 경우 이러한 연결 풀이 커져 총 연결 수가 306 개가 될 수 있습니다.

하나의 프로세스 내에서 많은 수의 동시 MongoDB 요청을 지원하려면 maxPoolSize를 늘리면 됩니다.

연결 풀은 속도 제한이 있습니다. maxConnecting 옵션은 풀이 언제든지 병렬로 생성할 수 있는 연결 수를 결정합니다. 예를 들어 maxConnecting의 값이 2인 경우, 연결을 동시에 체크아웃하려는 세 번째 요청은 다음 경우 중 하나가 발생할 때만 성공합니다.

  • 연결 풀에서 연결 생성이 완료되었으며 풀에 연결 수가 maxPoolSize 미만입니다.

  • 기존 연결이 풀로 다시 확인됩니다.

  • 연결 생성에 대한 속도 제한으로 인해 기존 연결을 재사용하는 드라이버의 기능이 향상됩니다.

minPoolSize 옵션(기본값 0)을 사용하여 각 서버에 대한 최소 동시 연결 수를 설정할 수 있습니다. 드라이버는 이 수의 소켓으로 연결 풀을 초기화합니다. 소켓이 닫혀 총 소켓 수(사용 중인 소켓과 유휴 상태 모두)가 최소값 아래로 떨어지면 최소값에 도달할 때까지 더 많은 소켓이 열립니다.

maxIdleTimeMS 옵션을 설정하여 연결이 풀에서 유휴 상태로 유지될 수 있는 최대 시간(밀리초)을 설정할 수 있습니다. 연결이 maxIdleTimeMS 동안 유휴 상태이면 연결 풀이 이를 제거하고 교체합니다. 이 옵션의 기본값은 0(제한 없음)입니다.

MongoClient에 대한 다음 기본 구성은 대부분의 애플리케이션에서 작동합니다.

const client = new MongoClient("<connection string>");

MongoClient 여러 개의 동시 요청을 지원합니다. 각 프로세스에 대해 클라이언트를 만들어 프로세스의 모든 작업에 재사용합니다. 이 방법은 각 요청에 대해 클라이언트를 만드는 것보다 더 효율적입니다.

드라이버는 소켓이 사용 가능해질 때까지 기다릴 수 있는 요청 수를 제한하지 않으며, 부하 급증 시 해당 풀의 크기를 대기 중인 제한으로 제한하는 것은 애플리케이션의 책임입니다. 요청은 waitQueueTimeoutMS 옵션에 지정된 시간 동안 대기하며 기본값은 0(제한 없음)입니다.

소켓에 대해 waitQueueTimeoutMS에 정의된 시간보다 오래 기다리는 요청은 연결 오류를 발생시킵니다. 모든 작업을 완료하는 것보다 부하가 급증하는 동안 작업 기간을 제한하는 것이 더 중요한 경우 이 옵션을 사용합니다.

요청에 의해 MongoClient.close()가 호출되면 드라이버는 모든 유휴 소켓을 닫고 풀로 반환될 때 사용 중인 소켓을 모두 닫습니다. MongoClient.close()를 호출하면 비활성 소켓만 닫히므로 이 메서드를 사용하여 진행 중인 작업을 중단하거나 종료할 수 없습니다. 드라이버는 프로세스가 완료될 때만 이러한 소켓을 닫습니다.

설정
설명
connectTimeoutMS

connectTimeoutMS 연결 풀의 개별 연결이 시간 초과 전에 MongoDB 서버에 TCP 연결을 설정하는 데 걸리는 시간(밀리초)을 설정하는 연결 옵션입니다.

MongoClient.connect 에 허용된 시간을 수정하려면 MongoDB Server에 대한 연결을 설정하려면 serverSelectionTimeoutMS 옵션을 대신 사용하세요.

기본값: 30000

socketTimeoutMS
socketTimeoutMS 드라이버가 비활성 소켓을 닫기 전에 기다리는 시간을 지정합니다. 기본값은 소켓 시간 초과를 하지 않는 것입니다. 이 옵션은 이미 연결된 소켓에만 적용됩니다.
최대 시간 (MS)
maxTimeMS 작업이 서버에 도달한 후 완료될 때까지 서버가 대기하는 최대 시간을 지정합니다. 작업이 지정된 시간 제한을 초과하여 실행되면 시간 초과 오류가 반환됩니다. maxTimeMS 는 개별 작업이나 커서에만 전달할 수 있습니다.

MongoClient에 대한 선택적 설정을 지정하려면 다음과 같이 생성자의 options 객체에 사용 가능한 설정을 하나 이상 선언합니다.

const client = new MongoClient(uri, {
connectTimeoutMS: <integer value>,
socketTimeoutMS: <integer value>
});

사용 가능한 모든 설정을 보려면 MongoClientOptions API 문서를 참조하세요.

maxTimeMS를 지정하려면 시간 초과 사양이 포함된 maxTimeMS() 메서드를 Cursor를 반환하는 작업에 연결합니다.

const cursor = myColl.find({}).maxTimeMS(50);

MongoDB Server 버전 4 부터 시작됩니다.2, 클라이언트의 연결이 끊어지면 서버는 애그리게이션 및 찾기 작업과 같은 실행 중인 작업을 종료합니다. 이 동작의 영향을 받는 작업의 전체 목록을 보려면 MongoDB Server 버전 4 을(를) 참조하세요.2 MongoDB Server 매뉴얼의 릴리스 노트 .

쓰기 작업과 같은 다른 작업은 클라이언트 연결이 끊긴 경우에도 MongoDB Server에서 계속 실행됩니다. 이 동작은 클라이언트 연결이 끊어진 후 애플리케이션이 작업을 다시 시도하는 경우 데이터 불일치를 일으킬 수 있습니다.

예기치 않은 네트워크 동작이 발생하거나 MongoDB 프로세스가 오류와 함께 실패하는 경우 드라이버가 해당 소켓을 제대로 닫았다는 확인을 받지 못할 수 있습니다.

이러한 경우 드라이버가 소켓을 올바르게 닫는지 확인하려면 socketTimeoutMS 옵션을 설정합니다. MongoDB 프로세스가 시간 초과되면 드라이버는 소켓을 닫습니다. 애플리케이션이 실행하는 가장 느린 작업의 예상 지속 시간보다 2~3배 긴 socketTimeoutMS 값을 선택하는 것이 좋습니다.

연결 풀이 크다고 해서 항상 재연결 요청이 줄어드는 것은 아닙니다. 다음 예시를 고려할 수 있습니다.

애플리케이션의 연결 풀 크기는 소켓이 5개이고 socketTimeoutMS 옵션이 5000밀리초로 설정되어 있습니다. 작업은 평균 3000밀리초마다 발생하며 재연결 요청이 자주 발생합니다. 각 소켓은 5000밀리초 후에 시간 초과되므로 모든 소켓이 닫히지 않으려면 5000밀리초 동안 조치를 취해야 합니다.

3000밀리초마다 하나의 메시지만으로는 소켓을 활성 상태로 유지하는 데 충분하지 않으므로 여러 개의 소켓이 5000밀리초 후에 시간 초과됩니다. 과도한 소켓 시간 초과를 방지하려면 maxPoolSize 옵션을 지정하여 드라이버가 연결 풀에서 유지할 수 있는 연결 수를 줄입니다.

MongoClient에 대한 선택적 maxPoolSize 설정을 지정하려면 다음과 같이 생성자의 options 객체에 선언합니다.

const client = new MongoClient(uri, {
maxPoolSize: <integer value>,
});

connectTimeoutMS 또는 socketTimeoutMS 값을 0으 로 설정하면 애플리케이션은 운영 체제의 기본 소켓 시간 초과 값을 사용합니다.

시간 초과 값을 지정하여 장기 실행 작업으로 인해 서버 속도가 느려지는 것을 방지할 수 있습니다. 특정 작업에 대한 시간 초과를 설정하기 위해 Cursor를 반환하는 작업에 maxTimeMS() 메서드를 연결할 수 있습니다.

다음 예에서는 Cursor를 반환하는 작업에 maxTimeMS() 메서드를 연결하는 방법을 보여줍니다.

// Execute a find command
await collection
.find({ $where: "sleep(100) || true" })
.maxTimeMS(50);

연결 옵션은 TCP(전송 제어 프로토콜) 킵얼라이브keepAlive 사용할지 여부를 지정합니다. TCP 소켓에서. 킵얼라이브를 활성화하면 드라이버는 MongoDB deployment에 주기적으로 핑을 전송하여 연결이 활성 상태인지 확인합니다. 이 기능은 운영 체제가 SO_KEEPALIVE 소켓 옵션을 지원하는 경우에만 작동합니다.

keepAliveInitialDelay 옵션은 킵얼라이브를 시작하기 전에 드라이버가 대기하는 시간을 밀리초 단위로 지정합니다.

5.3 드라이버 버전 릴리스에서는 이러한 옵션이 더 이상 사용되지 않습니다. 드라이버 버전 6.0부터 keepAlive 옵션은 영구적으로 true로 설정되고 keepAliveInitialDelay는 300000밀리초(300초)입니다.

경고

방화벽이 킵얼라이브 메시지를 무시하거나 삭제하는 경우 삭제된 연결을 식별하지 못할 수도 있습니다.

애플리케이션과 MongoDB 간의 방화벽이 잘못 구성된 경우 예기치 않은 네트워크 동작이 발생할 수 있습니다. 이러한 방화벽은 연결을 제거하는 데 지나치게 공격적일 수 있으며, 이로 인해 예기치 않은 오류가 발생할 수 있습니다.

방화벽이 다음과 같은 동작을 보이는지 확인합니다.

  • 방화벽은 연결을 닫을 때 FIN 패킷을 보내 드라이버에게 소켓이 닫혔음을 알립니다.

  • 방화벽은 킵얼라이브 메시지를 허용합니다.

킵얼라이브 메시지에 대해 자세히 알아보려면 킵얼라이브 옵션의 기능은 무엇인가요? FAQ 항목을 참조하세요.

동일한 MongoClient 인스턴스를 사용하여 여러 MongoDB 작업을 동시에 실행하는 경우 작업 속도가 느려지면 다른 작업이 지연될 수 있습니다. 작업 속도가 느리면 MongoDB에 대한 연결이 계속 점유되어 다른 작업이 추가 연결을 사용할 수 있을 때까지 대기할 수 있습니다.

느린 MongoDB 작업으로 인해 지연이 발생한다고 의심되는 경우, 다음 메서드를 사용하여 진행 중인 모든 작업의 성능을 확인할 수 있습니다.

  • 배포에서 데이터베이스 프로파일러를 활성화합니다. 자세한 내용은 MongoDB Server 매뉴얼의 데이터베이스 프로파일러 를 참조하세요.

  • db.currentOp() MongoDB Shell 명령을 실행합니다. 자세한 내용은 MongoDB Server 매뉴얼의 db.currentOp() 문서를 참조하세요.

  • 연결 풀 모니터링을 활성화합니다. 자세한 내용은 연결 풀 모니터링을 참조하세요.

지연을 유발하는 작업을 확인한 후 이러한 작업의 성능을 개선합니다. 가능한 해결책 은 MongoDB 성능 모범 사례 가이드를 참조 하세요.

성능 모범 사례를 구현했지만 여전히 지연이 발생하는 경우 연결 설정을 수정하여 연결 풀 크기를 늘릴 수 있습니다. 연결 풀은 드라이버가 언제든지 유지 관리하는 서버에 대한 연결 그룹입니다.

연결 풀의 최대 크기를 지정하려면 MongoClient 인스턴스의 연결 옵션에서 maxPoolSize 옵션을 설정하면 됩니다. maxPoolSize의 기본값은 100입니다. 서버에 대한 사용 중인 연결 수가 maxPoolSize에 도달하면 드라이버에 대한 연결이 가능해질 때까지 서버로 전송되는 다음 작업이 일시 중지됩니다. 다음 코드는 새 MongoClient를 만들 때 maxPoolSize150으로 설정합니다.

const client = new MongoClient(uri, { maxPoolSize: 150 });

연결 풀링에 대해 자세히 알아보려면 Node 드라이버에서 연결 풀링은 어떻게 작동하나요? FAQ 항목을 참조하세요.

드라이버에 전달된 연결 string 은 복제본 세트 구성 에 설정된 대로 서버에 대해 정확한 호스트 이름을 사용해야 합니다. 복제본 세트에 대한 다음 구성 설정이 주어졌을 때 복제본 세트 검색 및 페일오버 가 작동하려면 드라이버가 server1, server2server3 에 대한 액세스 권한이 있어야 합니다.

{
"_id": "testSet",
"version": 1,
"protocolVersion": 1,
"members": [
{
"_id": 1,
"host": "server1:31000"
},
{
"_id": 2,
"host": "server2:31001"
},
{
"_id": 3,
"host": "server3:31002"
}
]
}

여기에서 질문에 대한 답변을 찾을 수 없는 경우 문제 및 도움말 섹션에 나열된 포럼과 지원 채널을 사용해 보세요.

← 다중 필드 조인