Docs 菜单
Docs 主页
/ / /
pymongo
/

自定义MongoDB Server选择

在此页面上

  • 概述
  • 自定义选择算法
  • 示例:Select Servers on localhost
  • API 文档

所有 MongoDB 驱动程序在选择要读取或写入的服务器时都遵循定义的算法。 通过使用 的server_selector MongoClient属性,您可以自定义此算法以选择最适合您的应用程序的服务器。

重要

自定义服务器选择算法可能会产生意想不到的后果,例如读取或写入性能下降。

当 PyMongo 执行读取操作时,它会按顺序执行以下步骤,以选择 MongoDB 部署:

  1. 从已知服务器列表中,PyMongo 选择与主动读取偏好匹配的所有服务器。

  2. 如果至少存在一个可读服务器,PyMongo 会调用用户定义的服务器选择器函数并传入上一步中的列表。

  3. PyMongo 将localThresholdMS连接设置应用于从该函数返回的服务器列表。

  4. PyMongo 从仍在列表中的服务器中随机选择一个服务器,并针对该服务器执行操作。

当 PyMongo 执行写入操作时,它首先选择所有可写服务器,而不仅仅是那些与活动读取偏好匹配的服务器。其余步骤相同。

要了解有关默认服务器选择算法(当您不使用server_selector参数时驱动程序遵循的算法)的更多信息,请参阅 MongoDB Server 手册中的服务器选择算法

使用具有多个mongos服务器的分片集群时,您可能希望首选在localhost上运行的部署。 针对这些部署的操作通常具有更低的延迟和更高的吞吐量。 此示例演示如何自定义服务器选择算法以支持在localhost上运行的服务器。

首先,编写一个 Python 函数来选择首选服务器。 服务器选择函数必须满足以下条件:

  • 接受ServerDescription对象列表作为参数

  • 返回适合读取或写入操作的ServerDescription对象列表

  • 不创建或修改任何ServerDescription对象

以下示例定义了一个名为prefer_local的函数,该函数接受并返回ServerDescription对象的列表:

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 通信。因此,请从函数中返回一个至少包含一个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)

有关自定义 PyMongo 的服务器选择算法的更多信息,请参阅以下 API 文档:

后退

压缩网络流量