FAQ
이 페이지의 내용
- Node 드라이버에서 연결 풀링은 어떻게 작동하나요?
- 'MongoServerSelectionError: connect ECONNrefUSED::1:27017' 오류는 어떻게 해결하나요?
- "connectTimeoutMS", "socketTimeoutMS" 및 "maxTimeMS"의 차이점은 무엇인가요?
- 드라이버가 연결 중에 중단되거나 연결할 수 없는 복제본 세트에 도달하는 데 너무 오래 소비하는 것을 방지하려면 어떻게 해야 하나요?
- 클라이언트의 연결이 끊어지면 실행 중인 작업은 어떻게 되나요?
- 드라이버가 사용할 수 없는 소켓을 닫았는지 어떻게 확인할 수 있나요?
- 소켓이 활성화되기 전에 시간이 초과되는 것을 어떻게 방지할 수 있나요?
- "0" 값은 "connectTimeoutMS" 및 "socketTimeoutMS"에 대해 무엇을 의미하나요?
- 장기간 실행되는 작업으로 인해 서버 속도가 느려지는 것을 어떻게 방지할 수 있나요?
- "keepAlive" 설정의 기능은 무엇인가요?
- 예기치 않은 네트워크 동작이 발생하면 어떻게 해야 하나요?
- 'client.connect()'를 호출할 때 'ECONNRESET' 메시지가 표시되면 어떻게 해야 하나요?
- 느린 작업으로 인해 다른 작업이 지연되는 것을 어떻게 방지할 수 잇나요?
- 내 연결 문자열이 복제본 세트에 유효한지 어떻게 확인할 수 있나요?
이 페이지에는 자주 묻는 질문(FAQ)과 해당 답변이 포함되어 있습니다.
팁
이 페이지에서 문제에 대한 답변을 찾을 수 없는 경우 문제 & 도움말 페이지에서 다음 단계와 추가 리소스를 확인하세요.
Node 드라이버에서 연결 풀링은 어떻게 작동하나요?
모든 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()
를 호출하면 비활성 소켓만 닫히므로 이 메서드를 사용하여 진행 중인 작업을 중단하거나 종료할 수 없습니다. 드라이버는 프로세스가 완료될 때만 이러한 소켓을 닫습니다.
'MongoServerSelectionError: connect ECONNrefUSED::1:27017' 오류는 어떻게 해결하나요?
버전 17부터 Node.js는 기본적으로 IPV6
을 사용합니다. 이 오류를 해결할 수 있는 몇 가지 옵션이 있습니다.
--ipv6 플래그를 사용하여
IPV6
모드에서mongod
를 시작하거나 구성 파일에서net.ipv6
옵션을true
로 설정합니다.--ipv6 플래그로 mongod 시작하기mongod --ipv6 구성 파일에서 net.ipv6 옵션 설정net: ipv6: true MongoClient에 대한 옵션으로 을(를) 지정하여 을(를)명시적으로 사용합니다.
IPV4
family: 4
const client = new MongoClient(uri, { family: 4, });
"connectTimeoutMS", "socketTimeoutMS" 및 "maxTimeMS"의 차이점은 무엇인가요?
설정 | 설명 |
---|---|
connectTimeoutMS |
팁MongoClient.connect 에 허용된 시간을 수정하려면 MongoDB 서버에 대한 연결을 설정하려면 기본값: 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 = collection.find({}).maxTimeMS(50);
드라이버가 연결 중에 중단되거나 연결할 수 없는 복제본 세트에 도달하는 데 너무 오래 소비하는 것을 방지하려면 어떻게 해야 하나요?
연결 중에 드라이버가 중단되는 것을 방지하거나 드라이버가 연결할 수 없는 복제본 세트에 도달하는 데 너무 오래 시간을 소비하는 것을 방지하려면 연결 옵션의 connectTimeoutMS
옵션을 설정할 수 있습니다. 일반적으로 connectTimeoutMS
설정이 해당 세트의 멤버에 대한 가장 긴 네트워크 지연 시간보다 낮지 않은지 확인해야 합니다. 세컨더리 멤버 중 하나가 지구 반대편에 있고 지연 시간이 10000밀리초인 경우 connectTimeoutMS
를 더 낮게 설정하면 드라이버가 해당 멤버에 연결되지 않습니다.
클라이언트의 연결이 끊어지면 실행 중인 작업은 어떻게 되나요?
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>, });
"0" 값은 "connectTimeoutMS" 및 "socketTimeoutMS"에 대해 무엇을 의미하나요?
connectTimeoutMS
또는 socketTimeoutMS
값을 0
으 로 설정하면 애플리케이션은 운영 체제의 기본 소켓 시간 초과 값을 사용합니다.
장기간 실행되는 작업으로 인해 서버 속도가 느려지는 것을 어떻게 방지할 수 있나요?
시간 초과 값을 지정하여 장기 실행 작업으로 인해 서버 속도가 느려지는 것을 방지할 수 있습니다. 특정 작업에 대한 시간 초과를 설정하기 위해 Cursor
를 반환하는 작업에 maxTimeMS()
메서드를 연결할 수 있습니다.
다음 예에서는 Cursor
를 반환하는 작업에 maxTimeMS()
메서드를 연결하는 방법을 보여줍니다.
// Execute a find command await collection .find({ $where: "sleep(100) || true" }) .maxTimeMS(50);
"keepAlive" 설정의 기능은 무엇인가요?
keepAlive
은(는)connection-setting
TLS keepAlive 를 시작하기 전에 대기할 시간(밀리초)을 설정하는 입니다. TCP 소켓에서. keepAlive
옵션은 MongoDB에 주기적으로 프로브를 전송하여 소켓을 활성 상태로 유지합니다. 그러나 이는 운영 체제가 SO_KEEPALIVE
을 지원하는 경우에만 작동합니다.
경고
방화벽이 킵얼라이브 패킷을 무시하거나 삭제하면 작동하지 않을 수 있습니다.
예기치 않은 네트워크 동작이 발생하면 어떻게 해야 하나요?
애플리케이션 서버와 MongoDB 사이에 존재하는 내부 방화벽은 잘못 구성된 경우가 많으며 소켓 연결을 제거하는 데 지나치게 공격적입니다.
예기치 않은 네트워크 동작이 발생하는 경우 확인해야 할 몇 가지 사항은 다음과 같습니다.
방화벽은 소켓을 닫을 때
FIN packet
를 전송하여 드라이버가 소켓이 닫혔다는 것을 감지할 수 있도록 해야 합니다.방화벽에서
keepAlive
프로브를 허용해야 합니다.
'client.connect()'를 호출할 때 'ECONNRESET' 메시지가 표시되면 어떻게 해야 하나요?
대부분의 운영 체제에서 각 연결은 파일 설명자 와 연결됩니다. . 일반적으로 단일 프로세스에서 사용하는 파일 설명자 수에는 운영 체제에서 설정하는 제한이 있습니다. 연결 풀 크기가 file descriptors
제한을 초과하는 경우 ECONNRESET
오류가 발생할 수 있습니다.
다음 작업을 고려하세요.
1 const uri = "mongodb://localhost:27017/test?maxPoolSize=5000"; 2 // create a new MongoClient 3 const client = new MongoClient(uri); 4 5 await client.connect(err => { 6 // connection 7 });
이 작업으로 인해 ECONNRESET
오류가 발생하면 Node.js 프로세스의 file descriptor
제한에 도달했을 수 있습니다. 이 경우 Node.js 프로세스의 file descriptors
수를 늘려야 합니다. MacOS 및 Linux 에서는 ulimit 를 사용하여 이 작업을 shell 수행합니다. 명령.
ulimit -n 6000
이렇게 하면 프로세스의 최대 file descriptors
수를 6000으로 설정하여 Node.js가 5000 소켓의 풀 크기로 연결할 수 있습니다.
느린 작업으로 인해 다른 작업이 지연되는 것을 어떻게 방지할 수 잇나요?
동일한 MongoClient
인스턴스를 사용하여 여러 MongoDB 작업을 동시에 실행하는 경우 작업 속도가 느려지면 다른 작업이 지연될 수 있습니다. 작업 속도가 느리면 MongoDB에 대한 연결이 계속 점유되어 다른 작업이 추가 연결을 사용할 수 있을 때까지 대기할 수 있습니다.
느린 MongoDB 작업으로 인해 지연이 발생한다고 의심되는 경우, 다음 메서드를 사용하여 진행 중인 모든 작업의 성능을 확인할 수 있습니다.
배포에서 데이터베이스 프로파일러를 활성화합니다. 자세한 내용은 MongoDB Server 매뉴얼의 데이터베이스 프로파일러 를 참조하세요.
db.currentOp()
MongoDB Shell 명령을 실행합니다. 자세한 내용은 MongoDB Server 매뉴얼의 db.currentOp() 문서를 참조하세요.연결 풀 모니터링을 활성화합니다. 자세한 내용은 연결 풀 모니터링을 참조하세요.
지연을 유발하는 작업을 확인한 후 이러한 작업의 성능을 개선합니다. 가능한 해결책 은 MongoDB 성능 모범 사례 가이드를 참조 하세요.
성능 모범 사례를 구현했지만 여전히 지연이 발생하는 경우 연결 설정을 수정하여 연결 풀 크기를 늘릴 수 있습니다. 연결 풀은 드라이버가 언제든지 유지 관리하는 서버에 대한 연결 그룹입니다.
연결 풀의 최대 크기를 지정하려면 MongoClient
인스턴스의 연결 옵션에서 maxPoolSize
옵션을 설정하면 됩니다. maxPoolSize
의 기본값은 100
입니다. 서버에 대한 사용 중인 연결 수가 maxPoolSize
에 도달하면 드라이버에 대한 연결이 가능해질 때까지 서버로 전송되는 다음 작업이 일시 중지됩니다. 다음 코드는 새 MongoClient
를 만들 때 maxPoolSize
를 150
으로 설정합니다.
const client = new MongoClient(uri, { maxPoolSize: 150 });
팁
연결 풀링에 대해 자세히 알아보려면 Node 드라이버에서 연결 풀링은 어떻게 작동하나요? FAQ 항목을 참조하세요.
내 연결 문자열이 복제본 세트에 유효한지 어떻게 확인할 수 있나요?
드라이버에 전달된 연결 string 은 복제본 세트 구성 에 설정된 대로 서버에 대해 정확한 호스트 이름을 사용해야 합니다. 복제본 세트에 대한 다음 구성 설정이 주어졌을 때 복제본 세트 검색 및 페일오버 가 작동하려면 드라이버가 server1
, server2
및 server3
에 도달할 수 있어야 합니다.
{ "_id": "testSet", "version": 1, "protocolVersion": 1, "members": [ { "_id": 1, "host": "server1:31000" }, { "_id": 2, "host": "server2:31001" }, { "_id": 3, "host": "server3:31002" } ] }
여기에서 질문에 대한 답변을 찾을 수 없는 경우 문제 및 도움말 섹션에 나열된 포럼과 지원 채널을 사용해 보세요.