개요
모든 MongoDB 드라이버는 읽거나 쓰기 (write) 서버 선택할 때 정의된 알고리즘 따릅니다. MongoClient
객체 의 ClusterConfigurator
속성 사용하면 이 알고리즘 사용자 지정하여 애플리케이션 에 가장 적합한 서버 선택할 수 있습니다.
중요
서버 선택 알고리즘 사용자 지정하면 읽기 또는 쓰기 (write) 성능이 저하되는 등 의도하지 않은 결과가 발생할 수 있습니다.
기본 알고리즘
.NET/ C# 드라이버 읽기 작업을 실행할 때 MongoDB deployment 선택하기 위해 다음 단계를 순서대로 수행합니다.
알려진 서버 목록에서 활성 읽기 설정 (read preference) 일치하는 모든 서버를 선택합니다.
읽을 수 있는 서버 하나 이상 있는 경우 운전자 사용자 정의 서버 선택기 함수를 호출하고 이전 단계의 목록을 전달합니다.
함수에서 반환된 서버 목록에
LocalThreshold
연결 설정을 적용합니다.목록에 있는 서버에서 무작위로 서버 선택하고 이 서버 대해 작업을 실행합니다.
.NET/ C# 드라이버 쓰기 (write) 작업을 실행할 때 활성 읽기 설정 (read preference) 일치하는 서버뿐만 아니라 쓰기 가능한 모든 서버를 선택하는 것으로 시작합니다. 나머지 단계는 동일합니다.
기본값 서버 선택 알고리즘 을 지정하지 않을 때 운전자 사용하는 기본 서버 선택 알고리즘에 대해 자세히 학습 MongoDB Server 매뉴얼에서 서버 선택 알고리즘을 참조하세요.
다른 서버 선택 알고리즘 지정
서버 선택기 클래스의 인스턴스 ClusterConfigurator
의 PreServerSelector
또는 PostServerSelector
속성 에 전달하여 다른 서버 선택 로직을 지정할 수 있습니다. PreServerSelector
속성 표준 서버 선택 로직이 실행되기 전에 실행되는 서버 선택기를 지정하고, PostServerSelector
속성 표준 서버 선택 로직이 실행된 후에 실행되는 서버 선택기를 지정합니다. 그런 다음 MongoClient
인스턴스 생성하여 사용자 지정 서버 선택 로직을 적용 할 때 ClusterConfigurator
인스턴스 MongoClientSettings
객체 에 전달할 수 있습니다.
다음 표에는 ClusterConfigurator
속성 에 전달할 수 있는 다양한 유형의 서버 선택기가 나열되어 있습니다.
서버 선택기 | 설명 |
---|---|
| 여러 부분 선택기를 기반으로 서버를 선택합니다. |
| 위임 서버 선택기를 래핑합니다. |
| 엔드포인트에 따라 서버 선택 |
| 허용 가능한 지연 시간 범위 내에서 서버 선택 |
| 우선 순위를 낮출 서버 컬렉션 기반으로 서버 선택합니다. |
| 무작위 서버 선택 |
| 지정된 읽기 설정 (read preference) 에 따라 서버를 선택합니다. |
다음 예시 표준 서버 선택 로직이 실행되기 전에 MongoClient
가 RandomServerSelector
클래스를 사용하여 무작위로 서버 선택하도록 지시합니다.
var settings = MongoClientSettings.FromConnectionString("<connection string>"); var clusterConfigurator = builder => { builder.ConfigureCluster(c => c.With(PreServerSelector: new RandomServerSelector())); }; settings.ClusterConfigurator = clusterConfigurator; var client = new MongoClient(settings);
다양한 서버 선택기 클래스에 대해 자세히 학습 ServerSelectors API 설명서를 참조하세요.
사용자 지정 서버 선택 로직 구현
IServerSelector
인터페이스에서 상속하고 SelectServers()
메서드를 재정의하는 클래스를 만들어 자체 사용자 지정 서버 선택 로직을 구현 수 있습니다. 다음 예시 에서는 ServerType
가 ServerType.ReplicaSetSecondary
인 서버를 선택하는 간단한 사용자 지정 서버 선택 클래스를 보여 줍니다.
public class CustomServerSelector : IServerSelector { public IEnumerable<ServerDescription> SelectServers(ClusterDescription cluster, IEnumerable<ServerDescription> servers) { return servers.Where(server => server.Type == ServerType.ReplicaSetSecondary); } }
그런 다음 다른 서버 선택 알고리즘 지정 섹션에 표시된 대로 이 클래스의 인스턴스 인스턴스 의 PreServerSelector
또는 PostServerSelector
속성 에 전달할 수 ClusterConfigurator
있습니다.
설정을 사용하여 서버 선택 구성
MongoClient
객체 또는 연결 URI에서 다음 서버 선택 설정을 지정할 수 있습니다.
설정 | 설명 | |||
---|---|---|---|---|
| The latency window for server eligibility. If a server's round trip takes longer than the fastest server's round-trip time plus this value, the server isn't eligible for selection. Data Type: TimeSpan Default: 15 milliseconds Connection URI Example: localThresholdMS=0 | |||
| The client's default read-preference settings. MaxStaleness represents thelongest replication lag (in real time) that a secondary can experience and still be eligible for server selection. Specifying -1 means no maximum.See read preference for more information. Data Type: ReadPreference Default: ReadPreference.Primary Connection URI Example:
| |||
| The length of time the driver tries to select a server before timing out. Data Type: TimeSpan Default: 30 seconds Connection URI Example: serverSelectionTimeoutMS=15000 |
문제 해결
서버 선택 중 드라이버 시간 초과를 발생시킵니다.
각 운전자 작업에서는 서버 선택 기준을 충족하는 서버 선택해야 합니다. 서버 선택 제한 시간 내에 적절한 서버 선택하지 않으면 운전자 에서 서버 선택 제한 시간 예외가 발생합니다. 예외는 다음과 유사합니다.
A timeout occurred after 30000ms selecting a server using CompositeServerSelector{ Selectors = MongoDB.Driver.MongoClient+AreSessionsSupportedServerSelector, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 }, OperationsCountServerSelector }. Client view of cluster state is { ClusterId : "1", Type : "Unknown", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "Unspecified/localhost:27017" }", EndPoint: "Unspecified/localhost:27017", ReasonChanged: "Heartbeat", State: "Disconnected", ServerVersion: , TopologyVersion: , Type: "Unknown", HeartbeatException: "<exception details>" }] }.
오류 메시지는 여러 부분으로 구성됩니다.
서버 선택 제한 시간(30000밀리초).
고려된 서버 선택기(
AreSessionsSupportedServerSelector
,LatencyLimitingServerSelector
,OperationsCountServerSelector
가 포함된CompositeServerSelector
).클러스터 토폴로지에 대한 드라이버의 현재 뷰. 드라이버가 인식하는 서버 목록은 이 뷰의 핵심 부분입니다. 각 서버 설명에는 엔드포인트, 서버 버전, 서버 유형, 현재 상태에 대한 정보를 비롯하여 현재 상태에 대한 전체 설명이 포함됩니다. 서버의 상태를 보고하는 데 문제가 발생하는 경우
HeartbeatException
에는 마지막으로 실패한 하트비트의 예외가 포함됩니다. 각 클러스터 노드에서HeartbeatException
을 분석하면 대부분의 서버 선택 문제를 진단하는 데 도움이 될 수 있습니다. 다음과 같은 하트비트 예외가 일반적입니다.No connection could be made because the target machine actively refused it
: 운전자 이 클러스터 노드 볼 수 없습니다. 이는 클러스터 노드 충돌했거나, 방화벽 인해 네트워크 트래픽이 클러스터 노드 또는 포트에 도달하지 못하도록 차단되었거나, 기타 네트워크 오류로 인해 트래픽이 클러스터 노드 로 라우팅되지 못하기 때문일 수 있습니다.Attempted to read past the end of the stream
: 이 오류는 네트워크 오류, 잘못 구성된 방화벽 또는 기타 네트워크 문제로 인해 운전자 클러스터 노드에 연결할 수 없을 때 발생합니다. 이 예외를 주소 하려면 모든 클러스터 노드에 연결할 수 있어야 합니다. 이 오류는 일반적으로 클라이언트 시스템의 IP 주소 Atlas 프로젝트의 Network Access 탭 아래에 있는 Atlas IP 액세스 목록에 구성되어 있지 않을 때 발생합니다.The remote certificate is invalid according to the validation procedure
: 이 오류는 일반적으로 만료되었거나 유효하지 않은 인증서 또는 신뢰할 수 없는 루트 CA와 같은 TLS/SSL 관련 문제를 나타냅니다.openssl s_client
와 같은 도구를 사용하여 TLS/SSL 관련 인증서 문제를 디버깅할 수 있습니다.
API 문서
이 가이드 에 사용된 클래스 및 메서드에 대해 자세히 학습 다음 API 설명서를 참조하세요.