Docs Menu
Docs Home
/ / /
Ruby MongoDB Driver
/

클라이언트 생성

이 페이지의 내용

  • 사용 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 매개변수
  • 개발 구성
  • 프로덕션 구성
  • 기능 플래그

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에는 명시된 목적으로만 사용해야 하는 다른 특수 데이터베이스가 있습니다.

  • 구성 데이터베이스입니다.

  • 로컬 데이터베이스.

  • $external 데이터베이스 PLAIN, KerberosX.509 인증 메커니즘과 함께 사용됩니다.

드라이버는 기본적으로 연결하라는 지시를 받은 배포 유형을 검색하고(부하 분산된 배포 제외), 배포 유형과 일치하는 방식으로 작동합니다. 아래 하위 섹션에서는 각 배포 유형에서 드라이버가 작동하는 방식과 자동 배포 유형 감지를 우회하여 특정 동작을 강제로 수행하는 방법에 대해 설명합니다.

배포 유형 검색은 드라이버가 연결하라는 지시를 받은 서버 중 하나로부터 첫 번째 회신을 받을 때 이루어집니다(부하 균형 조정 모드가 요청되지 않은 경우 아래 참조). 드라이버는 기본 배포가 다른 유형 중 하나로 교체되더라도 검색되거나 구성된 토폴로지에 남아 있습니다. 특히, 복제본 세트를 동일한 주소에 있는 샤드 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 노트 를 검토하세요.

샤딩된 클러스터 배포서버 서버에 연결하려면 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")

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 Lambda에서 Atlas에 연결하는 방법을 알아보려면 AWS Lambda로 연결 관리 문서를 참조하세요.

드라이버가 mongodb+srv 프로토콜 URI에 연결할 때는 다음 사항에 유의하세요.

  1. SRV URI 조회는 클라이언트가 구성될 때 동시에 수행됩니다. 어떤 이유로든 이 조회가 실패하면 예외와 함께 클라이언트 생성이 실패합니다. 클라이언트가 호스트 목록으로 구성되면 드라이버는 클라이언트 객체가 존재하는 동안 해당 호스트에 연결하고 모니터링을 시도합니다. 이러한 호스트 중 하나가 처음에는 확인되지 않았다가 나중에 확인할 수 있게 되는 경우, 드라이버는 해당 호스트가 사용 가능해지면 해당 호스트에 연결할 수 있습니다. 초기 SRV URI 조회는 첫 번째 시도에서 성공해야 합니다. 이후 호스트 조회는 필요에 따라 드라이버가 다시 시도합니다.

  2. 드라이버는 SRV 레코드에 해당하는 DNS TXT 레코드에서 URI 옵션을 조회합니다. 이러한 옵션은 URI에 지정된 URI 옵션과 Ruby 옵션으로 이 순서대로 재정의할 수 있습니다.

  3. URI 옵션은 SRV 조회와 별도의 DNS 쿼리에서 검색되기 때문에, 네트워크 연결이 안정적이지 않은 환경에서는 SRV 조회가 성공하더라도 URI 옵션 쿼리가 실패할 수 있습니다. 이러한 실패로 인해 드라이버가 잘못된 인증 소스를 사용하여 인증에 실패할 수 있습니다. 이 문제는 인증 소스를 명시적으로 지정하여 해결할 수 있습니다.

    Mongo::Client.new("mongodb+srv://username:myRealPassword@cluster0.mongodb.net/test?w=majority&authSource=admin")
  4. 구성된 Client 객체의 토폴로지를 알 수 없거나 샤딩된 cluster인 경우 드라이버는 지정된 SRV DNS 레코드의 변경 사항을 모니터링하기 시작하고 cluster의 서버 목록을 자동으로 업데이트합니다. 토폴로지가 단일 또는 복제본 세트가 되면 업데이트가 중지됩니다.

Mongo::Client의 생성자는 드라이버의 동작을 구성하는 여러 옵션을 허용합니다. 옵션은 옵션 해시에서 Ruby 옵션으로, URI에서 URI 옵션으로 또는 둘 다 제공될 수 있습니다. Ruby 옵션과 유사한 URI 옵션이 모두 제공되는 경우, Ruby 옵션이 우선합니다.

참고

직접 전달되는 옵션은 기호여야 합니다.

참고

별도로 지정하지 않는 한 시간을 처리하는 Ruby 옵션은 초 단위로 표시됩니다.

옵션
설명
유형
기본값

:app_name

3.4 이상 서버 버전에서 연결 설정 시 mongod 로그에 출력되는 애플리케이션 이름입니다.

String

none

:auth_mech

사용할 인증 메커니즘을 지정합니다. :gssapi, :mongodb_cr, :mongodb_x509, :plain, :scram, :scram256 중 하나일 수 있습니다. GSSAPI(Kerberos) 인증 에는 추가 종속성이 필요합니다.

Symbol

사용자 자격 증명이 제공되지 않으면 nil 가 발생합니다. 사용자 자격 증명이 제공되는 경우 기본값은 서버 버전에 따라 달라집니다. MongoDB 4.0 이상: 사용자 자격 증명이 SCRAM-SHA-256 인증을 지원하는 사용자와 일치하면 :scram256 , 그렇지 않으면 :scram 입니다. MongoDB 3.0-3.6: :scram. MongoDB 2.6: :mongodb_cr

:auth_mech_properties

추가 인증 메커니즘 속성을 제공합니다.

