MongoDB Server選択をカスタマイズ
Overview
すべての MongoDB ドライバーは、読み取りまたは書き込みのサーバーを選択するときに定義されたアルゴリズムに従います。 MongoClient
の server_selector
プロパティを使用すると、このアルゴリズムをカスタマイズして、アプリケーションに最適に動作するサーバーを選択できます。
重要
サーバー選択アルゴリズムをカスタマイズすると、読み取りや書込みパフォーマンスの低下など、意図しない結果が生じる可能性があります。
カスタマイズされた選択アルゴリズム
PyMongo が読み取り操作を実行するときは、MongoDB 配置を選択するために、次の手順を順番に実行します。
既知のサーバーのリストから、PyMongo はアクティブな読み込み設定(read preference)と一致するすべてのサーバーを選択します。
少なくとも 1 つの読み取り可能なサーバーが存在する場合、PyMongo はユーザー定義のサーバー セレクター関数を呼び出し、前のステップのリストを渡します。
PyMongo は、関数から返されるサーバーのリストに
localThresholdMS
接続設定を適用します。PyMongo は、リストに残っているサーバーからランダムにサーバーを選択し、このサーバーに対して操作を実行します。
PyMongo が書込み (write) 操作を実行する際、まず、アクティブな 読み込み設定 (read preference) と一致するサーバーだけでなく、すべての書込み可能なサーバーを選択します。 残りの手順は同一です。
server_selector
引数を使用しない場合にドライバーが従うデフォルトのサーバー選択アルゴリズムの詳細については、 MongoDB Serverマニュアルの サーバー選択アルゴリズム を 参照してください。
例: でサーバーを選択します localhost
複数の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://<db_username>:<db_password>@<hostname>:<port>", server_selector=prefer_local)
API ドキュメント
PyMongo のサーバー選択アルゴリズムをカスタマイズする方法の詳細については、次の API ドキュメントを参照してください。