Docs Menu

Docs Homeアプリケーションの開発Python ドライバーPyMongo

MongoDB Server選択をカスタマイズ

項目一覧

  • Overview
  • カスタマイズされた選択アルゴリズム
  • 例: でサーバーを選択します localhost
  • API ドキュメント

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

重要

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

PyMongo が読み取り操作を実行するときは、MongoDB 配置を選択するために、次の手順を順番に実行します。

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

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

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

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

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

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

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

まず、使用するサーバーを選択するための Python 関数を記述します。 サーバー選択関数は次の条件を満たす必要があります。

  • パラメータとしてServerDescriptionオブジェクトのリストを受け入れます

  • 読み取りまたは書込み操作に適したServerDescriptionオブジェクトのリストを返します

  • ServerDescriptionオブジェクトを作成または変更しません

次の例では、 ServerDescriptionオブジェクトを受け入れてリストを返すprefer_localという名前の関数を定義しています。

def prefer_local(server_descriptions):
...
return servers # list containing preferred servers

次に、関数本体にサーバー選択ロジックを実装します。 優先サーバーを選択するには、 ServerDescriptionクラスで定義されているプロパティを使用します。 localhostで実行中の MongoDB の配置のみを返すには、この例ではserver_descriptionsのサーバーでループ処理を行い、各サーバーのaddressプロパティで値"localhost"を確認します。

def prefer_local(server_descriptions):
servers = [
server for server in server_descriptions if server.address[0] == "localhost"
]
return servers

次に、アルゴリズムによって一致するサーバーが見つからない場合について考えてみましょう。 関数が空のリストを返す場合、アプリケーションは MongoDB と通信できません。 したがって、関数から少なくとも 1 つのServerDescriptionオブジェクトを含むリストを返します。

この例では、一致するサーバーが見つからない場合、 prefer_local関数は最初に引数として渡されたサーバーのリストを返します。

def prefer_local(server_descriptions):
servers = [
server for server in server_descriptions if server.address[0] == "localhost"
]
if not servers:
return server_descriptions
return servers

最後に、作成した関数を使用するように PyMongo に指示します。 そのためには、 MongoClientコンストラクターを呼び出し、関数名を値として指定したserver_selector引数を渡します。

client = pymongo.MongoClient("mongodb://<username>:<password>@<hostname>:<port>",
server_selector=prefer_local)

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

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