Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
C#/.NET ドライバー
/ /

MongoDB Server選択をカスタマイズ

すべてのMongoDBドライバーは、読み取りまたは書き込みのサーバーを選択するときに定義されたアルゴリズムに従います。MongoClientオブジェクトの ClusterConfiguratorプロパティを使用すると、このアルゴリズムをカスタマイズして、サーバーに最適です。

重要

サーバー選択アルゴリズムをカスタマイズすると、読み取りや書込みパフォーマンスの低下など、意図しない結果が生じる可能性があります。

.NET/ C#ドライバーが 読み取り操作を実行するとき、 MongoDBデプロイを選択するために、次の手順を順番に実行します。

  1. アクティブな読み込み設定 (read preference)に一致するすべてのサーバーを既知のサーバーのリストから選択します。

  2. 少なくとも 1 つの読み取り可能なサーバーが存在する場合、ドライバーはユーザー定義のサーバー セレクター関数を呼び出し、前のステップのリストを渡します。

  3. 関数から返されるサーバーのリストに LocalThreshold 接続設定を適用します。

  4. リストに残っているサーバーからランダムにサーバーを選択し、このサーバーに対して操作を実行します。

.NET/ C#ドライバーが 書込み操作を実行する場合、まず、アクティブな読み込み設定 (read preference)に一致するサーバーだけでなく、すべての書込み可能なサーバーを選択します。残りの手順は同一です。

カスタムサーバー選択アルゴリズムを指定しない場合にドライバーが従うデフォルトのサーバー選択アルゴリズム の詳細については、 MongoDB Serverマニュアルの サーバー選択アルゴリズムを 参照してください。

サーバーセレクタークラスのインスタンスを ClusterConfiguratorPreServerSelector または PostServerSelectorプロパティに渡すことで、別のサーバー選択ロジックを指定できます。PreServerSelectorプロパティは標準サーバー選択ロジックの実行前に実行されるサーバーセレクターを指定し、PostServerSelectorプロパティは標準サーバー選択ロジックの実行後に実行されるサーバーセレクターを指定します。次に、MongoClientインスタンスを作成してカスタムサーバー選択ロジックを適用するときに、ClusterConfiguratorインスタンスをMongoClientSettingsオブジェクトに渡します。

次の表は、ClusterConfiguratorプロパティに渡すことができるさまざまなタイプのサーバーセレクターを示しています。

サーバー セレクター
説明

CompositeServerSelector

複数の部分的なセレクターに基づいてサーバーを選択します

DelegateServerSelector

委任サーバーセレクターをラップします。

EndPointServerSelector

エンドポイントに基づいてサーバーを選択します

LatencyLimitingServerSelector

許容レイテンシ範囲内のサーバーを選択します

PriorityServerSelector

優先順位を下げるサーバーのコレクションに基づいてサーバーを選択します

RandomServerSelector

ランダムなサーバーを選択します

ReadPreferenceServerSelector

指定された読み込み設定 (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() メソッドをオーバーライドするクラスを作成することで、独自のカスタムサーバー選択ロジックを実装できます。次の例では、ServerTypeServerType.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 で、次のサーバー選択設定を指定できます。

設定
説明

LocalThreshold

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

ReadPreference

The client's default read-preference settings. MaxStaleness represents the
longest 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:
readPreference=primaryPreferred
&maxStalenessSeconds=90
&readPreferenceTags=dc:ny,rack:1

ServerSelectionTimeout

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>"
}]
}.

エラーメッセージは複数の部分で構成されています。

  1. サーバー選択タイムアウト(30000 ミリ秒)。

  2. 検討されたサーバー セレクター(CompositeServerSelector AreSessionsSupportedServerSelectorLatencyLimitingServerSelector、 、 を含むOperationsCountServerSelector

  3. クラスター トポロジーのドライバーの現在のビュー。 ドライバーが認識しているサーバーのリストは、このビューの重要な部分です。 各サーバーの説明には、エンドポイント、サーバーバージョン、サーバーのタイプ、現在のヘルス状態に関する情報など、そのサーバーの現在の状態を網羅的な説明が含まれています。 サーバーが正常性をレポートする際に問題が発生した場合、 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ドキュメントを参照してください。

戻る

ネットワーク トラフィックを圧縮

項目一覧