Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

MongoDB Server選択をカスタマイズ

すべてのMongoDBドライバーは、読み取りまたは書き込みのサーバーを選択するときに定義されたアルゴリズムに従います。 MongoDB Rustドライバーを使用すると、このアルゴリズムをカスタマイズして、アプリケーションに最適です。

サーバーの選択には次の方法で影響を与えます。

  • 読み込み設定 (read preference)を使用して、プライマリ、セカンダリ、またはタグセットが最も近いサーバーなど、適切なサーバーを標準化された方法で記述します。

  • SelectionCriteria::Predicate 経由でカスタム述語を提供し、適切なサーバーをフィルタリングするときに独自のロジックを適用します。

重要

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

Rustドライバーがカスタム選択基準で操作を実行する場合、 MongoDBデプロイ を選択するために次の手順を順番に実行します。

  1. 適格なサーバーを選択する: 既知のサーバーのリストから、ドライバーはアクティブなSelectionCriteria trueと一致するサーバーを選択します。読み込み設定 (read preference)に一致するサーバー、またはカスタム述語によって が返されるサーバーのいずれかです。

  2. レイテンシウィンドウを適用する: ドライバーはlocal_threshold 設定を適格なサーバーのリストに適用し、平均ラウンドトリップ時間が 最速の適格サーバーの構成ウィンドウ外のサーバーをフィルタリングします。

  3. ランダム選択: ドライバーはレイテンシウィンドウに残っているサーバーからランダムにサーバーを選択し、このサーバーに対して操作を実行します。

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

デフォルトのサーバー選択アルゴリズムの詳細については、 MongoDB Serverマニュアルの サーバー選択アルゴリズムを参照してください。

Rustドライバーは、次の例に示すように、 SelectionCriteria列挙を使用してサーバー選択ルールを表します。

pub enum SelectionCriteria {
ReadPreference(ReadPreference),
Predicate(Predicate),
}

どの操作にも、SelectionCriteria::ReadPreference または SelectionCriteria::Predicate のいずれかを使用します。両方は使用しません。

  • ReadPreference: 標準のMongoDB読み込み設定 (read preference) ) ルールに従い、サーバータイプ、タグ セット、最大古さに基づいて適切なサーバーを説明します。

  • Predicate: ホスト名パターンやその他のカスタム条件に基づいてサーバーを優先するなど、ReadPreference が表現できないケースにカスタム ロジックを提供できます。

述語とは、ServerInfo参照を受け入れ、サーバーの適性を示す true を返す任意の閉じものです。ドライバーでは、次のコードに示すように、これを型エイリアス Predicate として定義します。

pub type Predicate = Arc<dyn Send + Sync + Fn(&ServerInfo) -> bool>;

述語がそのサーバーの ServerInfo 値に対して true を返す場合、そのサーバーは適切と見なされます。 ServerInfo タイプは、アドレス、タイプ、その他のモニタリングメタデータなど、サーバーに関する情報を公開します。

複数の mongos サーバーでシャーディングされたクラスターを使用する場合は、localhost で実行中配置の方が適している場合があります。これらの配置に対する操作では、レイテンシが低く、スループットが高くなります。この例では、localhost で実行中サーバーのみを考慮してサーバー選択アルゴリズムをカスタマイズする方法を示します。

述語関数は、次の条件を満たす必要があります。

  • パラメータとして ServerInfoオブジェクトへの参照を受け入れます

  • サーバーが選択に適しているかどうかを示すブール値を返します

  • ServerInfo オブジェクトを作成または変更しない

次の例では、ホスト アドレスが localhost であるサーバーを優先する述語を定義します。

let prefer_localhost = Arc::new(|server_info: &ServerInfo| {
matches!(
server_info.address(),
ServerAddress::Tcp { host, .. } if host == "localhost"
)
});

述語が使用可能なすべてのサーバーに対して false を返す場合、ドライバーはサーバーを選択できません。この場合操作は失敗し、使用可能なサーバーが指定された条件に適していないことを示すサーバー選択タイムアウト エラーが返されます。

この結果を回避するには、述語が通常の条件下で少なくとも 1 つのサーバーと一致することを確認するか、 またはアプリケーションコードでサーバー選択エラーを処理し、必要に応じて制限的ではない SelectionCriteria で再試行します。

サーバー選択に述語を使用するには、クライアントを作成する 際に、それを selection_criteria オプションに渡します。 [ :GUIラベル:非同期 ] タブまたは [ :GUIラベル:同期 ]タブを選択して、各実行時に対応するコードを表示します。

let prefer_localhost = Arc::new(|server_info: &ServerInfo| {
matches!(
server_info.address(),
ServerAddress::Tcp { host, .. } if host == "localhost"
)
});
let options = ClientOptions::builder()
.hosts(vec![ServerAddress::Tcp {
host: "<hostname>".to_string(),
port: Some(27017),
}])
.selection_criteria(SelectionCriteria::Predicate(prefer_localhost))
.build();
let client = Client::with_options(options)?;
let mut options = ClientOptions::parse(
"mongodb://<db_username>:<db_password>@<hostname>:<port>",
)
.await?;
let prefer_localhost = Arc::new(|server_info: &ServerInfo| {
matches!(
server_info.address(),
ServerAddress::Tcp { host, .. } if host == "localhost"
)
});
options.selection_criteria = Some(
SelectionCriteria::Predicate(prefer_localhost),
);
let client = Client::with_options(options)?;

Rustドライバーの サーバー選択アルゴリズムをカスタマイズする方法の詳細については、次のAPIドキュメントを参照してください。

戻る

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

項目一覧