自定义MongoDB Server选择
Overview
所有 MongoDB 驱动程序在选择要读取或写入的服务器时都遵循定义的算法。 通过使用 的server_selector
MongoClient
属性,您可以自定义此算法以选择最适合您的应用程序的服务器。
重要
自定义服务器选择算法可能会产生意想不到的后果,例如读取或写入性能下降。
自定义选择算法
当PyMongo执行读取操作时,它会按顺序执行以下步骤,以选择MongoDB 部署:
从已知服务器列表中,PyMongo 选择与主动读取偏好匹配的所有服务器。
如果至少存在一个可读服务器,PyMongo 会调用用户定义的服务器选择器函数并传入上一步中的列表。
PyMongo 将
localThresholdMS
连接设置应用于从该函数返回的服务器列表。PyMongo从仍在列表中的服务器,并对该服务器执行操作。
当PyMongo执行写入操作时,它首先选择所有可写入的服务器,而不仅仅是那些与活动读取偏好(read preference)匹配的服务器。 其余步骤相同。
要学习;了解有关默认服务器选择算法(当您不使用server_selector
参数时驾驶员遵循的算法)的更多信息,请参阅MongoDB Server手册中的服务器选择算法。
示例:Select Servers on localhost
使用具有多个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)
API 文档
有关自定义 PyMongo 的服务器选择算法的更多信息,请参阅以下 API 文档: