Overview
すべてのMongoDBドライバーは、読み取りまたは書き込みのサーバーを選択するときに定義されたアルゴリズムに従います。MongoClientオブジェクトの ClusterConfiguratorプロパティを使用すると、このアルゴリズムをカスタマイズして、サーバーに最適です。
重要
サーバー選択アルゴリズムをカスタマイズすると、読み取りや書込みパフォーマンスの低下など、意図しない結果が生じる可能性があります。
デフォルトのアルゴリズム
.NET/ C#ドライバーが 読み取り操作を実行するとき、 MongoDBデプロイを選択するために、次の手順を順番に実行します。
- アクティブな読み込み設定 (read preference)に一致するすべてのサーバーを既知のサーバーのリストから選択します。 
- 少なくとも 1 つの読み取り可能なサーバーが存在する場合、ドライバーはユーザー定義のサーバー セレクター関数を呼び出し、前のステップのリストを渡します。 
- 関数から返されるサーバーのリストに - LocalThreshold接続設定を適用します。
- リストに残っているサーバーからランダムにサーバーを選択し、このサーバーに対して操作を実行します。 
.NET/ C#ドライバーが 書込み操作を実行する場合、まず、アクティブな読み込み設定 (read preference)に一致するサーバーだけでなく、すべての書込み可能なサーバーを選択します。残りの手順は同一です。
カスタムサーバー選択アルゴリズムを指定しない場合にドライバーが従うデフォルトのサーバー選択アルゴリズム の詳細については、 MongoDB Serverマニュアルの サーバー選択アルゴリズムを 参照してください。
他のサーバー選択アルゴリズムの指定
サーバーセレクタークラスのインスタンスを ClusterConfigurator の PreServerSelector または PostServerSelectorプロパティに渡すことで、別のサーバー選択ロジックを指定できます。PreServerSelectorプロパティは標準サーバー選択ロジックの実行前に実行されるサーバーセレクターを指定し、PostServerSelectorプロパティは標準サーバー選択ロジックの実行後に実行されるサーバーセレクターを指定します。次に、MongoClientインスタンスを作成してカスタムサーバー選択ロジックを適用するときに、ClusterConfiguratorインスタンスをMongoClientSettingsオブジェクトに渡します。
次の表は、ClusterConfiguratorプロパティに渡すことができるさまざまなタイプのサーバーセレクターを示しています。
| サーバー セレクター | 説明 | 
|---|---|
| 
 | 複数の部分的なセレクターに基づいてサーバーを選択します | 
| 
 | 委任サーバーセレクターをラップします。 | 
| 
 | エンドポイントに基づいてサーバーを選択します | 
| 
 | 許容レイテンシ範囲内のサーバーを選択します | 
| 
 | 優先順位を下げるサーバーのコレクションに基づいてサーバーを選択します | 
| 
 | ランダムなサーバーを選択します | 
| 
 | 指定された読み込み設定 (read preference)に基づいてサーバーを選択します | 
次の例では、標準サーバー選択ロジックが実行される前に、RandomServerSelectorクラスを使用してサーバーをランダムに選択するよう MongoClient に指示します。
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); 
さまざまなサーバーセレクター クラスの詳細については、ServerSelector 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);     } } 
次に、「他のサーバー選択アルゴリズムの指定」セクションに示されているように、このクラスのインスタンスをClusterConfiguratorインスタンスの PreServerSelector または PostServerSelectorプロパティに渡すことができます。
設定を使用してサーバー選択を構成する
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:  TimeSpanDefault: 15 milliseconds Connection URI Example:  localThresholdMS=0 | |||
| 
 | The client's default read-preference settings.  MaxStalenessrepresents thelongest replication lag (in real time) that a secondary can experience and still be eligible for server selection. Specifying  -1means no maximum.See read preference for more information. Data Type: ReadPreference Default:  ReadPreference.PrimaryConnection URI Example:  | |||
| 
 | The length of time the driver tries to select a server before timing out. Data Type:  TimeSpanDefault: 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 ミリ秒)。 
- 検討されたサーバー セレクター( - CompositeServerSelector- AreSessionsSupportedServerSelector- LatencyLimitingServerSelector、 、 を含む- OperationsCountServerSelector)
- クラスター トポロジーのドライバーの現在のビュー。 ドライバーが認識しているサーバーのリストは、このビューの重要な部分です。 各サーバーの説明には、エンドポイント、サーバーバージョン、サーバーのタイプ、現在のヘルス状態に関する情報など、そのサーバーの現在の状態を網羅的な説明が含まれています。 サーバーが正常性をレポートする際に問題が発生した場合、 - 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 IP アクセス リストに構成されていない場合に発生します。このリストは、Atlas プロジェクトの [Network Access]タブで確認できます。
- The remote certificate is invalid according to the validation procedure: このエラーは通常、期限切れ/無効な証明書やルート CA など、TLS/SSL 関連の問題を示します。 TLS/SSL 関連の証明書の問題をデバッグするには、- openssl s_clientなどのツールを使用します。
 
API ドキュメント
このガイドで使用されているクラスとメソッドの詳細については、次のAPIドキュメントを参照してください。