속성의 키는 대소문자를 구분하지 않고 해석됩니다. 클라이언트가 생성될 때 키는 소문자로 표시됩니다.

Hash

GSSAPI 인증 메커니즘을 사용할 때 기본 속성은 {service_name: "mongodb"} 입니다. 그렇지 않으면 기본값은 nil입니다.

:auth_source

인증 소스를 지정합니다.

String

MongoDB 2.6 이상: 자격 증명이 제공되면 admin , 그렇지 않으면 현재 데이터베이스

:auto_encryption_options

자동 암호화를 구성하기 위한 Hash 옵션입니다.

  • :key_vault_client - 암호화 데이터 키(Mongo::Client, 기본값은 최상위 클라이언트 인스턴스)를 저장하는 MongoDB 인스턴스에 연결된 클라이언트입니다.

  • :key_vault_namespace - "database.collection" (String, 필수) 형식의 키 볼트 컬렉션 네임스페이스입니다.

  • :kms_providers - 키 관리 서비스 구성 정보입니다. 키 :local:aws 중 하나 또는 둘 다를 지정해야 합니다(Hash 필수). 이 옵션에 대한 자세한 내용은 클라이언트 사이드 암호화 튜토리얼 의 ' kms_providers 옵션' 섹션을 참조하세요.

  • :schema_map - 암호화해야 하는 필드를 지정하는 하나 이상의 collection에 대한 JSONSchema(Hash, 선택 사항, 기본값은 nil)입니다.

  • :bypass_auto_encryption - 데이터베이스 작업을 수행할 때 자동 암호화를 건너뛸지 여부를 지정합니다(Boolean, 기본값은 false).

  • :extra_options - mongocryptd 생성과 관련된 옵션(Hash, 선택 사항, 기본값은 nil)입니다.

이러한 옵션의 서식을 지정하는 방법에 대한 자세한 내용은 클라이언트 사이드 암호화 튜토리얼의 "자동 암호화 옵션" 섹션을 참조하세요.

Hash

none

:bg_error_backtrace

실험적입니다. 백그라운드 스레드에서 오류가 발생할 때 역추적을 기록할지 여부와 기록하는 방법을 제어합니다. true 인 경우 드라이버는 전체 역추적을 기록합니다. 양의 정수로 설정하면 드라이버는 그 만큼의 역추적 라인에 기록합니다. false 또는 nil 로 설정하면 역추적이 기록되지 않습니다. 다른 값은 오류입니다.

true, false, nil, Integer

none

:compressors

사용할 수 있는 잠재적 압축기 목록을 선호도 순으로 정렬합니다. 드라이버가 압축을 구현하는 방법에 대한 자세한 내용은 아래를 참조하세요.

Array<String>

none

:connect

더 이상 사용되지 않습니다. 드라이버에서 일반적으로 수행하는 배포 토폴로지 검색을 비활성화하고 cluster 토폴로지를 특정 유형으로 강제 설정합니다. 유효한 값은 :direct, :load_balanced, :replica_set 또는 :sharded 입니다. :load_balanced 를 사용하면 클라이언트는 연결하는 서버가 자신을 로드 밸런서로 알릴지 여부에 관계없이 로드 밸런서에 연결된 것처럼 동작합니다.

Symbol

none

:connect_timeout

예외가 발생하기 전에 소켓 연결을 설정하기 위해 대기하는 시간(초)입니다. 이 시간 제한은 SRV DNS 레코드 확인에도 사용됩니다. nil0 은 시간 초과가 없음을 MEAN. 잘못된 시간 초과 값(예: 음수 값 또는 숫자가 아닌 값)이 전달되면 오류와 함께 클라이언트 생성이 실패합니다.

Float

10

:database

연결할 데이터베이스의 이름입니다.

String

관리자

:direct_connection

배포 토폴로지를 검색하지 않고 지정된 호스트에 직접 연결합니다.

Boolean

거짓

:heartbeat_frequency

서버 모니터가 서버 상태를 비동기적으로 새로 고치는 데 걸리는 시간(초)입니다.

Float

10

:id_generator

문서의 ID를 생성하는 사용자 지정 객체입니다. #generate에 응답해야 합니다.

Object

none

:load_balanced

로드 밸런서에 연결할지 여부입니다.

Boolean

거짓

:local_threshold

가장 가까운 서버와 작동하도록 선택할 수 있는 서버 간의 최대 지연 시간(초)을 지정합니다.

Float

0.015

:logger

사용자 지정 로거.

Object

Logger

:max_connecting

연결 풀이 병렬로 설정을 시도할 최대 연결 수입니다.

Integer

2

:max_idle_time

연결 풀에서 연결이 닫히기 전에 연결이 유휴 상태일 수 있는 최대 시간(초)입니다.

경고: 로드 밸런서에 연결된 경우 드라이버는 커서를 반복하고(change stream 포함) 트랜잭션을 실행하기 위해 기존 연결을 사용합니다. 이 옵션을 통해 유휴 시간을 설정하면 드라이버가 후속 작업에 필요한 연결을 닫게 되어 해당 작업이 실패할 수 있습니다.

Integer

none

:max_pool_size

각 서버에 대한 연결 풀의 최대 크기입니다. 이 옵션을 0으로 설정하면 연결 풀에서 최대 크기 제한이 제거되어 연결 풀을 원하는 수로 늘릴 수 있습니다.

