클라이언트 생성
이 페이지의 내용
- 사용
Mongo::Client
- 차단 구문
- 데이터베이스 선택
- 연결 유형
- 독립형 서버 연결
- 복제본 세트 연결
- 샤드 cluster 연결
- 직접 연결
- 로드 밸런서 연결
- MongoDB Atlas 연결
- AWS 람다에서 MongoDB 아틀라스에 연결하기
- SRV URI 참고 사항
- 클라이언트 옵션
- Ruby 옵션
- URI 옵션
- 타임아웃 옵션
server_selection_timeout
socket_timeout
connect_timeout
max_time_ms
wtimeout
- TLS 연결
- TLS 대 SSL 옵션 이름
- TLS 연결 활성화
- 클라이언트 TLS 인증서 지정
- 수정
SSLContext
- CA 인증서 지정
- OCSP 검증
- IPv4/IPv6 연결
- TCP 킵얼라이브 구성
- 연결 풀링
- 포크 서버와 함께 사용
- 프로세스 포크 수동 처리
- 문제 해결
- 재시도 가능한 읽기
- 최신 재시도 가능 읽기
- 레거시 재시도 가능 읽기
- 재시도 가능 읽기 비활성화
- 재시도 가능한 쓰기
- 최신 재시도 가능 쓰기
- 레거시 재시도 가능 쓰기
- 재시도 가능 쓰기 비활성화
- 로깅
- 로거 수준 변경
- 잘라내기
- 압축
- 서버 API 매개변수
- 개발 구성
- 프로덕션 구성
- 기능 플래그
사용 Mongo::Client
MongoDB deployment에 연결하려면 Mongo::Client
객체를 만듭니다. 호스트 및 옵션 목록 또는 ``Mongo::Client`` 생성자에 대한 연결 string URI 를 제공합니다. 클라이언트가 선택한 데이터베이스의 기본값은 admin
입니다.
기본적으로 드라이버는 배포에서 사용하는 토폴로지를 자동으로 감지하고 적절하게 연결합니다.
로컬 독립형 MongoDB 배포에 연결하려면 서버의 호스트와 포트를 지정합니다. 대부분의 경우 연결할 데이터베이스 이름도 지정합니다. 데이터베이스 이름을 지정하지 않으면 클라이언트는 admin
데이터베이스를 사용합니다.
Mongo::Client.new([ '127.0.0.1:27017' ], database: 'mydb') # Or using the URI syntax: Mongo::Client.new("mongodb://127.0.0.1:27017/mydb")
참고
호스트 이름 localhost
은(는) 드라이버에서 특별히 처리하며 IPv4 주소로만 확인됩니다.
MongoDB Atlas에 연결 하려면 Atlas 배포 URI를 지정합니다.
Mongo::Client.new("mongodb+srv://username:myRealPassword@cluster0.mongodb.net/mydb?w=majority")
드라이버는 클러스터의 모든 노드를 검색하고 필요에 따라 연결합니다.
차단 구문
Mongo::Client 객체를 생성하는 또 다른 방법은 차단 구문을 사용하는 것입니다.
Mongo::Client.new(...) do |client| # work with the client end
이 구문을 사용하여 클라이언트를 생성할 때 블록 실행이 완료된 후 클라이언트가 자동으로 닫힙니다.
데이터베이스 선택
기본적으로 클라이언트는 admin
데이터베이스에 연결됩니다.
admin
데이터베이스는 관리 작업을 수행하고 사용자 및 역할과 같은 관리 데이터를 저장하는 데 자주 사용되는 MongoDB의 특수 데이터베이스입니다(사용자와 역할은 다른 데이터베이스에서도 정의할 수 있음). 샤드 클러스터에서는 admin
데이터베이스가 샤드 서버가 아닌 config 서버에 존재 합니다. 일반 작업(예: 애플리케이션 데이터 저장)에는 admin
데이터베이스를 사용할 수 있지만 이는 권장되지 않으며 애플리케이션은 사용하려는 데이터베이스를 명시적으로 지정해야 합니다.
데이터베이스는 Client
구성 중에 지정할 수 있습니다.
# Using Ruby client options: client = Mongo::Client.new(['localhost'], database: 'mydb') # Using a MongoDB URI: client = Mongo::Client.new('mongodb://localhost/mydb')
Client
인스턴스가 주어지면 use
메서드를 호출하여 지정된 데이터베이스로 구성된 새 Client
인스턴스를 가져올 수 있습니다.
client = Mongo::Client.new(['localhost'], database: 'mydb') admin_client = client.use('admin') # Issue an administrative command admin_client.database.command(replSetGetConfig: 1).documents.first
MongoDB에는 명시된 목적으로만 사용해야 하는 다른 특수 데이터베이스가 있습니다.
연결 유형
드라이버는 기본적으로 연결하라는 지시를 받은 배포 유형을 검색하고(부하 분산된 배포 제외), 배포 유형과 일치하는 방식으로 작동합니다. 아래 하위 섹션에서는 각 배포 유형에서 드라이버가 작동하는 방식과 자동 배포 유형 감지를 우회하여 특정 동작을 강제로 수행하는 방법에 대해 설명합니다.
배포 유형 검색은 드라이버가 연결하라는 지시를 받은 서버 중 하나로부터 첫 번째 회신을 받을 때 이루어집니다(부하 균형 조정 모드가 요청되지 않은 경우 아래 참조). 드라이버는 기본 배포가 다른 유형 중 하나로 교체되더라도 검색되거나 구성된 토폴로지에 남아 있습니다. 특히, 복제본 세트를 동일한 주소에 있는 샤드 cluster로 교체하는 경우, 클라이언트 인스턴스는 샤딩된 cluster와 통신할 수 있도록 애플리케이션을 다시 시작하는 등의 방법으로 다시 생성되어야 합니다.
로드 밸런싱된 배포의 자동 검색은 현재 지원되지 않습니다. 부하가 분산된 배포는 일반적으로 샤드 클러스터인 기본 유형의 배포로 취급됩니다. 로드 밸런싱된 배포를 샤드 클러스터로 처리할 때 드라이버가 올바르게 작동하지 않으므로, 배포가 로드 밸런싱된 배포 인 경우 로드 밸런서에 연결하도록 클라이언트를 명시적으로 구성해야 합니다.
독립형 서버 연결
배포가 단일 서버인 경우(독립형 배포라고도 함) 모든 작업은 지정된 서버로 전달됩니다.
서버가 종료되고 복제본 세트 노드로 교체되면 노드가 세컨더리이거나 세컨더리가 되더라도 드라이버는 모든 작업을 해당 노드로 계속 전송합니다.
독립형 연결을 강제 실행하려면 아래의 직접 연결 섹션을 참조하세요.
복제본 세트 연결
복제본 세트에 연결할 때는 복제본 세트 복제본 세트 있는 노드 의 주소 를 운전자 에 전달하면 충분합니다. 노드 는 프라이머리 노드일 필요는 없으며 숨겨진 노드 일 수 있습니다. 그러면 운전자 가 나머지 노드를 자동으로 검색합니다.
그러나 복제본 세트의 일부인 모든 노드를 지정하여 하나 이상의 노드를 사용할 수 없는 이벤트(예: 유지 관리 또는 재구성으로 인해)에도 드라이버가 복제본 세트에 계속 연결할 수 있습니다.
복제본 세트 연결 예시:
Mongo::Client.new([ '127.0.0.1:27017' ], database: 'mydb') Mongo::Client.new([ '127.0.0.1:27017', '127.0.0.1:27018' ], database: 'mydb') # Or using the URI syntax: Mongo::Client.new("mongodb://127.0.0.1:27017,127.0.0.1:27018/mydb")
드라이버가 연결 시 복제본 세트 이름을 확인하도록 하려면 replica_set
Ruby 옵션 또는 replicaSet
URI 옵션을 사용하여 전달합니다.
Mongo::Client.new([ '127.0.0.1:27017', '127.0.0.1:27018' ], database: 'mydb', replica_set: 'myapp') # Or using the URI syntax: Mongo::Client.new("mongodb://127.0.0.1:27017,127.0.0.1:27018/mydb?replicaSet=myapp")
배포서버가 복제본 세트가 아니거나 다른 복제본 세트 이름을 사용하는 경우 모든 작업이 실패합니다(서버에서 예상한 복제본 세트를 반환할 때까지).
복제본 세트 이름을 지정하지 않고 복제본 세트 연결을 강제로 실행할 수도 있습니다. 이 작업은 일반적으로 불필요하며 더 이상 사용되지 않습니다.
Mongo::Client.new([ '127.0.0.1:27017', '127.0.0.1:27018' ], database: 'mydb', connect: :replica_set) # Or using the URI syntax: Mongo::Client.new("mongodb://127.0.0.1:27017,127.0.0.1:27018/mydb?connect=replica_set")
복제본 세트로 배포된 MongoDB Atlas cluster에 연결하려면 URI에 연결합니다.
Mongo::Client.new("mongodb+srv://username:myRealPassword@cluster0.mongodb.net/test?w=majority")
SRV URI를 사용하는 경우 SRV URI 노트 를 검토하세요.
샤드 cluster 연결
샤딩된 클러스터 배포서버 서버에 연결하려면 mongos
라우터의 주소를 지정합니다.
Mongo::Client.new([ '1.2.3.4:27017', '1.2.3.5:27017' ], database: 'mydb') Mongo::Client.new("mongodb://1.2.3.4:27017,1.2.3.5:27017/mydb")
복제본 세트 연결과 달리 배포에 있는 mongos
라우터의 하위 집합에 연결하도록 선택할 수 있습니다. 드라이버는 각 라우터를 모니터링하고 사용 가능한 라우터를 사용합니다(즉, 드라이버는 일반적으로 장애 또는 유지 관리로 인해 사용할 수 없게 되는 개별 라우터를 처리합니다). 라우터 목록을 명시적으로 지정할 때 드라이버는 구성되었을 수 있는 나머지 라우터를 검색하지 않으며 연결을 시도하지 않습니다.
드라이버는 인식하고 있는 라우터 간에 작업 부하의 균형을 자동으로 조정합니다.
샤드 클러스터로 배포된 MongoDB Atlas cluster에 연결하려면 URI에 연결합니다.
Mongo::Client.new("mongodb+srv://username:myRealPassword@cluster0.mongodb.net/test?w=majority")
드라이버가 SRV URI를 통해 샤드 cluster에 연결할 때 URI에 지정된 주소의 SRV 레코드에서 변경 사항을 주기적으로 폴링하고 mongos
호스트를 현재 상태 그대로 서버에 자동으로 추가 및 제거합니다. 샤드 cluster에 추가 및 제거됩니다.
샤드 cluster를 강제로 연결하려면 connect: :sharded
옵션을 사용합니다. 이 작업은 일반적으로 불필요하며 더 이상 사용되지 않습니다.
Mongo::Client.new([ '127.0.0.1:27017', '127.0.0.1:27018' ], database: 'mydb', connect: :sharded) # Or using the URI syntax: Mongo::Client.new("mongodb://127.0.0.1:27017,127.0.0.1:27018/mydb?connect=sharded")
SRV URI를 사용하는 경우 SRV URI 노트 를 검토하세요.
직접 연결
배포 유형 검색을 비활성화하고 모든 작업을 특정 서버에서 수행하도록 강제하려면 direct_connection
옵션을 지정합니다.
Mongo::Client.new([ '1.2.3.4:27017' ], database: 'mydb', direct_connection: true) # Or using the URI syntax: Mongo::Client.new("mongodb://1.2.3.4:27017/mydb?directConnection=true")
또는 더 이상 사용되지 않는 connect: :direct
옵션이 동일합니다.
Mongo::Client.new([ '1.2.3.4:27017' ], database: 'mydb', connect: :direct) # Or using the URI syntax: Mongo::Client.new("mongodb://1.2.3.4:27017/mydb?connect=direct")
직접 연결 모드는 특정 복제본 세트 노드에서 작업을 수행하는 데 가장 유용하지만, 기본 서버의 유형을 변경할 수도 있습니다(예: 복제본 세트 노드에서 mongos
라우터로 또는 그 반대로).
로드 밸런서 연결
다른 배포 유형과 달리 드라이버는 현재 부하가 분산된 배포를 자동으로 감지하지 않습니다.
로드 밸런서에 연결하려면 load_balanced: true
Ruby 옵션 또는 loadBalanced=true
URI 옵션을 지정합니다.
Mongo::Client.new([ '1.2.3.4:27017' ], database: 'mydb', load_balanced: true) # Or using the URI syntax: Mongo::Client.new("mongodb://1.2.3.4:27017/mydb?loadBalanced=true")
이 옵션을 사용할 때 지정된 서버가 밸런서가 아니면 서버가 밸런서가 될 때까지 클라이언트의 모든 작업이 실패합니다.
서버가 로드 밸런서로 식별되지 않는 경우에도 이를 로드 밸런서로 취급하려면 connect: :load_balanced
Ruby 옵션 또는 connect=load_balanced
URI 옵션을 사용하세요.
Mongo::Client.new([ '1.2.3.4:27017' ], database: 'mydb', load_balanced: true, connect: :load_balanced) # Or using the URI syntax: Mongo::Client.new("mongodb://1.2.3.4:27017/mydb?loadBalanced=true&connect=load_balanced")
MongoDB Atlas 연결
Atlas에서 MongoDB deployment에 연결하려면 먼저 클러스터의 연결 문자열 및 기타 클라이언트 옵션을 사용하여 Mongo::Client
인스턴스를 만듭니다.
새 서버 버전으로 업그레이드할 때 호환성이 손상되는 변경이 발생하지 않도록 stable API 버전을 클라이언트 옵션으로 설정할 수 있습니다.
다음 코드는 MongoDB 배포에 연결할 때 연결 문자열과 Stable API 클라이언트 옵션을 지정하고 연결이 성공했는지 확인하는 방법을 보여 줍니다:
require 'mongo' # Replace the placeholders with your credentials uri = "mongodb+srv://<username>:<password>@cluster0.sample.mongodb.net/?retryWrites=true&w=majority" # Set the server_api field of the options object to Stable API version 1 options = { server_api: { version: "1" } } # Create a new client and connect to the server client = Mongo::Client.new(uri, options) # Send a ping to confirm a successful connection begin admin_client = client.use('admin') result = admin_client.database.command(ping: 1).documents.first puts "Pinged your deployment. You successfully connected to MongoDB!" rescue Mongo::Error::OperationFailure => ex puts ex ensure client.close end
AWS 람다에서 MongoDB 아틀라스에 연결하기
AWS Lambda에서 Atlas에 연결하는 방법을 알아보려면 AWS Lambda로 연결 관리 문서를 참조하세요.
SRV URI 참고 사항
드라이버가 mongodb+srv 프로토콜 URI에 연결할 때는 다음 사항에 유의하세요.
SRV URI 조회는 클라이언트가 구성될 때 동시에 수행됩니다. 어떤 이유로든 이 조회가 실패하면 예외와 함께 클라이언트 생성이 실패합니다. 클라이언트가 호스트 목록으로 구성되면 드라이버는 클라이언트 객체가 존재하는 동안 해당 호스트에 연결하고 모니터링을 시도합니다. 이러한 호스트 중 하나가 처음에는 확인되지 않았다가 나중에 확인할 수 있게 되는 경우, 드라이버는 해당 호스트가 사용 가능해지면 해당 호스트에 연결할 수 있습니다. 초기 SRV URI 조회는 첫 번째 시도에서 성공해야 합니다. 이후 호스트 조회는 필요에 따라 드라이버가 다시 시도합니다.
드라이버는 SRV 레코드에 해당하는 DNS TXT 레코드에서 URI 옵션을 조회합니다. 이러한 옵션은 URI에 지정된 URI 옵션과 Ruby 옵션으로 이 순서대로 재정의할 수 있습니다.
URI 옵션은 SRV 조회와 별도의 DNS 쿼리에서 검색되기 때문에, 네트워크 연결이 안정적이지 않은 환경에서는 SRV 조회가 성공하더라도 URI 옵션 쿼리가 실패할 수 있습니다. 이러한 실패로 인해 드라이버가 잘못된 인증 소스를 사용하여 인증에 실패할 수 있습니다. 이 문제는 인증 소스를 명시적으로 지정하여 해결할 수 있습니다.
Mongo::Client.new("mongodb+srv://username:myRealPassword@cluster0.mongodb.net/test?w=majority&authSource=admin") 구성된
Client
객체의 토폴로지를 알 수 없거나 샤딩된 cluster인 경우 드라이버는 지정된 SRV DNS 레코드의 변경 사항을 모니터링하기 시작하고 cluster의 서버 목록을 자동으로 업데이트합니다. 토폴로지가 단일 또는 복제본 세트가 되면 업데이트가 중지됩니다.
클라이언트 옵션
Mongo::Client
의 생성자는 드라이버의 동작을 구성하는 여러 옵션을 허용합니다. 옵션은 옵션 해시에서 Ruby 옵션으로, URI에서 URI 옵션으로 또는 둘 다 제공될 수 있습니다. Ruby 옵션과 유사한 URI 옵션이 모두 제공되는 경우, Ruby 옵션이 우선합니다.
Ruby 옵션
참고
직접 전달되는 옵션은 기호여야 합니다.
참고
별도로 지정하지 않는 한 시간을 처리하는 Ruby 옵션은 초 단위로 표시됩니다.
옵션 | 설명 | 유형 | 기본값 | ||||||
---|---|---|---|---|---|---|---|---|---|
| 3.4 이상 서버 버전에서 연결 설정 시 mongod 로그에 출력되는 애플리케이션 이름입니다. |
| none | ||||||
| 사용할 인증 메커니즘을 지정합니다. |
| 사용자 자격 증명이 제공되지 않으면 | ||||||
| 추가 인증 메커니즘 속성을 제공합니다. 속성의 키는 대소문자를 구분하지 않고 해석됩니다. 클라이언트가 생성될 때 키는 소문자로 표시됩니다. |
| GSSAPI 인증 메커니즘을 사용할 때 기본 속성은 | ||||||
| 인증 소스를 지정합니다. |
| MongoDB 2.6 이상: 자격 증명이 제공되면 admin , 그렇지 않으면 현재 데이터베이스 | ||||||
| 자동 암호화를 구성하기 위한
이러한 옵션의 서식을 지정하는 방법에 대한 자세한 내용은 클라이언트 사이드 암호화 튜토리얼의 "자동 암호화 옵션" 섹션을 참조하세요. |
| none | ||||||
| 실험적입니다. 백그라운드 스레드에서 오류가 발생할 때 역추적을 기록할지 여부와 기록하는 방법을 제어합니다. |
| none | ||||||
| 사용할 수 있는 잠재적 압축기 목록을 선호도 순으로 정렬합니다. 드라이버가 압축을 구현하는 방법에 대한 자세한 내용은 아래를 참조하세요. |
| none | ||||||
| 더 이상 사용되지 않습니다. 드라이버에서 일반적으로 수행하는 배포 토폴로지 검색을 비활성화하고 cluster 토폴로지를 특정 유형으로 강제 설정합니다. 유효한 값은 |
| none | ||||||
| 예외가 발생하기 전에 소켓 연결을 설정하기 위해 대기하는 시간(초)입니다. 이 시간 제한은 SRV DNS 레코드 확인에도 사용됩니다. |
| 10 | ||||||
| 연결할 데이터베이스의 이름입니다. |
| 관리자 | ||||||
| 배포 토폴로지를 검색하지 않고 지정된 호스트에 직접 연결합니다. |
| 거짓 | ||||||
| 서버 모니터가 서버 상태를 비동기적으로 새로 고치는 데 걸리는 시간(초)입니다. |
| 10 | ||||||
| 문서의 ID를 생성하는 사용자 지정 객체입니다. #generate에 응답해야 합니다. |
| none | ||||||
| 로드 밸런서에 연결할지 여부입니다. |
| 거짓 | ||||||
| 가장 가까운 서버와 작동하도록 선택할 수 있는 서버 간의 최대 지연 시간(초)을 지정합니다. |
| 0.015 | ||||||
| 사용자 지정 로거. |
|
| ||||||
| 연결 풀이 병렬로 설정을 시도할 최대 연결 수입니다. |
| 2 | ||||||
| 연결 풀에서 연결이 닫히기 전에 연결이 유휴 상태일 수 있는 최대 시간(초)입니다. 경고: 로드 밸런서에 연결된 경우 드라이버는 커서를 반복하고(change stream 포함) 트랜잭션을 실행하기 위해 기존 연결을 사용합니다. 이 옵션을 통해 유휴 시간을 설정하면 드라이버가 후속 작업에 필요한 연결을 닫게 되어 해당 작업이 실패할 수 있습니다. |
| none | ||||||
| 각 서버에 대한 연결 풀의 최대 크기입니다. 이 옵션을 0으로 설정하면 연결 풀에서 최대 크기 제한이 제거되어 연결 풀을 원하는 수로 늘릴 수 있습니다. |
| 20 | ||||||
| 레거시 읽기 재시도가 사용되는 경우 최대 읽기 재시도 횟수입니다. 레거시 읽기 재시도를 비활성화하려면 0으로 설정합니다. |
| 1 | ||||||
| 레거시 쓰기 재시도가 사용되는 경우 최대 쓰기 재시도 횟수입니다. 레거시 쓰기 재시도를 비활성화하려면 0으로 설정합니다. |
| 1 | ||||||
| 각 서버에 대한 연결 풀의 최소 연결 수입니다. 드라이버는 풀에 이렇게 많은 연결이 포함될 때까지 백그라운드에서 연결을 설정합니다. |
| 0 | ||||||
| 모니터링 객체입니다. |
| none | ||||||
| 인증할 사용자의 비밀번호입니다. |
| none | ||||||
| 서버 버전 3.4 이상에서 연결 설정 시 mongod 로그에 출력되는 메타데이터에 포함할 플랫폼 정보입니다. |
| none | ||||||
|
태그 세트가 제공되는 경우 해시 배열이어야 합니다. 서버는 해당 태그가 제공된 태그 세트의 해시 중 하나와 일치하는 경우 읽기 설정을 충족합니다. 각 태그 세트는 해시여야 하며 서버 선택에 사용되기 전에 내부적으로 |
|
| ||||||
| 읽기 고려 (read concern) 옵션을 지정합니다. 유일한 유효한 키는 |
| none | ||||||
| mongos에서 읽기를 재시도하는 간격(초)입니다. |
| 5 | ||||||
| 복제본 세트에 연결할 때 서버를 필터링하는 기준이 되는 세트의 이름입니다. |
| none | ||||||
| 네트워크 오류로 인해 단일 문 쓰기 작업이 실패하면 드라이버는 서버 버전 3.6 이상에 연결될 때 자동으로 한 번 재시도합니다. |
| true | ||||||
| 클라이언트는 배포가 생성되는 즉시 백그라운드에서 배포를 모니터링하기 시작하므로 클라이언트를 구성한 다음 별도의 성명서에서 SDAM 이벤트를 구독하면 구독자가 일부 SDAM 이벤트를 수신하지 못할 수 있습니다. 클라이언트의 이벤트 구독 메커니즘이 초기화된 후 클라이언트에 서버가 추가되기 전에 참고: |
| none | ||||||
| 요청된 서버 API 버전입니다. 허용되는 항목은 다음과 같은 해시입니다: - 서버 API 버전은 URI 옵션이 아닌 Ruby 옵션으로만 지정할 수 있으며 데이터베이스 및 collection 객체에 대해 재정의할 수 없습니다. 클라이언트에서 서버 API 버전이 변경된 경우(예: |
| none | ||||||
| 예외가 발생하기 전에 작업이 실행되도록 적절한 서버가 선택될 때까지 기다리는 시간(초)입니다. |
| 30 | ||||||
| 예외가 발생하기 전에 소켓에서 작업이 실행될 때까지 기다리는 시간(초)입니다. |
| none | ||||||
| 샤드 토폴로지를 위해 드라이버가 통신할 mongoses의 최대 개수입니다. 이 옵션을 0으로 설정하면 최대 mongoses 수에 제한이 없습니다. 지정된 URI가 |
| 0 | ||||||
| SRV DNS 쿼리에 사용할 서비스 이름입니다. |
| mongodb | ||||||
| 클라이언트에게 TLS를 통해 서버에 연결하도록 지시합니다. |
| 거짓 | ||||||
| 연결의 다른 쪽 끝에서 전달된 인증서의 유효성을 검사하는 데 사용되는 연결된 인증 기관 인증서가 포함된 파일 경로입니다. 에는 |
| none | ||||||
| 연결의 다른 쪽 끝에서 전달된 인증서의 유효성을 검사하는 데 사용되는 인증 기관 인증서를 나타내는 OpenSSL::X509::Certificate 의 배열입니다. 에는 |
| none | ||||||
| 연결의 다른 쪽 끝에서 전달된 인증서의 유효성을 검사하는 데 사용되는 연결된 인증 기관 인증서가 포함된 문자열입니다. 에는 |
| none | ||||||
| MongoDB 서버에서 애플리케이션을 식별하는 데 사용되는 클라이언트 인증서 파일의 경로입니다. 파일에는 인증서의 개인 키도 포함될 수 있습니다. 이 경우 이 옵션에서는 개인 키를 무시합니다. 파일에는 클라이언트 인증서에서 CA 인증서까지 인증서 체인을 형성하는 중간 인증서도 포함될 수 있습니다. 모든 중간 인증서는 드라이버에 의해 구문 분석되어 이 옵션은 있는 경우 |
| none | ||||||
| MongoDB Server에서 애플리케이션을 식별하는 데 사용되는 OpenSSL::X509::Certificate입니다. 이 옵션을 통해 전달할 수 있는 인증서는 단 하나뿐입니다. |
| none | ||||||
| MongoDB Server에서 애플리케이션을 식별하는 데 사용되는 PEM 인코딩 인증서가 포함된 문자열입니다. 이 문자열에는 인증서의 비공개 키도 포함될 수 있습니다. 이 경우 이 옵션에서는 개인 키를 무시합니다. 이 문자열에는 클라이언트 인증서에서 CA 인증서까지의 인증서 체인을 형성하는 중간 인증서도 포함될 수 있습니다. 모든 중간 인증서는 드라이버에 의해 구문 분석되어 이 옵션은 있는 경우 |
| none | ||||||
| MongoDB에 대한 연결을 식별하는 데 사용되는 비공개 키 파일입니다. 키가 인증서와 동일한 파일에 저장되어 있더라도 둘 다 명시적으로 지정해야 합니다. 이 옵션(있는 경우)은 :ssl_key_string 및 :ssl_key_object의 값보다 우선합니다. |
| none | ||||||
| MongoDB에 대한 연결을 식별하는 데 사용되는 비공개 키입니다. |
| none | ||||||
| 비공개 키의 암호입니다. |
| none | ||||||
| MongoDB에 대한 연결을 식별하는 데 사용되는 PEM 인코딩된 비공개 키가 포함된 문자열입니다. 이 매개변수(있는 경우)는 ssl_key_object 옵션의 값보다 우선합니다. |
| none | ||||||
| Peering 인증서, 호스트 이름 및 OCSP 엔드포인트 유효성 검사를 수행할지 여부입니다. |
| true | ||||||
| Peering 인증서 유효성 검사를 수행할지 여부입니다. 이 설정은 인증서 유효성 검사 수행 여부와 관련하여 |
| true | ||||||
| 피어 호스트 이름 유효성 검사를 수행할지 여부입니다. 이 설정은 호스트 이름 유효성 검사의 수행 여부와 관련하여 |
| true | ||||||
| OCSP 엔드포인트가 인증서에 지정된 경우 인증서에 지정된 OCSP 엔드포인트에 대해 서버 제공 인증서의 유효성을 검사할지 여부입니다. 이 설정은 OCSP 엔드포인트 유효성 검사 수행 여부와 관련하여 :ssl_verify를 재정의합니다. |
| true | ||||||
| 로그를 기본값 250자에서 자를지 여부입니다. |
| true | ||||||
| 인증할 사용자의 이름입니다. |
| none | ||||||
| 연결 풀의 연결이 사용 가능해질 때까지 기다리는 시간(초)입니다. |
| 10 | ||||||
| 드라이버를 래핑하는 라이브러리(예: ODM)에 대한 정보입니다. 더 낮은 수준의 라이브러리를 먼저 지정합니다. 허용되는 해시 키: :name, :version, :platform. 예: |
| none | ||||||
| 더 이상 사용되지 않습니다. |
|
| ||||||
| 쓰기 고려 (write concern) 옵션을
|
|
| ||||||
| 압축을 사용하는 경우 사용할 Zlib 압축 수준입니다. 유효한 레벨은 Ruby의 Zlib 모듈을 참조하세요. |
| none |
참고
Ruby 드라이버는 인증서 해지 목록(CRL) 검사를 구현하지 않습니다.
URI 옵션
URI 옵션은 Ruby 표준이 아닌 카멜 표기법을 사용해야 하므로 다음 표에 URI 옵션과 해당 Ruby 옵션이 나와 있습니다.
URI 옵션은 연결 URI 참조에 자세히 설명되어 있습니다.
참고
URI에서 밀리초 단위 로 설정된 옵션은 Ruby에서 float
로 표시되고 단위는 초 입니다.
URI 옵션 | Ruby 옵션 |
---|---|
appName=String |
|
authMechanism=String |
인증 메커니즘 값은 다음과 같이 URI 옵션에서 Ruby 옵션으로 변환됩니다.
인증 메커니즘에 다른 값이 제공되면 수정되지 않은 상태로 Ruby 옵션으로 변환되며 |
authMechanismProperties=문자열 |
쉼표로 구분된 키:값 쌍으로 지정됩니다(예: |
authSource=String |
|
압축기=문자열 |
사용할 수 있는 잠재적 압축기를 쉼표로 구분된 목록으로, 기본 설정 순서대로 표시합니다. 드라이버가 압축을 구현하는 방법에 대한 자세한 내용은 아래를 참조하세요. |
connect=String |
여기서는 |
connectTimeoutMS=정수 |
유효하지 않은 값으로 클라이언트 생성에 실패하는 해당 Ruby 옵션과 달리(예: 음수 및 숫자가 아닌 값), 이 URI 옵션을 통해 제공된 유효하지 않은 값은 경고와 함께 무시됩니다. |
directConnection=Boolean |
|
fsync=Boolean |
|
heartbeatFrequeencyMS=정수 |
|
journal=Boolean |
|
loadBalanced=Boolean |
|
localThresholdMS=정수 |
|
maxConnecting=Integer |
|
maxIdleTimeMS=정수 |
|
maxStalenessSeconds=정수 |
maxStalenessSeconds URI 옵션 값이 -1이면 드라이버는 이를 옵션이 전혀 제공되지 않은 것처럼 처리합니다. 그렇지 않고 옵션 값이 숫자인 경우 Ruby 옵션은 |
maxPoolSize=Integer |
|
minPoolSize=Integer |
|
readConcernLevel=String |
|
readPreference=String |
|
readPreferenceTags=문자열 |
readPreferenceTags 필드의 각 인스턴스는 쉼표로 구분된 키:값 쌍으로, 지정된 순서대로 :tag_sets 배열에 표시됩니다. 인스턴스, |
replicaSet=String |
|
retryWrites=Boolean |
|
serverSelectionTimeoutMS=정수 |
|
socketTimeoutMS=정수 |
유효하지 않은 값으로 클라이언트 생성에 실패하는 해당 Ruby 옵션과 달리(예: 음수 및 숫자가 아닌 값), 이 URI 옵션을 통해 제공된 유효하지 않은 값은 경고와 함께 무시됩니다. |
srvMaxHosts=정수 |
|
srvServiceName=문자열 |
|
ssl=Boolean |
|
tls=Boolean |
|
tlsAllowInvalidCertificates=Boolean |
|
tlsAllowInvalidHostnames=Boolean |
|
tlsCAFile=문자열 |
|
tlsCertificateKeyFile=문자열 |
|
tlsCertificateKeyFile=문자열 |
|
tlsCertificateKeyFilePassword=문자열 |
|
tlsDisableOCSPEndpointCheck=Boolean |
|
tlsInsecure=Boolean |
tlsInsecure 는 |
w=정수|문자열 |
|
waitQueueTimeoutMS=정수 |
|
wtimeoutMS=정수 |
|
zlibCompressionLevel=Integer |
|
참고
Ruby 드라이버는 서버의 인증서가 취소되었음을 나타내는 최종 서명된 응답을 받은 경우에만 연결에 실패합니다. 이 때문에 드라이버가 tlsDisableCertificateRevocationCheck
URI 옵션을 인식하지 못합니다. 이 옵션이 URI로 제공되면 무시됩니다.
타임아웃 옵션
server_selection_timeout
작업을 실행할 때 드라이버가 작업을 보낼 적절한 서버를 찾을 때까지 기다리는 시간(초)입니다. 기본값은 30입니다.
값이 0이면 시간 초과가 없습니다.
URI 옵션을 통해 유효하지 않은 값(예: 음수 또는 숫자가 아닌 값)이 전달되면 유효하지 않은 입력은 경고와 함께 무시됩니다. Ruby 옵션을 통해 유효하지 않은 값이 클라이언트에 직접 전달되면 오류와 함께 클라이언트 생성이 실패합니다.
복제본 세트 배포에서는 드라이버가 기본 변경 사항을 투명하게 처리할 수 있도록 이 시간 제한을 일반적인 복제본 세트 선택 시간 을 초과하도록 설정해야 합니다. 또한 이 시간 제한을 통해 애플리케이션과 데이터베이스를 동시에 시작할 수 있습니다. 애플리케이션은 데이터베이스를 사용할 수 있을 때까지 이 시간까지 대기합니다.
애플리케이션 서버가 역방향 프록시 뒤에 있는 경우, 서버 선택 제한 시간은 역방향 프록시에 구성된 요청 시간 제한보다 작아야 합니다(예: 라우팅 계층에서 제한 시간이 30초로 고정된 Herku의 배포에 적용됨). 개발 중에는 서버가 실행 중이 아닐 때 더 빨리 실패하도록 이 값을 낮출 수 있습니다.
socket_timeout
일반(모니터링이 아닌) 연결에서 소켓 읽기 또는 쓰기가 완료될 때까지 기다리는 시간(초)입니다. 기본값은 시간 초과 없음입니다.
값이 0이면 시간 초과가 없습니다.
URI 옵션을 통해 유효하지 않은 값(예: 음수 또는 숫자가 아닌 값)이 전달되면 유효하지 않은 입력은 경고와 함께 무시됩니다. Ruby 옵션을 통해 유효하지 않은 값이 클라이언트에 직접 전달되면 오류와 함께 클라이언트 생성이 실패합니다.
이 제한 시간은 네트워크 지연 시간과 작업 기간을 모두 고려해야 합니다. 예를 들어 이 시간 제한을 5초로 설정하면 Mongo::Error::SocketTimeoutError
을(를) 사용하여 서버에서 실행되는 데 5초 이상 걸리는 쿼리가 중단됩니다.
기본적으로 소켓 시간 제한이 설정되어 있지 않지만 운영 체제는 구성에 따라 여전히 읽기 작업 시간을 초과할 수 있습니다. 킵얼라이브 설정은 끊어진 네트워크 연결을 감지하기 위한 것입니다(단순히 실행 시간이 오래 걸린다는 이유로 작업을 중단하는 것과 반대).
socket_timeout
값을 초과하여 드라이버에 의해 작업 시간이 초과된 경우에도 서버에서 중단되지 않습니다. 따라서 오래 실행될 가능성이 있는 작업에는 max_time_ms
옵션을 사용하는 것이 좋습니다.
이 옵션은 연결 모니터링에는 적용되지 않습니다.
connect_timeout
서버에 대한 소켓 연결이 설정될 때까지 기다리는 시간(초)입니다. 기본값은 10입니다.
이 제한 시간은 연결 모니터링을 위한 연결 제한 시간 및 소켓 제한 시간으로도 사용됩니다.
mongodb+srv://
URI를 사용할 때 이 시간 제한은 SRV 및 TXT DNS 조회에도 사용됩니다. 시간 초과는 조회별로 적용됩니다. DNS 접미사 검색 목록으로 인해 단일 이름 확인의 일부로 여러 조회를 수행할 수 있습니다.
wait_queue_timeout
연결 풀의 연결이 사용 가능해질 때까지 기다리는 시간(초)입니다. 기본값은 10입니다.
드라이버 버전 2.11부터 연결 풀이 연결을 반환하기 전에 완전히 연결을 설정하여 여러 번의 네트워크 왕복이 필요할 수 있으므로 이 시간 제한을 최소한 connect_timeout
이상의 값으로 설정해야 합니다.
max_time_ms
특정 작업에 대한 옵션으로 지정되며, 서버에서 작업을 실행할 수 있는 시간(밀리초)입니다. 기본적으로 설정되지 않습니다.
장기 실행 작업이 너무 오래 걸릴 때 서버에서 중단될 가능성이 있는 경우 socket_timeout
대신 이 옵션을 사용하는 것이 좋습니다.
wtimeout
쓰기 고려 (write concern)에 지정된 서버들에 의해 쓰기가 승인될 때까지 기다리는 시간(밀리초)입니다. 기본적으로 설정되지 않은 경우 서버가 기본값을 적용하도록 지시합니다. 이 옵션은 클라이언트에서 전역으로 설정하거나 :write_concern
아래의 개별 작업에 전달할 수 있습니다.
TLS 연결
TLS를 사용하여 MongoDB deployment에 연결하려면 다음을 수행하세요.
Mongo::Client
에서 TLS 연결을 활성화합니다.클라이언트 TLS 인증서를 지정합니다.
서버의 TLS 인증서를 확인하려면 CA 인증서를 지정하세요.
참고
JRuby를 사용하는 경우 ECDSA 인증서는 현재 지원되지 않습니다.
TLS 대 SSL 옵션 이름
Ruby 드라이버에서 지원하는 모든 MongoDB Server 버전(2.6 이상)은 TLS만 구현합니다. 2.6 이상 버전의 서버는 SSL을 사용하지 않습니다.
역사적 이유로 TLS 구성과 관련된 Ruby 옵션 이름에는 tls
접두사 대신 ssl
이 사용됩니다. Ruby 드라이버(3.0)의 다음 주요 버전에서는 Ruby 옵션 이름에 tls
접두사가 사용됩니다.
URI 옵션 이름에는 tls
접두사가 사용되며, 한 가지 예외는 더 이상 사용되지 않으며 tls
URI 옵션에 해당하는 ssl
URI 옵션이 있다는 것입니다.
TLS 연결 활성화
배포에 TLS 연결이 필요한 경우 클라이언트 사이드에서 TLS를 명시적으로 요청해야 하며, 현재 배포에 TLS가 필요한지 여부에 대한 자동 검색은 없습니다.
TLS 연결을 요청하려면 Mongo::Client
구성 시 다음 클라이언트 옵션을 지정합니다.
:ssl
Ruby 옵션.tls
URI 옵션입니다.ssl
URI 옵션(더 이상 사용되지 않음).
클라이언트 TLS 인증서 지정
기본적으로 MongoDB 서버는 연결 클라이언트의 TLS 인증서를 확인하려고 시도하며, 이를 위해 클라이언트는 연결 시 TLS 인증서를 지정해야 합니다. 이는 다음을 통해 수행할 수 있습니다.
:ssl_cert
/:ssl_cert_object
/:ssl_cert_string
및:ssl_key
/:ssl_key_object
/:ssl_key_string
/:ssl_key_pass_phrase
Ruby 옵션.tlsCertificateKeyFile
URI 옵션입니다.
Ruby 옵션 사용 시, 클라이언트 TLS 인증서와 해당 비공개 키가 별도로 제공될 수 있습니다. 예를 들어 인증서가 client.crt
에 저장되고 비공개 키가 client.key
에 저장된 경우 Mongo::Client
는 다음과 같이 구성될 수 있습니다.
client = Mongo::Client.new(["localhost:27017"], ssl: true, ssl_cert: 'path/to/client.crt', ssl_key: 'path/to/client.key', ssl_ca_cert: 'path/to/ca.crt', )
ssl_cert
, ssl_cert_string
, ssl_key
및 ssl_key_string
Ruby 옵션을 사용하면 인증서와 키를 각각 동일한 파일 또는 문자열로 제공할 수도 있습니다. 인증서와 비공개 키가 모두 포함된 파일의 확장자는 .pem
인 경우가 많습니다. 인증서와 개인 키가 모두 동일한 파일 또는 문자열로 제공되는 경우 다음과 같이 인증서와 키 옵션을 모두 사용해야 합니다.
client = Mongo::Client.new(["localhost:27017"], ssl: true, ssl_cert: 'path/to/client.pem', ssl_key: 'path/to/client.pem', ssl_ca_cert: 'path/to/ca.crt', )
When using the URI option, the certificate and the key must be stored in a file and both must be stored in the same file. 사용 예시:
client = Mongo::Client.new( "mongodb://localhost:27017/?tls=true&tlsCertificateKeyFile=path%2fto%2fclient.pem&tlsCertificateKeyFile=path%2fto%2fca.crt")
참고
URI 옵션 값은 올바르게 URI 이스케이프 처리해야 합니다. 이는 예를 들어 경로에 슬래시가 적용됩니다.
수정 SSLContext
It may be desirable to further configure TLS options in the driver, for example by enabling or disabling certain ciphers. 현재 Ruby 드라이버는 Mongo::Client
을(를) 초기화할 때 이 작업을 수행하는 방법을 제공하지 않습니다.
그러나 Ruby 드라이버는 글로벌 "TLS 컨텍스트 훅"을 설정하는 방법을 제공하며, 이는 소켓에서 사용하는 사용자 제공 Proc``s that will be invoked before any TLS socket
connection and can be used to modify the underlying ``OpenSSL::SSL::SSLContext
객체입니다.
TLS 컨텍스트 훅을 설정하려면 Proc``s to the ``Mongo.tls_context_hooks
배열을 추가합니다. 이 작업은 Mongo::Client 인스턴스를 만들기 전에 수행해야 합니다. 예를 들어, Rails 애플리케이션에서 이 코드를 이니셜라이저에 배치할 수 있습니다.
Mongo.tls_context_hooks.push( Proc.new { |context| context.ciphers = ["AES256-SHA"] } ) # Only the AES256-SHA cipher will be enabled from this point forward
Mongo.tls_context_hooks
의 모든 Proc
는 OpenSSL::SSL::SSLContext
객체를 유일한 인수로 전달합니다. 이 Proc``s will
be executed sequentially during the creation of every ``Mongo::Socket::SSL
객체.
Mongo.tls_context_hooks=
호출하여 전체 후크 배열을 할당할 수 있지만 이렇게 하면 이전에 할당된 후크가 제거됩니다. 새 후크를 추가하려면 Array#push
또는 Array#unshift
메서드를 사용하는 것이 좋습니다.
애플리케이션의 다른 곳에 Procs에 대한 참고를 저장한 다음 Array#delete_if
을(를) 사용하여 원하는 훅을 제거하여 Mongo.tls_context_hooks
에서 훅을 제거할 수도 있습니다.
경고
TLS 컨텍스트 훅은 전역적이며 Mongo::Client
의 모든 인스턴스에 영향을 줍니다. 애플리케이션에서 이러한 후크를 활성화할 수 있도록 하는 라이브러리는 라이브러리가 로드될 때 후크를 자동으로 활성화하는 대신 후크(애플리케이션에서 호출할 수 있음)를 수정하는 메서드를 노출해야 합니다.
TLS를 위한 MongoDB 서버 구성에 대한 자세한 내용은 MongoDB 매뉴얼에서 확인할 수 있습니다.
중간 인증서 사용
클라이언트 인증서와 서버 인증서 모두에 인증서 체인을 사용할 수 있습니다. 체인을 사용할 때는 신뢰할 수 있는 루트 인증서만 포함하도록 인증 기관 매개 변수를 구성해야 합니다. 중간 인증서(있는 경우)는 리프 서버 및 클라이언트 인증서 뒤에 각각 연결하여 서버 또는 클라이언트 인증서에서 제공해야 합니다.
:ssl_cert
및 :ssl_cert_string
Ruby 옵션과 tlsCertificateKeyFile
URI 옵션은 인증서 체인을 지원합니다. :ssl_cert_object
인스턴스를 사용하는 Ruby 옵션은 OpenSSL::X509::Certificate
인증서 체인을 지원하지 않습니다.
Ruby 드라이버는 엄격한 X.509 인증서 검증을 수행하며, 이 경우 중간 인증서에 다음 두 필드가 모두 설정되어야 합니다.
X509v3 기본 제약 조건: CA: 참 -- 인증서에 서명할 수 있습니다.
X509v3 키 사용법: 키 인증서 서명 -- 인증서 서명 가능
이러한 플래그에 대한 자세한 내용은 이 로 질문에서 확인할 수 Stack Overflow 있습니다. .
tlsCAFile
/ ssl_ca_cert
옵션에 전달된 루트 CA 인증서에 중간 인증서를 연결하는 것은 흔한 일입니다. 이렇게 하면 중간 인증서가 신뢰할 수 있는 상태로 승격되며 실제 CA 루트와 비교하여 자체적으로 확인되지 않습니다. 이 문제에 대한 자세한 내용은 이 메일링 리스트 게시 에서 확인할 수 있습니다. .
CA 인증서 지정
드라이버는 기본적으로 서버의 TLS 인증서 확인을 시도하며, 이 확인이 실패하면 연결을 중단합니다. 기본적으로 드라이버는 기본 시스템 루트 인증서 저장소를 신뢰 앵커로 사용합니다. 서버의 인증서에 서명되는 CA 인증서를 지정하려면 다음을 사용합니다.
:ssl_ca_cert
/:ssl_ca_cert_string
/:ssl_ca_cert_object
Ruby 옵션tlsCAFile
URI 옵션입니다.
이러한 옵션 중 하나라도 제공되면 서버의 인증서는 지정된 CA 인증서에 대해서만 확인되며 기본 시스템 루트 인증서 저장소는 사용되지 않습니다.
서버 TLS 인증서 검증을 수행하지 않으려면(권장되지 않음) ssl_verify: false
Ruby 옵션 또는 tlsInsecure=true
URI 옵션을 지정합니다.
여러 CA 인증서 지정
:ssl_ca_cert
Ruby 옵션 및 tlsCAFile
URI 옵션은 여러 인증서가 포함된 파일에 사용할 수 있습니다. 이렇게 참고된 모든 인증서는 트러스트 앵커가 됩니다.
:ssl_ca_cert_object
옵션은 인증서 배열을 사용하므로 여러 인증서를 인증 기관으로 추가하는 데 사용할 수도 있습니다.
:ssl_ca_cert_string
옵션은 CA 인증서를 하나만 지정하도록 지원합니다.
경고
중간 인증서는 CA 인증서 옵션에 지정된 파일에 제공되어서는 안 됩니다. 이렇게 하면 루트 인증서에 대해 중간 인증서를 확인하는 대신 중간 인증서가 루트 인증서 상태로 승격됩니다.
중간 인증서를 사용해야 하는 경우 클라이언트 또는 서버 TLS 인증서 파일의 일부로 지정합니다.
OCSP 검증
서버에서 제공한 인증서에 OCSP 엔드포인트 URI가 포함된 경우 드라이버는 지정된 엔드포인트에 OCSP 요청을 발행하여 인증서의 유효성을 확인합니다.
클라이언트를 생성할 때 :ssl_verify_ocsp_endpoint
Ruby 옵션을 false
로 설정하거나 tlsDisableOCSPEndpointCheck
URI 옵션을 true
로 설정하여 OCSP 엔드포인트 검사를 비활성화할 수 있습니다.
참고
JRuby에서 실행할 때는 현재 OCSP 엔드포인트 URI가 올바르게 노출되지 않기 때문에 OCSP 엔드포인트 검사가 수행되지 않습니다.
IPv4/IPv6 연결
클라이언트가 호스트 이름으로 localhost
를 사용하여 구성되면 IPv4 연결만 시도합니다(즉, localhost
가 127.0.0.1
로 해석되고 ::1
인 경우 드라이버는 127.0.0.1
에만 연결을 시도합니다).
클라이언트가 localhost
이외의 호스트 이름으로 구성되면 호스트 이름이 확인되는 주소에 따라 IPv4 및 IPv6 연결을 모두 시도합니다. 드라이버는 getaddrinfo
가 주소를 반환하는 순서를 따르며 순차적으로 연결을 시도합니다. 처음으로 성공한 연결이 사용됩니다.
드라이버는 현재 '해피 안구' 알고리즘을 구현하지 않습니다.
TCP 킵얼라이브 구성
시스템 구성 및 Ruby 언어 런타임에서 허용하는 경우 드라이버는 TCP 킵얼라이브를 활성화하고, 시스템 값을 확인할 수 있고 다음보다 높은 경우 아래 나열된 각 킵얼라이브 매개변수에 대해 해당 매개변수의 값을 지정된 값으로 설정합니다. 나열된 드라이버 값:
tcp_keepalive_time
: 120초tcp_keepalive_intvl
: 10초tcp_keepalive_cnt
: 프로브 9개
참고
JRuby 9.2.14.0부터, JRuby는 킵얼라이브 매개변수를 설정하는 데 필요한 API를 구현하지 않습니다. JRuby를 사용하는 경우 드라이버는 킵얼라이브 매개변수를 설정할 수 없으며 시스템 구성이 적용됩니다.
더 낮은 값을 사용하거나 필수 API를 노출하지 않는 JRuby와 같은 환경에서 매개변수를 변경하려면 MongoDB 진단 FAQ 킵얼라이브 섹션 에 설명된 대로 시스템 수준에서 매개변수를 조정하세요. .
연결 풀링
Mongo::Client
인스턴스에는 클라이언트가 연결되는 서버당 연결 풀이 있습니다. 풀은 애플리케이션에서 실행되는 동시 MongoDB 작업을 지원하기 위해 온디맨드 연결을 생성합니다. 연결에 대한 스레드 선호도는 없습니다.
클라이언트 인스턴스는 서버 상태를 모니터링하기 위해 알려진 서버당 하나의 추가 연결을 엽니다.
각 연결 풀의 크기는 max_pool_size
이며 기본값은 5입니다. 애플리케이션의 스레드가 MongoDB에서 작업을 시작하면 풀에서 해당 작업을 전송할 연결을 검색하려고 시도합니다. 풀에서 사용 가능한 연결이 있는 경우 풀에서 연결을 확인하고 이를 작업에 사용합니다. 사용할 수 있는 연결이 없고 풀 크기가 max_pool_size
보다 작은 경우 새 연결이 생성됩니다. 모든 연결이 사용 중이고 풀이 최대 크기에 도달한 경우 스레드는 다른 스레드가 연결을 풀에 반환할 때까지 대기합니다. max_pool_size
을(를) 0으로 설정하면 풀의 최대 연결 수에 제한이 없습니다.
각 풀에는 서버에 동시에 연결할 수 있는 연결 수에 제한이 있습니다. 이 제한은 max_connecting
이며 기본값은 2개로 설정되어 있습니다. 현재 서버에 연결 중인 연결 수가 이 제한에 도달하면 풀은 연결 시도가 성공 또는 실패할 때까지 기다렸다가 새 연결을 만들기 시도합니다. 애플리케이션에 스레드 수가 많은 경우 max_connecting
를 늘려서 스레드가 연결이 설정될 때까지 대기하지 않도록 할 수 있습니다.
연결이 사용 가능해질 때까지 스레드가 기다리는 시간(초)은 구성할 수 있습니다. wait_queue_timeout
이라고 하는 이 설정은 초 단위로 정의됩니다. 이 시간 제한에 도달하면 Timeout::Error
가 발생합니다. 기본값은 1초입니다.
드라이버 버전 2.11부터 드라이버는 min_pool_size
설정까지 적극적으로 연결을 생성합니다. 드라이버 버전 2.11 이전에는 드라이버가 항상 온디맨드 방식으로 연결을 생성했습니다. 모든 버전의 드라이버에서 연결이 설정되면 풀 크기가 min_pool_size
을 초과하지 않는 한 드라이버에 의해 풀에 유지됩니다.
Note that, if min_pool_size
is set to a value greater than zero, the driver will establish that many connections to secondaries in replica set deployments even if the application does not perform secondary reads. 이러한 연결의 목적은 프라이머리가 변경될 때 더 빠른 페일오버를 제공하는 것입니다.
다음은 멀티스레드 애플리케이션이 열 수 있는 연결 수를 추정하는 예입니다. 3노드 복제본 세트에 연결된 클라이언트가 3개의 모니터링 소켓을 엽니다. 또한 각 서버에서 멀티스레드 애플리케이션의 동시 작업을 지원하는 데 필요한 만큼의 소켓을 최대 max_pool_size
개까지 엽니다. 애플리케이션이 기본(기본값)만 사용하는 경우 기본 연결 풀만 증가하고 총 연결은 최대 8개(기본 풀 연결 5개 + 모니터링 연결 3개)가 됩니다. 애플리케이션이 읽기 설정 (read preference)을 사용하여 세컨더리를 쿼리하는 경우 해당 풀도 커져서 총 연결 수가 18개(5 + 5 + 5 + 3)에 도달할 수 있습니다.
Mongo::Client
의 기본 구성은 대부분의 애플리케이션에서 작동합니다.
client = Mongo::Client.new(["localhost:27017"])
이 클라이언트를 각 프로세스에 대해 한 번씩 생성하고 모든 작업에 재사용합니다. 각 요청에 대해 새 클라이언트를 생성하는 것은 흔한 실수이며, 이는 매우 비효율적이며 클라이언트의 설계 목적이 아닙니다.
한 프로세스 내에서 매우 많은 수의 동시 MongoDB 작업을 지원하려면 max_pool_size
을 늘립니다.
client = Mongo::Client.new(["localhost:27017"], max_pool_size: 200)
하나의 프로세스 내에서 동일한 클라이언트를 공유하는 매우 많은 수의 스레드를 지원하려면 max_connecting
을 늘립니다.
client = Mongo::Client.new(["localhost:27017"], max_pool_size: 200, max_connecting: 10)
원하는 수의 스레드가 연결이 가능해질 때까지 기다릴 수 있으며, 기본값(1초) 또는 wait_queue_timeout
설정을 기다릴 수 있습니다.
client = Mongo::Client.new(["localhost:27017"], wait_queue_timeout: 0.5)
스레드가 클라이언트에서 #close
를 호출하면 모든 연결이 닫힙니다.
client.close
위에서 설명한 차단 구문 을 사용하여 클라이언트를 생성하는 경우 차단 실행이 완료된 후 클라이언트가 자동으로 닫힙니다.
포크 서버와 함께 사용
참고
Mongoid를 사용하는 애플리케이션은 Mongoid의 "사용법(Usage with Forking Servers)" 문서를 따라야 합니다. 아래 지침은 Ruby 드라이버를 직접 사용하는 애플리케이션에 제공됩니다.
Puma와 같은 포크 웹 서버가 있는 웹 애플리케이션에서 mongo Ruby 드라이버를 사용하거나 애플리케이션이 다른 방식으로 포크하는 경우 각 프로세스(상위 및 하위 프로세스)에는 자체 클라이언트 연결이 있어야 합니다. 그 이유는 다음과 같습니다.
Ruby MongoDB 드라이버에서 연결 상태를 모니터링하는 데 사용하는 것과 같은 백그라운드 Ruby 스레드는 하위 프로세스로 전송 되지 않습니다 .
네트워크 소켓 과 같은 파일 디스크립터는 상위 프로세스와 하위 프로세스 간에 공유되므로 I/O 충돌이 발생할 수 있습니다.
(1)와 관련하여 포크 후 하위 프로세스 에서 드라이버의 모니터링 스레드를 다시 시작하지 않으면 하위 항목이 처음에는 올바르게 작동하는 것처럼 보일 수 있지만 MongoDB cluster 상태 가 변경되면 Mongo::Error::NoServerAvailable
예외가 발생합니다. 예를 예시 네트워크 오류 또는 유지 관리 이벤트 로 인해 발생합니다.
(2)와 관련하여 하위 프로세스가 상위 프로세스의 파일 설명자를 재사용하면 Errno::EPIPE: Broken pipe
및 EOFError: end of file reached
과 같은 메시지와 함께 Mongo::Error::SocketError
오류가 표시됩니다.
웹 애플리케이션 에서 Ruby 운전자 를 사용하는 경우, 가능하면 (워커가 포크되기 전에) 상위 프로세스 에 Mongo::Client
인스턴스를 생성하지 않고, 대신 워커에 클라이언트 인스턴스만 생성하는 것이 좋습니다.
프로세스 포크 수동 처리
Puma의 fork_Worker 옵션 과 같은 특정 고급 사용 사례 인스턴스가 상위 Mongo::Client
프로세스와 하위 프로세스 모두에서 열려 있어야 합니다. 이 경우 클라이언트 재연결을 수동으로 처리하다 해야 합니다.
이렇게 하려면 포크하기 직전에 상위 프로세스 에서 기존 클라이언트 연결을 모두 닫습니다. 이렇게 하면 하위 프로세스가 상위 프로세스의 파일 설명자를 재사용하여 상위 프로세스 에 네트워크 및 모니터링 오류가 발생하는 것을 방지할 수 있습니다.
# Immediately before fork client.close
참고
Client#close
을(를) 호출해도 현재 진행 중인 데이터베이스 작업은 중단되지 않습니다. 새 작업을 수행하면 클라이언트가 자동으로 다시 연결됩니다.
그런 다음 포크 직후 새로 포크된 하위 프로세스에서 클라이언트를 다시 연결하면 드라이버의 모니터링 스레드가 다시 생성됩니다.
# Immediately after fork client.reconnect
대부분의 웹 서버는 작업자 프로세스가 포크될 때 애플리케이션에서 작업을 수행하는 데 사용할 수 있는 후크를 제공합니다. 권장되는 후크는 다음과 같습니다.
Puma
before_fork
on_refork
의 경우 및 를 사용하여 상위 프로세스에서 클라이언트를 닫고 를 사용하여 하위 프로세스에서on_worker_boot
다시 연결합니다.유니콘 의
before_fork
경우 , 를 사용하여 상위 프로세스의 클라이언트를 닫고after_fork
를 사용하여 하위 프로세스의 클라이언트를 다시 연결합니다.여객용,
starting_worker_process
를 사용하여 하위 프로세스의 클라이언트를 다시 연결합니다(Passenger에는 사전 포크 훅이 없는 것으로 보입니다).
추가 예제는 Mongoid의 "포킹 서버와 함께 사용" 문서 를 참조하세요.
문제 해결
클라이언트의 summary
메서드는 클라이언트가 모니터링 중인 서버를 포함한 클라이언트의 현재 상태와 해당 상태를 반환합니다. 모니터링되지 않는 서버가 있으면 NO-MONITORING
플래그로 표시됩니다.
정상적으로 작동하는 클라이언트는 다음과 유사한 요약을 생성합니다.
client.summary => "#<Client cluster=#<Cluster topology=ReplicaSetWithPrimary[localhost:14420,localhost:14421,localhost:14422,localhost:14423,name=ruby-driver-rs,v=1,e=7fffffff000000000000001f] servers=[#<Server address=localhost:14420 PRIMARY replica_set=ruby-driver-rs pool=#<ConnectionPool size=0 (0-5) used=0 avail=0 pending=0>>, #<Server address=localhost:14421 SECONDARY replica_set=ruby-driver-rs pool=#<ConnectionPool size=0 (0-5) used=0 avail=0 pending=0>>, #<Server address=localhost:14422 SECONDARY replica_set=ruby-driver-rs pool=#<ConnectionPool size=0 (0-5) used=0 avail=0 pending=0>>, #<Server address=localhost:14423 ARBITER replica_set=ruby-driver-rs>]>>"
백그라운드 스레드가 누락된 클라이언트는 다음과 유사한 요약을 생성합니다.
client.summary => "#<Client cluster=#<Cluster topology=ReplicaSetWithPrimary[localhost:14420,localhost:14421,localhost:14422,localhost:14423,name=ruby-driver-rs,v=1,e=7fffffff000000000000001f] servers=[#<Server address=localhost:14420 PRIMARY replica_set=ruby-driver-rs NO-MONITORING pool=#<ConnectionPool size=0 (0-5) used=0 avail=0 pending=0>>, #<Server address=localhost:14421 SECONDARY replica_set=ruby-driver-rs NO-MONITORING pool=#<ConnectionPool size=0 (0-5) used=0 avail=0 pending=0>>, #<Server address=localhost:14422 SECONDARY replica_set=ruby-driver-rs NO-MONITORING pool=#<ConnectionPool size=0 (0-5) used=0 avail=0 pending=0>>, #<Server address=localhost:14423 ARBITER replica_set=ruby-driver-rs>]>>"
재시도 가능한 읽기
드라이버는 읽기 재시도를 위해 모던 메커니즘과 레거시 메커니즘, 이렇게 두 가지 메커니즘을 구현합니다. 드라이버 버전 2.9.0부터는 기본적으로 최신 메커니즘이 사용되며 레거시 메커니즘은 더 이상 사용되지 않습니다.
최신 재시도 가능 읽기
최신 메커니즘을 사용하면 네트워크 오류, '마스터가 아님' 오류 또는 '노드를 복구하는 중' 오류가 발생하면 읽기 작업이 한 번 재시도됩니다. 다음 작업에 대해 설명합니다.
Collection#find 및 관련 메서드
변경 스트림 헬퍼: Collection#watch, Database#watch, Client#watch
열거 명령: Client#list_mongo_databases, Client#list_databases, Client#database_names, Database#collection_names, Database#collections, Database#list_collections, Collection#indexes
작업이 커서를 반환하면 초기 읽기 명령만 재시도할 수 있습니다. 드라이버 버전 2.9.0 이상에서는 커서에 대한 getMore
작업이 다시 시도되지 않습니다. 또한 읽기 작업을 다시 시도하면 작업을 위한 새 서버가 선택됩니다. 이로 인해 첫 번째 읽기를 수신한 서버가 아닌 다른 서버로 재시도가 전송될 수 있습니다.
최신 재시도 가능 읽기의 동작은 재시도 가능 읽기 사양 에서 자세히 설명합니다. .
최신 재시도 가능 읽기는 MongoDB 3.6 이상 서버에서만 사용할 수 있습니다. MongoDB 3.4 이하 서버와 함께 사용하는 경우 Ruby 드라이버 버전 2.9.0 이상에서는 기본적으로 읽기를 재시도하지 않습니다. 애플리케이션은 retry_reads: false
클라이언트 옵션을 설정하거나 retryReads=false
URI 옵션을 사용하여 레거시 재시도 가능 읽기를 명시적으로 요청해야 합니다.
레거시 재시도 가능 읽기
Ruby 드라이버의 레거시 읽기 재시도 동작은 retry_reads: false
클라이언트 옵션을 설정하거나 retryReads=false
URI 옵션을 클라이언트에 전달하여 사용할 수 있습니다.
레거시 읽기 재시도 동작을 사용하는 경우 max_read_retries
클라이언트 옵션을 지정하여 재시도 횟수를 설정할 수 있습니다. 드라이버 버전 2.9.0 이상을 사용할 때 레거시 재시도 가능 읽기로 재시도할 수 있는 작업 세트는 최신 재시도 가능 읽기에 대해 위에서 설명한 작업 세트와 동일합니다. 이전 드라이버 버전에서는 재시도 가능한 레거시 쓰기의 동작이 일부 작업이 재시도되지 않았다는 점에서 다릅니다.
드라이버 버전 2.9.0부터 레거시 읽기 재시도는 최신 재시도 가능 쓰기와 마찬가지로 작업을 재시도하기 전에 서버 선택을 수행합니다. In older driver versions read retries would be sent to the same server which the initial read was sent to.
재시도 가능 읽기 비활성화
모든 읽기 재시도를 비활성화하려면 다음 클라이언트 옵션을 설정합니다: retry_reads: false, max_read_retries: 0
.
재시도 가능한 쓰기
드라이버는 쓰기 재시도를 위해 모던 메커니즘과 레거시 메커니즘, 이렇게 두 가지 메커니즘을 구현합니다. 드라이버 버전 2.9.0부터 최신 메커니즘은 이를 지원하는 서버에서 기본적으로 사용되며 레거시 메커니즘은 더 이상 사용되지 않으며 모든 서버 버전에서 기본적으로 비활성화됩니다.
컬렉션에 대한 일상적인 작업에 사용되는 다음 쓰기 메서드는 쓰기 재시도의 대상이 됩니다.
collection#insert_one
collection#update_one
collection#delete_one
collection#replace_one
collection#find_one_and_update
collection#find_one_and_replace
collection#find_one_and_delete
collection#bulk_write
(모든 단일 문 ops, 즉update_many
또는delete_many
가 아님)
최신 재시도 가능 쓰기
최신 메커니즘은 드라이버가 MongoDB 3.6 이상의 복제본 세트 또는 cluster에 연결되어 있을 때 실패한 쓰기를 한 번 재시도하는데, 이는 서버의 oplog가 필요하기 때문입니다. 최신 메커니즘은 드라이버가 독립형 MongoDB Server 또는 서버 버전 3.4 이상에 연결되어 있을 때 쓰기를 재시도하지 않습니다.
다음 오류가 발생하면 쓰기가 다시 시도됩니다.
시간 초과를 포함한 네트워크 오류
'마스터가 아님' 오류
"노드를 복구하는 중" 오류
원래 쓰기가 전송된 서버를 더 이상 사용할 수 없을 가능성이 높으므로 쓰기를 재시도하기 전에 드라이버는 서버 선택을 수행합니다.
레거시 재시도 가능 쓰기
클라이언트 옵션 retry_writes: false
을 설정하거나 retryWrites=false
URI 옵션을 사용하여 최신 재시도 가능 쓰기 메커니즘이 비활성화된 경우 드라이버는 레거시 재시도 가능 쓰기 메커니즘을 활용합니다. 레거시 메커니즘은 최신 메커니즘과 동일한 작업에서 쓰기를 다시 시도합니다. 기본적으로 레거시 메커니즘은 최신 메커니즘과 마찬가지로 한 번 재시도합니다. 재시도 횟수를 변경하려면 :max_write_retries
클라이언트 옵션을 설정합니다.
레거시 재시도 메커니즘과 최신 재시도 메커니즘의 차이점은 레거시 메커니즘은 최신 메커니즘과 다른 오류 세트에 대해 쓰기를 재시도한다는 점이며, 특히 네트워크 시간 초과 발생 시 쓰기를 재시도하지 않습니다.
재시도 가능 쓰기 비활성화
모든 쓰기 재시도를 비활성화하려면 다음 클라이언트 옵션을 설정합니다: retry_writes: false, max_write_retries: 0
.
로깅
기본 전역 드라이버 로거를 사용하거나 직접 설정할 수 있습니다. 직접 설정하려면 다음을 수행합니다.
Mongo::Logger.logger = other_logger
Ruby Logger 문서 참조 기본값 로거 API 및 사용 가능한 수준에 대한 자세한 내용은 를 참조하세요.
로거 수준 변경
로거 수준을 변경하려면 다음을 수행합니다.
Mongo::Logger.logger.level = Logger::WARN
더 많은 제어를 위해, 로깅을 클라이언트별로 제어하기 위해 클라이언트에 로거를 전달할 수 있습니다.
my_logger = Logger.new(STDOUT) Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test', :logger => my_logger )
잘라내기
기본 로깅은 기본적으로 250자에서 로그를 자릅니다. 이 기능을 끄려면 클라이언트 인스턴스에 옵션을 전달합니다.
Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test', :truncate_logs => false )
압축
유선 프로토콜 압축을 사용하려면 :compressors
Ruby 옵션 또는 compressors
URI 옵션을 사용하여 하나 이상의 압축기를 명시적으로 요청해야 합니다. 압축기가 명시적으로 요청되지 않은 경우, 시스템에 하나 이상의 압축기에 필요한 종속성이 있더라도 드라이버는 압축을 사용하지 않습니다.
드라이버는 요청된 압축기 중 서버에서도 지원하는 첫 번째 압축기를 선택합니다. 드라이버는 현재 zstd
, snappy
및 zlib
압축기를 지원합니다. zstd
압축기는 다른 압축기에 비해 동일한 CPU 소비량으로 가장 높은 압축률을 생성하므로 권장됩니다. For maximum server compatibility all three compressors can be specified, e.g. as compressors: ["zstd", "snappy", "zlib"]
.
zstd
압축기에는 zstd-ruby 가 필요합니다. 라이브러리를 설치합니다. snappy
압축기에는 스내피 가 필요합니다. 라이브러리를 설치합니다. zstd
또는 snappy
압축이 요청되고 해당 라이브러리를 로드할 수 없는 경우 드라이버는 Mongo::Client
생성 중에 오류를 발생시킵니다. zlib
압축을 사용하려면 zlib
표준 라이브러리 확장이 있어야 합니다.
다양한 압축기에 대한 서버 지원은 다음과 같습니다:
zstd
는 필요하며 MongoDB 4.2 이상에서 기본적으로 활성화됩니다.snappy
에는 MongoDB 3.4 이상이 필요하며 MongoDB 3.6 이상에서 기본적으로 활성화됩니다.zlib
에는 MongoDB 3.6 이상이 필요하며 MongoDB 4.2 이상에서 기본적으로 활성화됩니다.
서버 API 매개변수
MongoDB 5.0부터 애플리케이션은 서버가 특정 서버 API 버전에 따라 동작하도록 요청할 수 있습니다.
서버 API 매개변수는 Client
에 대한 :server_api
옵션을 통해 지정할 수 있습니다. 이러한 매개변수는 URI를 통해 제공할 수 없습니다.
현재 유일하게 정의된 API 버전은 "1"
입니다. 다음과 같이 요청할 수 있습니다:
client = Mongo::Client.new(['localhost'], server_api: {version: "1"})
MongoDB Server는 API 버전을 문자열 값으로 정의합니다. 편의상 API 버전이 정수로 제공되는 경우 Ruby 드라이버는 이를 문자열화하여 서버에 문자열로 전송합니다.
client = Mongo::Client.new(['localhost'], server_api: {version: 1})
서버가 문자열화된 정수가 아닌 API 버전을 정의할 수 있습니다. 애플리케이션은 모든 합법적인 API 버전이 정수로 표현될 수 있다고 가정해서는 안 됩니다.
특정 API 버전이 요청되면 해당 API 버전의 일부인 작업은 해당 API 버전에 지정된 대로 작동합니다. 지정된 API 버전에 포함되지 않은 작업은 API 버전이 전혀 지정되지 않은 경우와 같이 작동합니다. 동작이 구성된 API 버전에 따라 달라지는 작업은 명령 인수, 쿼리, 집계 파이프라인 단계 및 인수를 포함한 명령입니다.
애플리케이션은 :strict
옵션을 설정하여 서버가 지정된 API 버전의 일부가 아닌 모든 작업을 거부하도록 요청할 수 있습니다.
client = Mongo::Client.new(['localhost'], server_api: {version: "1", strict: true})
예를 들어 :tailable
옵션은 서버 API 버전 1의 일부가 아니므로 다음 쿼리는 실패합니다.
client = Mongo::Client.new(['localhost'], server_api: {version: "1", strict: true}) client['collection'].find({}, tailable: true) # => Mongo::Error::OperationFailure (BSON field 'FindCommand.tailable' is not allowed with apiStrict:true. (323) (on localhost:27017, modern retry, attempt 1))
애플리케이션은 :deprecation_errors
옵션을 설정하여 지정된 API 버전에서 더 이상 사용되지 않는 모든 작업을 서버에 거부하도록 요청할 수 있습니다.
client = Mongo::Client.new(['localhost'], server_api: {version: "1", deprecation_errors: true})
이 문서를 작성하는 현재 시점에서는 API 버전 "1"
에서 더 이상 사용되지 않는 작업이 없습니다.
서버 API 매개변수가 Client
객체에 정의된 경우 클라이언트는 각 [1] 작업의 일부로 해당 매개변수를 전송합니다.
[1] | getMore 명령과 트랜잭션의 명령은 API 매개변수를 허용하지 않으므로 드라이버는 이러한 경우 API 매개변수를 전송하지 않습니다. |
5.0 이전의 MongoDB 서버는 API 매개변수를 인식하지 못하므로 애플리케이션이 API 매개변수를 구성하면 다양한 오류가 발생합니다. Ruby 드라이버는 모든 MongoDB 3.6 이상 서버에 API 매개변수를 전송하지만, API 매개변수는 애플리케이션이 MongoDB 5.0 이상 서버와 통신할 때만 구성해야 합니다. API 매개변수는 레거시 유선 프로토콜을 사용하는 MongoDB 3.4 및 이전 서버로 전송될 수 없습니다. 애플리케이션이 API 매개변수를 구성하고 MongoDB 3.4 또는 이전 서버에 연결하는 경우 드라이버는 모든 작업에서 오류를 생성합니다.
명령 헬퍼 를 사용하면 애플리케이션이 수동으로 구성된 명령을 서버에 보낼 수 있습니다. 클라이언트가 서버 API 매개변수로 구성되지 않은 경우 명령 헬퍼를 사용하여 API 매개변수가 포함된 명령을 실행할 수 있습니다.
client.database.command( ping: 1, apiVersion: "1", apiStrict: false, apiDeprecationErrors: false, )
클라이언트가 서버 API 매개변수로 구성된 경우, 명령 헬퍼를 사용하여 서버 API 매개변수로 명령을 실행할 수 없을 수 있습니다. 클라이언트와 명령어 헬퍼에 제공되는 서버 API 매개변수가 동일한 경우가 포함됩니다. 서버 API 매개변수를 사용하여 클라이언트를 구성한 경우 다른 API 매개변수를 전송하거나 전혀 전송하지 않으려면 처음부터 또는 with
메서드를 사용하여 새 클라이언트를 구성해야 합니다.
서버 API 매개변수는 클라이언트 수준에서만 지정할 수 있습니다. 데이터베이스, collection, 세션, 트랜잭션 또는 개별 작업 수준에서는 지정할 수 없습니다.
개발 구성
드라이버의 기본 구성은 프로덕션 배포에 적합합니다. 개발 중에는 더 나은 개발자 환경을 제공하기 위해 일부 설정을 조정할 수 있습니다.
:server_selection_timeout
: MongoDB 서버가 로컬에서 실행 중이고 수동으로 시작하는 경우 이 값을 낮게(예:1
) 설정합니다. 서버 선택 시간 초과 값이 낮으면 실행 중인 서버가 없을 때 드라이버가 빠르게 실패하게 됩니다.
프로덕션 구성
프로덕션 환경에서 Ruby 드라이버를 사용하여 애플리케이션을 배포할 때는 다음 사항을 고려하세요.
드라이버 버전 2.11부터
:min_pool_size
클라이언트 옵션이 완전히 적용됩니다 - 드라이버는 독립형, 기본 또는 보조 서버로 식별된 각 서버에 대해 그만큼의 연결을 생성합니다. 이전 드라이버 버전에서는 드라이버가 온디맨드 방식으로 연결을 생성했습니다.:min_pool_size
를 사용하는 애플리케이션의 드라이버 버전 2.11부터 모든 서버, 특히 복제본 세트 배포의 세컨더리 및 샤드 cluster의 노드에 대한 유휴 연결 수가 증가합니다.애플리케이션이 다른 웹 서버 또는 로드 밸런서에 의해 역방향 프록시되는 경우
server_selection_timeout
는 일반적으로 역방향 프록시의 읽기 제한 시간보다 낮은 값으로 설정해야 합니다. 예를 들어Herku 요청 시간 30 초과 입니다. 초이며 구성할 수 없습니다. MongoDB를 사용하여 Ruby 애플리케이션을 Herku에 배포하는 경우 서버 선택 시간 제한을 20 또는 15 초로 낮추는 것이 좋습니다.
기능 플래그
다음은 Mongo Ruby 드라이버가 제공하는 기능 플래그 목록입니다.
플래그 | 설명 |
---|---|
| 이 플래그를 끄면 뷰에서 수행된 애그리게이션은 collection의 모든 문서 대신 해당 뷰에 포함된 문서에 대해 실행됩니다. 이 플래그가 켜져 있으면 뷰 필터가 무시되고 뷰 컬렉션에 있는 모든 문서에 애그리게이션이 적용됩니다. (기본값: true) |
| 이 플래그를 끄면 보기 옵션이 |
| 대체 문서의 루트에 원자 연산자($로 시작하는 연산자)가 없고 업데이트 문서의 루트에 원자 연산자만 있는지 확인합니다. 이 기능 플래그가 켜져 있으면 잘못된 업데이트 또는 교체 문서에 오류가 발생하고, 그렇지 않으면 로그에 경고가 출력됩니다. (기본값: false) |
이러한 기능 플래그는 Mongo
모듈에서 직접 설정하거나 options
메서드를 사용하여 설정할 수 있습니다.
Mongo.validate_update_replace = true Mongo.options = { validate_update_replace: true }