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: 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 ミリ秒)。
検討されたサーバー セレクター(
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ドキュメントを参照してください。