Integer

20

:max_read_retries

레거시 읽기 재시도가 사용되는 경우 최대 읽기 재시도 횟수입니다. 레거시 읽기 재시도를 비활성화하려면 0으로 설정합니다.

Integer

1

:max_write_retries

레거시 쓰기 재시도가 사용되는 경우 최대 쓰기 재시도 횟수입니다. 레거시 쓰기 재시도를 비활성화하려면 0으로 설정합니다.

Integer

1

:min_pool_size

각 서버에 대한 연결 풀의 최소 연결 수입니다. 드라이버는 풀에 이렇게 많은 연결이 포함될 때까지 백그라운드에서 연결을 설정합니다.

Integer

0

:monitoring

모니터링 객체입니다.

Object

none

:password

인증할 사용자의 비밀번호입니다.

String

none

:platform

서버 버전 3.4 이상에서 연결 설정 시 mongod 로그에 출력되는 메타데이터에 포함할 플랫폼 정보입니다.

String

none

:read

Hash 으로 서버를 선택하기 위한 읽기 설정 (read preference) 모드 및 태그 세트를 지정합니다. 해시에 허용되는 키는 :mode, :tag_sets:max_staleness 입니다.

{ read:
{ mode: :secondary,
tag_sets: [ "data_center" => "berlin" ],
max_staleness: 5,
}
}

태그 세트가 제공되는 경우 해시 배열이어야 합니다. 서버는 해당 태그가 제공된 태그 세트의 해시 중 하나와 일치하는 경우 읽기 설정을 충족합니다.

각 태그 세트는 해시여야 하며 서버 선택에 사용되기 전에 내부적으로 BSON::Document 인스턴스로 변환됩니다. 해시 키는 문자열 또는 기호일 수 있습니다. 키는 대소문자를 구분합니다. 해시 값은 문자열이어야 하며 복제본 세트 구성의 값과 정확히 일치해야 합니다.

Hash

{ :mode => :primary }

:read_concern

읽기 고려 (read concern) 옵션을 지정합니다. 유일한 유효한 키는 level 이며, 이 경우 유효한 값은 :local, :available, :majority, :snapshot:linearizable 입니다.

Hash

none

:read_retry_interval

mongos에서 읽기를 재시도하는 간격(초)입니다.

Integer

5

:replica_set

복제본 세트에 연결할 때 서버를 필터링하는 기준이 되는 세트의 이름입니다.

String

none

:retry_writes

네트워크 오류로 인해 단일 문 쓰기 작업이 실패하면 드라이버는 서버 버전 3.6 이상에 연결될 때 자동으로 한 번 재시도합니다.

Boolean

true

:sdam_proc

클라이언트는 배포가 생성되는 즉시 백그라운드에서 배포를 모니터링하기 시작하므로 클라이언트를 구성한 다음 별도의 성명서에서 SDAM 이벤트를 구독하면 구독자가 일부 SDAM 이벤트를 수신하지 못할 수 있습니다. :sdam_proc 옵션을 사용하면 SDAM 이벤트가 게시되기 전에 생성 중인 클라이언트에서 이벤트 구독자를 추가할 수 있습니다.

클라이언트의 이벤트 구독 메커니즘이 초기화된 후 클라이언트에 서버가 추가되기 전에 Client 를 인수로 사용하여 호출될 Proc 을 전달합니다. 이 Proc 를 사용하여 클라이언트에서 SDAM 이벤트 구독자를 설정합니다.

참고: :sdam_proc is invoked, in particular the cluster is nil at this time. ``:sdam_proc 절차에서 제공된 Proc 가 전달된 클라이언트에서만 Client#subscribeClient#unsubscribe 메서드를 호출하도록 제한해야 하는 경우 클라이언트가 완전히 구성되지 않습니다.

Proc

none

:server_api

요청된 서버 API 버전입니다. 허용되는 항목은 다음과 같은 해시입니다: - :version (문자열) - :strict (참 또는 거짓) - :deprecation_errors (참 또는 거짓)

서버 API 버전은 URI 옵션이 아닌 Ruby 옵션으로만 지정할 수 있으며 데이터베이스 및 collection 객체에 대해 재정의할 수 없습니다.

클라이언트에서 서버 API 버전이 변경된 경우(예: with 호출을 통해), 전체 API 버전 해시가 새 사양으로 대체됩니다(이전 개별 필드와 새 개별 필드는 병합되지 않음).

Hash

none

:server_selection_timeout

예외가 발생하기 전에 작업이 실행되도록 적절한 서버가 선택될 때까지 기다리는 시간(초)입니다.

Float

30

:socket_timeout

예외가 발생하기 전에 소켓에서 작업이 실행될 때까지 기다리는 시간(초)입니다. nil0 은 시간 초과가 없음을 의미합니다. 잘못된 시간 초과 값(예: 음수 값 또는 숫자가 아닌 값)이 전달되면 오류와 함께 클라이언트 생성이 실패합니다.

Float

none

:srv_max_hosts

샤드 토폴로지를 위해 드라이버가 통신할 mongoses의 최대 개수입니다. 이 옵션을 0으로 설정하면 최대 mongoses 수에 제한이 없습니다. 지정된 URI가 :srv_max_hosts 보다 많은 호스트로 확인되면 클라이언트는 임의로 :srv_max_hosts 크기의 호스트 하위 집합을 선택합니다. 클라이언트 구성 중에 드라이버가 무시하는 호스트는 사용되지 않습니다. 드라이버에서 선택한 호스트를 사용할 수 없게 되면 배포서버에 다른 기능적 mongoses가 있더라도 클라이언트의 작업이 완전히 종료됩니다.

Integer

0

:srv_service_name

SRV DNS 쿼리에 사용할 서비스 이름입니다.

String

mongodb

:ssl

클라이언트에게 TLS를 통해 서버에 연결하도록 지시합니다.

Boolean

거짓

:ssl_ca_cert

연결의 다른 쪽 끝에서 전달된 인증서의 유효성을 검사하는 데 사용되는 연결된 인증 기관 인증서가 포함된 파일 경로입니다. 에는 :ssl_ca_cert, :ssl_ca_cert_string 또는 :ssl_ca_cert_object (우선순위순) 중 하나가 필요합니다.:ssl_verify

String

none

:ssl_ca_cert_object

연결의 다른 쪽 끝에서 전달된 인증서의 유효성을 검사하는 데 사용되는 인증 기관 인증서를 나타내는 OpenSSL::X509::Certificate 의 배열입니다. 에는 :ssl_ca_cert, :ssl_ca_cert_string 또는 :ssl_ca_cert_object (우선 순위 순) 중 하나가 필요합니다.:ssl_verify

Array< OpenSSL::X509::Certificate >

none

:ssl_ca_cert_string

연결의 다른 쪽 끝에서 전달된 인증서의 유효성을 검사하는 데 사용되는 연결된 인증 기관 인증서가 포함된 문자열입니다. 에는 :ssl_ca_cert, :ssl_ca_cert_string 또는 :ssl_ca_cert_object (우선 순위 순) 중 하나가 필요합니다.:ssl_verify

String

none

:ssl_cert

MongoDB 서버에서 애플리케이션을 식별하는 데 사용되는 클라이언트 인증서 파일의 경로입니다. 파일에는 인증서의 개인 키도 포함될 수 있습니다. 이 경우 이 옵션에서는 개인 키를 무시합니다. 파일에는 클라이언트 인증서에서 CA 인증서까지 인증서 체인을 형성하는 중간 인증서도 포함될 수 있습니다. 모든 중간 인증서는 드라이버에 의해 구문 분석되어 extra_chain_cert 속성의 OpenSSL 컨텍스트에 제공됩니다. 중간 인증서가 제공되는 경우 파일의 첫 번째 인증서여야 하는 클라이언트 인증서를 따라야 합니다.

이 옵션은 있는 경우 :ssl_cert_string:ssl_cert_object 옵션보다 우선합니다.

String

none

:ssl_cert_object

MongoDB Server에서 애플리케이션을 식별하는 데 사용되는 OpenSSL::X509::Certificate입니다. 이 옵션을 통해 전달할 수 있는 인증서는 단 하나뿐입니다.

OpenSSL::X509::Certificate

none

:ssl_cert_string

MongoDB Server에서 애플리케이션을 식별하는 데 사용되는 PEM 인코딩 인증서가 포함된 문자열입니다. 이 문자열에는 인증서의 비공개 키도 포함될 수 있습니다. 이 경우 이 옵션에서는 개인 키를 무시합니다. 이 문자열에는 클라이언트 인증서에서 CA 인증서까지의 인증서 체인을 형성하는 중간 인증서도 포함될 수 있습니다. 모든 중간 인증서는 드라이버에 의해 구문 분석되어 extra_chain_cert 속성의 OpenSSL 컨텍스트에 제공됩니다. 중간 인증서가 제공되는 경우 클라이언트 인증서 뒤에 있어야 하며, 이 인증서는 문자열의 첫 번째 인증서여야 합니다.

이 옵션은 있는 경우 :ssl_cert_object 옵션보다 우선합니다.

String

none

:ssl_key

MongoDB에 대한 연결을 식별하는 데 사용되는 비공개 키 파일입니다. 키가 인증서와 동일한 파일에 저장되어 있더라도 둘 다 명시적으로 지정해야 합니다. 이 옵션(있는 경우)은 :ssl_key_string 및 :ssl_key_object의 값보다 우선합니다.

String

none

:ssl_key_object

MongoDB에 대한 연결을 식별하는 데 사용되는 비공개 키입니다.

OpenSSL::PKey

none

:ssl_key_pass_phrase

비공개 키의 암호입니다.

String

none

:ssl_key_string

MongoDB에 대한 연결을 식별하는 데 사용되는 PEM 인코딩된 비공개 키가 포함된 문자열입니다. 이 매개변수(있는 경우)는 ssl_key_object 옵션의 값보다 우선합니다.

String

none

:ssl_verify

Peering 인증서, 호스트 이름 및 OCSP 엔드포인트 유효성 검사를 수행할지 여부입니다. :ssl_verify_certificate 이 설정된 경우 인증서 유효성 검사 여부에 대한 결정이 재정의되고, :ssl_verify_hostname 이 설정된 경우 호스트 이름의 유효성 검사 여부에 대한 결정이 재정의되며, :ssl_verify_ocsp_endpoint 2}이 설정된 경우 OCSP 엔드포인트의 유효성 검사 여부에 대한 결정이 재정의됩니다. 이(가) 설정되었습니다.

Boolean

true

:ssl_verify_certificate

Peering 인증서 유효성 검사를 수행할지 여부입니다. 이 설정은 인증서 유효성 검사 수행 여부와 관련하여 :ssl_verify 설정을 재정의합니다.

Boolean

true

:ssl_verify_hostname

피어 호스트 이름 유효성 검사를 수행할지 여부입니다. 이 설정은 호스트 이름 유효성 검사의 수행 여부와 관련하여 :ssl_verify 설정을 재정의합니다.

Boolean

true

:ssl_verify_ocsp_endpoint

OCSP 엔드포인트가 인증서에 지정된 경우 인증서에 지정된 OCSP 엔드포인트에 대해 서버 제공 인증서의 유효성을 검사할지 여부입니다. 이 설정은 OCSP 엔드포인트 유효성 검사 수행 여부와 관련하여 :ssl_verify를 재정의합니다.

Boolean

true

:truncate_logs

로그를 기본값 250자에서 자를지 여부입니다.

Boolean

true

:user

인증할 사용자의 이름입니다.

String

none

:wait_queue_timeout

연결 풀의 연결이 사용 가능해질 때까지 기다리는 시간(초)입니다.

Float

10

:wrapping_libraries

드라이버를 래핑하는 라이브러리(예: ODM)에 대한 정보입니다. 더 낮은 수준의 라이브러리를 먼저 지정합니다. 허용되는 해시 키: :name, :version, :platform. 예: [name: 'Mongoid', version: '7.1.2']

Array<Hash>

none

:write

더 이상 사용되지 않습니다. :write_concern 옵션과 동일합니다. :write:write_concern 를 모두 지정한 경우 해당 값이 동일해야 합니다.

Hash

{ w: 1 }

:write_concern

쓰기 고려 (write concern) 옵션을 Hash 로 지정합니다. 해시의 키는 :w, :wtimeout, :j, :fsync 일 수 있습니다. :wtimeout 은(는) 초가 아닌 밀리초 단위로 지정됩니다.

{ write_concern: { w: 2 } }

Hash

{ w: 1 }

:zlib_compression_level

압축을 사용하는 경우 사용할 Zlib 압축 수준입니다. 유효한 레벨은 Ruby의 Zlib 모듈을 참조하세요.

Integer

none

참고

Ruby 드라이버는 인증서 해지 목록(CRL) 검사를 구현하지 않습니다.

URI 옵션은 Ruby 표준이 아닌 카멜 표기법을 사용해야 하므로 다음 표에 URI 옵션과 해당 Ruby 옵션이 나와 있습니다.

URI 옵션은 연결 URI 참조에 자세히 설명되어 있습니다.

참고

URI에서 밀리초 단위 로 설정된 옵션은 Ruby에서 float 로 표시되고 단위는 입니다.

URI 옵션
Ruby 옵션

appName=String

:app_name => String

authMechanism=String

:auth_mech => Symbol

인증 메커니즘 값은 다음과 같이 URI 옵션에서 Ruby 옵션으로 변환됩니다.

  • GSSAPI => :gssapi

  • MONGODB-CR => :mongodb_cr

  • MONGODB-X509 => :mongodb_x509

  • PLAIN => :plain

  • SCRAM-SHA-1 => :scram

  • SCRAM-SHA-256 => :scram256

인증 메커니즘에 다른 값이 제공되면 수정되지 않은 상태로 Ruby 옵션으로 변환되며 String 유형이 유지됩니다. 현재 드라이버는 Client 인식할 수 없는 인증 메커니즘으로 인스턴스를 구성할 수 있도록 허용하고 있지만, 이 동작 은 드라이버의 향후 버전에서 변경될 수 있습니다. .

authMechanismProperties=문자열

{ :auth_mech_properties => { :service_realm => String, :canonicalize_host_name => true|false, :service_name => String } }

