服务器选择器示例#

用户可以对 server selection algorithm 通过设置 server_selector 选择权 MongoClient 给一个合适的电话。这个例子展示了如何使用这个功能来选择运行在上面的服务器 localhost .

警告

使用自定义服务器选择器功能是超级用户的一项功能。误用自定义服务器选择器可能会产生意想不到的后果,例如读/写性能下降。

示例:选择运行在上的服务器 localhost#

首先,我们需要编写将要使用的服务器选择器函数。服务器选择器函数应接受 ServerDescription 对象并返回适合读或写操作的服务器描述的列表。服务器选择器不能创建或修改 ServerDescription 对象,并且必须返回未更改的选定实例。

在本例中,我们编写了一个服务器选择器,它对运行在其上的服务器进行优先级排序 localhost . 当使用具有多个 mongos ,因为本地运行的查询可能会看到更低的延迟和更高的吞吐量。但是,请注意,如果愿意,它高度依赖于应用程序 localhost 是否有益。

除了将主机名与 localhost ,当没有服务器运行时,我们的服务器选择器函数会考虑边缘情况 localhost . 在这种情况下,我们允许默认服务器选择逻辑通过未更改的接收服务器描述列表来实现。如果不这样做,将导致客户端无法在没有服务器运行的情况下与MongoDB通信 localhost .

所述的服务器选择逻辑在以下服务器选择器函数中实现:

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

最后,我们可以创建一个 MongoClient 具有此服务器选择器的实例。

>>> client = MongoClient(server_selector=server_selector)

服务器选择过程#

本节将深入探讨读写服务器的选择过程。在写入的情况下,驱动程序在选择过程中(按顺序)执行以下操作:

  1. 从已知主机列表中选择所有可写服务器。对于副本集,这是主副本集,而对于分片集群,这是所有已知的mongose。

  2. 应用用户定义的服务器选择器函数。请注意,自定义服务器选择器是 not 如果上一个筛选阶段没有剩余的服务器,则调用。

  3. 应用 localThresholdMS 设置为剩余主机的列表。这使得主机列表只包含延迟最多的服务器 localThresholdMS 比观察到的最低延迟高毫秒。

  4. 从剩余主机列表中随机选择一个服务器。然后对所选服务器执行所需的操作。

在.的情况下 reads 除了第一步,其他过程都是一样的。在这里,我们不选择所有可写服务器,而是选择与用户的服务器匹配的所有服务器 ReadPreference 从已知主机列表中删除。例如,对于包含3个成员的复本集 Secondary 阅读首选项,我们将选择所有可用的次要文件。