쉼표로 구분된 키:값 쌍으로 지정됩니다(예: "SERVICE_REALM:foo,CANONICALIZE_HOST_NAME:TRUE".

authSource=String

:auth_source => String

압축기=문자열

:compressors => Array<String>

사용할 수 있는 잠재적 압축기를 쉼표로 구분된 목록으로, 기본 설정 순서대로 표시합니다. 드라이버가 압축을 구현하는 방법에 대한 자세한 내용은 아래를 참조하세요.

connect=String

:connect => Symbol

여기서는 :connect Ruby 옵션과 동일한 값이 허용됩니다. 여러 단어로 구성된 값의 경우, connect=replica_setconnect=load_balanced 와 같이 단어를 구분하기 위해 밑줄을 사용하여 값을 제공해야 합니다.

connectTimeoutMS=정수

:connect_timeout => Float

유효하지 않은 값으로 클라이언트 생성에 실패하는 해당 Ruby 옵션과 달리(예: 음수 및 숫자가 아닌 값), 이 URI 옵션을 통해 제공된 유효하지 않은 값은 경고와 함께 무시됩니다.

directConnection=Boolean

:direct_connection => Boolean

fsync=Boolean

{ :write_concern => { :fsync => true|false }}

heartbeatFrequeencyMS=정수

:heartbeat_frequency => Float

journal=Boolean

{ :write_concern => { :j => true|false }}

loadBalanced=Boolean

:load_balanced => Boolean

localThresholdMS=정수

:local_threshold => Float

maxConnecting=Integer

:max_connecting => Integer

maxIdleTimeMS=정수

:max_idle_time => Float

maxStalenessSeconds=정수

{ :read => { :max_staleness => Integer }}

maxStalenessSeconds URI 옵션 값이 -1이면 드라이버는 이를 옵션이 전혀 제공되지 않은 것처럼 처리합니다. 그렇지 않고 옵션 값이 숫자인 경우 Ruby 옵션은 Integer 로 변환된 지정된 값으로 설정됩니다. 0보다 크고 90보다 작거나 -1보다 작은 숫자 값은 Client 생성자에서 허용되지만 서버 선택이 실패하게 합니다(예: 이전에 with 메서드를 통해 옵션을 변경하지 않는 한 드라이버에서 수행 중인 모든 작업에 적용). 옵션 값이 숫자가 아닌 경우 무시되며 드라이버는 이 사례를 옵션이 전혀 제공되지 않은 것처럼 처리합니다.

maxPoolSize=Integer

:max_pool_size => Integer

minPoolSize=Integer

:min_pool_size => Integer

readConcernLevel=String

:read_concern => Hash

readPreference=String

{ :read => { :mode => Symbol }}

readPreferenceTags=문자열

{ :read => { :tag_sets => Array<Hash> }}

readPreferenceTags 필드의 각 인스턴스는 쉼표로 구분된 키:값 쌍으로, 지정된 순서대로 :tag_sets 배열에 표시됩니다. 인스턴스, "readPreferenceTags=dc:ny,rack:1&readPreferenceTags=dc:ny"[ { 'dc' => 'ny', 'rack' => '1' }, { 'dc' => 'ny' }] 로 변환됩니다.

replicaSet=String

:replica_set => String

retryWrites=Boolean

:retry_writes => boolean

serverSelectionTimeoutMS=정수

:server_selection_timeout => Float

socketTimeoutMS=정수

:socket_timeout => Float

유효하지 않은 값으로 클라이언트 생성에 실패하는 해당 Ruby 옵션과 달리(예: 음수 및 숫자가 아닌 값), 이 URI 옵션을 통해 제공된 유효하지 않은 값은 경고와 함께 무시됩니다.

srvMaxHosts=정수

:srv_max_hosts => Integer

srvServiceName=문자열

:srv_service_name => String

ssl=Boolean

:ssl => true|false

tls=Boolean

:ssl => boolean

tlsAllowInvalidCertificates=Boolean

:ssl_verify_certificate => boolean

tlsAllowInvalidCertificatestrue 을 사용하여 확인을 비활성화해야 함을 나타내고 ssl_verify_certificatefalse 을 사용하여 확인을 비활성화하므로 부울은 ssl_verify_certificate 설정에 사용되기 전에 반전됩니다.

tlsAllowInvalidHostnames=Boolean

:ssl_verify_hostname => boolean

tlsAllowInvalidHostnamestrue 을 사용하여 확인을 비활성화해야 함을 나타내고 ssl_verify_hostnamefalse 을 사용하여 확인을 비활성화하므로 부울은 ssl_verify_hostname 설정에 사용되기 전에 반전됩니다.

tlsCAFile=문자열

:ssl_ca_cert => String

tlsCertificateKeyFile=문자열

:ssl_cert => String

tlsCertificateKeyFile=문자열

:ssl_key => String

tlsCertificateKeyFilePassword=문자열

:ssl_key_pass_phrase => String

tlsDisableOCSPEndpointCheck=Boolean

:ssl_verify_ocsp_endpoint => boolean

tlsDisableOCSPEndpointChecktrue 을 사용하여 확인을 비활성화해야 함을 나타내고 ssl_verify_ocsp_endpointfalse 을 사용하여 확인을 비활성화하므로 부울은 ssl_verify_ocsp_endpoint 설정에 사용되기 전에 반전됩니다.

tlsInsecure=Boolean

:ssl_verify => boolean

tlsInsecure 는 true 를 사용하여 확인을 비활성화해야 함을 나타내고 ssl_verifyfalse 를 사용하여 확인을 비활성화하므로 부울이 ssl_verify 을 설정하는 데 사용되기 전에 반전됩니다.

w=정수|문자열

{ :write_concern => { :w => Integer|String }}

waitQueueTimeoutMS=정수

:wait_queue_timeout => Float

wtimeoutMS=정수

{ :write_concern => { :wtimeout => Integer }}

zlibCompressionLevel=Integer

:zlib_compression_level => Integer

참고

Ruby 드라이버는 서버의 인증서가 취소되었음을 나타내는 최종 서명된 응답을 받은 경우에만 연결에 실패합니다. 이 때문에 드라이버가 tlsDisableCertificateRevocationCheck URI 옵션을 인식하지 못합니다. 이 옵션이 URI로 제공되면 무시됩니다.

작업을 실행할 때 드라이버가 작업을 보낼 적절한 서버를 찾을 때까지 기다리는 시간(초)입니다. 기본값은 30입니다.

값이 0이면 시간 초과가 없습니다.

URI 옵션을 통해 유효하지 않은 값(예: 음수 또는 숫자가 아닌 값)이 전달되면 유효하지 않은 입력은 경고와 함께 무시됩니다. Ruby 옵션을 통해 유효하지 않은 값이 클라이언트에 직접 전달되면 오류와 함께 클라이언트 생성이 실패합니다.

복제본 세트 배포에서는 드라이버가 기본 변경 사항을 투명하게 처리할 수 있도록 이 시간 제한을 일반적인 복제본 세트 선택 시간 을 초과하도록 설정해야 합니다. 또한 이 시간 제한을 통해 애플리케이션과 데이터베이스를 동시에 시작할 수 있습니다. 애플리케이션은 데이터베이스를 사용할 수 있을 때까지 이 시간까지 대기합니다.

애플리케이션 서버가 역방향 프록시 뒤에 있는 경우, 서버 선택 제한 시간은 역방향 프록시에 구성된 요청 시간 제한보다 작아야 합니다(예: 라우팅 계층에서 제한 시간이 30초로 고정된 Herku의 배포에 적용됨). 개발 중에는 서버가 실행 중이 아닐 때 더 빨리 실패하도록 이 값을 낮출 수 있습니다.

일반(모니터링이 아닌) 연결에서 소켓 읽기 또는 쓰기가 완료될 때까지 기다리는 시간(초)입니다. 기본값은 시간 초과 없음입니다.

값이 0이면 시간 초과가 없습니다.

URI 옵션을 통해 유효하지 않은 값(예: 음수 또는 숫자가 아닌 값)이 전달되면 유효하지 않은 입력은 경고와 함께 무시됩니다. Ruby 옵션을 통해 유효하지 않은 값이 클라이언트에 직접 전달되면 오류와 함께 클라이언트 생성이 실패합니다.

이 제한 시간은 네트워크 지연 시간과 작업 기간을 모두 고려해야 합니다. 예를 들어 이 시간 제한을 5초로 설정하면 Mongo::Error::SocketTimeoutError 을(를) 사용하여 서버에서 실행되는 데 5초 이상 걸리는 쿼리가 중단됩니다.

기본적으로 소켓 시간 제한이 설정되어 있지 않지만 운영 체제는 구성에 따라 여전히 읽기 작업 시간을 초과할 수 있습니다. 킵얼라이브 설정은 끊어진 네트워크 연결을 감지하기 위한 것입니다(단순히 실행 시간이 오래 걸린다는 이유로 작업을 중단하는 것과 반대).

socket_timeout 값을 초과하여 드라이버에 의해 작업 시간이 초과된 경우에도 서버에서 중단되지 않습니다. 따라서 오래 실행될 가능성이 있는 작업에는 max_time_ms 옵션을 사용하는 것이 좋습니다.

이 옵션은 연결 모니터링에는 적용되지 않습니다.

서버에 대한 소켓 연결이 설정될 때까지 기다리는 시간(초)입니다. 기본값은 10입니다.

이 제한 시간은 연결 모니터링을 위한 연결 제한 시간 및 소켓 제한 시간으로도 사용됩니다.

mongodb+srv:// URI를 사용할 때 이 시간 제한은 SRV 및 TXT DNS 조회에도 사용됩니다. 시간 초과는 조회별로 적용됩니다. DNS 접미사 검색 목록으로 인해 단일 이름 확인의 일부로 여러 조회를 수행할 수 있습니다.

연결 풀의 연결이 사용 가능해질 때까지 기다리는 시간(초)입니다. 기본값은 10입니다.

드라이버 버전 2.11부터 연결 풀이 연결을 반환하기 전에 완전히 연결을 설정하여 여러 번의 네트워크 왕복이 필요할 수 있으므로 이 시간 제한을 최소한 connect_timeout 이상의 값으로 설정해야 합니다.

특정 작업에 대한 옵션으로 지정되며, 서버에서 작업을 실행할 수 있는 시간(밀리초)입니다. 기본적으로 설정되지 않습니다.

장기 실행 작업이 너무 오래 걸릴 때 서버에서 중단될 가능성이 있는 경우 socket_timeout 대신 이 옵션을 사용하는 것이 좋습니다.

쓰기 고려 (write concern)에 지정된 서버들에 의해 쓰기가 승인될 때까지 기다리는 시간(밀리초)입니다. 기본적으로 설정되지 않은 경우 서버가 기본값을 적용하도록 지시합니다. 이 옵션은 클라이언트에서 전역으로 설정하거나 :write_concern 아래의 개별 작업에 전달할 수 있습니다.

TLS를 사용하여 MongoDB deployment에 연결하려면 다음을 수행하세요.

  • Mongo::Client 에서 TLS 연결을 활성화합니다.

  • 클라이언트 TLS 인증서를 지정합니다.

  • 서버의 TLS 인증서를 확인하려면 CA 인증서를 지정하세요.

참고

JRuby를 사용하는 경우 ECDSA 인증서는 현재 지원되지 않습니다.

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 연결을 요청하려면 Mongo::Client 구성 시 다음 클라이언트 옵션을 지정합니다.

  • :ssl Ruby 옵션.

  • tls URI 옵션입니다.

  • ssl URI 옵션(더 이상 사용되지 않음).

기본적으로 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_keyssl_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 이스케이프 처리해야 합니다. 이는 예를 들어 경로에 슬래시가 적용됩니다.

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 의 모든 ProcOpenSSL::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 루트와 비교하여 자체적으로 확인되지 않습니다. 이 문제에 대한 자세한 내용은 이 메일링 리스트 게시 에서 확인할 수 있습니다. .

드라이버는 기본적으로 서버의 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 옵션을 지정합니다.

:ssl_ca_cert Ruby 옵션 및 tlsCAFile URI 옵션은 여러 인증서가 포함된 파일에 사용할 수 있습니다. 이렇게 참고된 모든 인증서는 트러스트 앵커가 됩니다.

:ssl_ca_cert_object 옵션은 인증서 배열을 사용하므로 여러 인증서를 인증 기관으로 추가하는 데 사용할 수도 있습니다.

:ssl_ca_cert_string 옵션은 CA 인증서를 하나만 지정하도록 지원합니다.

경고

중간 인증서는 CA 인증서 옵션에 지정된 파일에 제공되어서는 안 됩니다. 이렇게 하면 루트 인증서에 대해 중간 인증서를 확인하는 대신 중간 인증서가 루트 인증서 상태로 승격됩니다.

중간 인증서를 사용해야 하는 경우 클라이언트 또는 서버 TLS 인증서 파일의 일부로 지정합니다.

서버에서 제공한 인증서에 OCSP 엔드포인트 URI가 포함된 경우 드라이버는 지정된 엔드포인트에 OCSP 요청을 발행하여 인증서의 유효성을 확인합니다.

클라이언트를 생성할 때 :ssl_verify_ocsp_endpoint Ruby 옵션을 false 로 설정하거나 tlsDisableOCSPEndpointCheck URI 옵션을 true 로 설정하여 OCSP 엔드포인트 검사를 비활성화할 수 있습니다.

참고

JRuby에서 실행할 때는 현재 OCSP 엔드포인트 URI가 올바르게 노출되지 않기 때문에 OCSP 엔드포인트 검사가 수행되지 않습니다.

클라이언트가 호스트 이름으로 localhost 를 사용하여 구성되면 IPv4 연결만 시도합니다(즉, localhost127.0.0.1 로 해석되고 ::1 인 경우 드라이버는 127.0.0.1 에만 연결을 시도합니다).

클라이언트가 localhost 이외의 호스트 이름으로 구성되면 호스트 이름이 확인되는 주소에 따라 IPv4 및 IPv6 연결을 모두 시도합니다. 드라이버는 getaddrinfo 가 주소를 반환하는 순서를 따르며 순차적으로 연결을 시도합니다. 처음으로 성공한 연결이 사용됩니다.

드라이버는 현재 '해피 안구' 알고리즘을 구현하지 않습니다.

시스템 구성 및 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 드라이버를 사용하거나 애플리케이션이 다른 방식으로 포크하는 경우 각 프로세스(상위 및 하위 프로세스)에는 자체 클라이언트 연결이 있어야 합니다. 그 이유는 다음과 같습니다.

  1. Ruby MongoDB 드라이버에서 연결 상태를 모니터링하는 데 사용하는 것과 같은 백그라운드 Ruby 스레드는 하위 프로세스로 전송 되지 않습니다 .

  2. 네트워크 소켓 같은 파일 디스크립터는 상위 프로세스와 하위 프로세스 간에 공유되므로 I/O 충돌이 발생할 수 있습니다.

(1)와 관련하여 포크 후 하위 프로세스 에서 드라이버의 모니터링 스레드를 다시 시작하지 않으면 하위 항목이 처음에는 올바르게 작동하는 것처럼 보일 수 있지만 MongoDB cluster 상태 가 변경되면 Mongo::Error::NoServerAvailable 예외가 발생합니다. 예를 예시 네트워크 오류 또는 유지 관리 이벤트 로 인해 발생합니다.

(2)와 관련하여 하위 프로세스가 상위 프로세스의 파일 설명자를 재사용하면 Errno::EPIPE: Broken pipeEOFError: 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부터는 기본적으로 최신 메커니즘이 사용되며 레거시 메커니즘은 더 이상 사용되지 않습니다.

최신 메커니즘을 사용하면 네트워크 오류, '마스터가 아님' 오류 또는 '노드를 복구하는 중' 오류가 발생하면 읽기 작업이 한 번 재시도됩니다. 다음 작업에 대해 설명합니다.

작업이 커서를 반환하면 초기 읽기 명령만 재시도할 수 있습니다. 드라이버 버전 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, snappyzlib 압축기를 지원합니다. 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 이상에서 기본적으로 활성화됩니다.

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 드라이버가 제공하는 기능 플래그 목록입니다.

플래그
설명

broken_view_aggregate

이 플래그를 끄면 뷰에서 수행된 애그리게이션은 collection의 모든 문서 대신 해당 뷰에 포함된 문서에 대해 실행됩니다. 이 플래그가 켜져 있으면 뷰 필터가 무시되고 뷰 컬렉션에 있는 모든 문서에 애그리게이션이 적용됩니다. (기본값: true)

broken_view_options

이 플래그를 끄면 보기 옵션이 aggregate, count, count_documents, distinctestimated_document_count 메서드에 올바르게 전파됩니다. 이 플래그를 켜면 해당 메서드에서 보기 옵션이 무시됩니다. (기본값: true)

validate_update_replace

대체 문서의 루트에 원자 연산자($로 시작하는 연산자)가 없고 업데이트 문서의 루트에 원자 연산자만 있는지 확인합니다. 이 기능 플래그가 켜져 있으면 잘못된 업데이트 또는 교체 문서에 오류가 발생하고, 그렇지 않으면 로그에 경고가 출력됩니다. (기본값: false)

이러한 기능 플래그는 Mongo 모듈에서 직접 설정하거나 options 메서드를 사용하여 설정할 수 있습니다.

Mongo.validate_update_replace = true
Mongo.options = { validate_update_replace: true }

돌아가기

연결 & 구성