服务器选择和监控
在此页面上
服务器选择和监控
在执行任何操作之前, MongoDB PHP库必须首先从拓扑结构选择一台服务器(例如 副本集、分片集群)。 选择服务器需要准确的拓扑结构视图,因此该扩展会定期监控其连接的服务器。
在大多数其他驱动程序中,服务器发现和监控由背景线程处理。但是, PHP驾驶员是单线程的,因此必须在应用程序启动的操作之间执行监控。
考虑以下示例应用程序:
/** * When constructing a Client, the library creates a MongoDB\Driver\Manager * object from the extension. In turn, the extension will either create a * libmongoc client object (and persist it according to the constructor * parameters) or re-use a previously persisted client. * * Assuming a new libmongoc client was created, the host name(s) in the * connection string must be resolved via DNS. Likewise, if the connection * string includes a mongodb+srv scheme, SRV/TXT records must be resolved. * Following DNS resolution, the driver should then have a list of one or * more hosts to which it can connect. This is referred to as the seed list. * * If a previously persisted client was re-used, no DNS resolution is needed * and there will likely already be connections and topology state associated * with the client. * * Drivers perform no further IO when constructing a client, so control is * returned the the PHP script. */ $client = new MongoDB\Client('mongodb://a.example.com:27017/?replicaSet=rs0'); /** * The library creates a MongoDB\Database object from the Client. This does * not entail any IO, as the Database and Collection objects only associate * a database or namespace with a Client object, respectively. */ $database = $client->test; /** * The library creates an internal object for this operation and must select * a server to use for executing that operation. * * If this is the first operation on the underlying libmongoc client, it must * first discover the topology. It does so by establishing connections to any * host(s) in the seed list (this may entail TLS and OCSP verification) and * issuing "hello" commands. * * In the case of a replica set, connecting to a single host in the seed list * should allow the driver to discover all other members in the replica set. * In the case of a sharded cluster, the driver will start with an initial * seed list of mongos hosts and, if SRV polling is utilized, may discover * additional mongos hosts over time. * * If the topology was already initialized (i.e. this is not the first * operation on the client), the driver may still need to perform monitoring * (i.e. "hello" commands) and refresh its view of the topology. This process * may entail adding or removing hosts from the topology. * * Once the topology has been discovered and any necessary monitoring has * been performed, the driver may select a server according to the rules * outlined in the server selection specification (e.g. applying a read * preference, filtering hosts by latency). */ $database->command(['ping' => 1]);
虽然该应用程序只有几行 PHP 代码,但其幕后工作其实相当繁重!有兴趣的读者可以在以下文档中找到更详细的讨论过程:
单线程模式 在 libmongoc 文档中
连接字符串选项
有多个与服务器选择和监控相关的连接string选项。
connectTimeoutMS
connectTimeoutMS
指定与服务器建立连接的限制以及用于服务器监控的套接字超时( hello
命令)。 对于 PHP 等单线程驱动程序,默认值为 10 秒。
当服务器在监控期间超时时,至少五秒后才会重新检查( ooldownMS )已过去。此超时旨在避免单线程驱动程序在出错后的每次后续扫描中因connectTimeoutMS
而区块。
应用程序可以考虑将此选项设置为略大于集群中服务器之间的最大延迟。例如,如果 PHP 应用程序服务器和数据库服务器之间的最大 ping
时间为 200 ms,则将超时时间指定为一秒可能是合理的。这将为建立连接和监控可访问的服务器留出充足的时间,同时还能显著缩短检测不可访问服务器的时间。
heartbeatFrequencyMS
heartbeatFrequencyMS
决定监测的频率。对于单线程驱动程序,该值默认为 60 秒,最低可设置为 500 毫秒。
serverSelectionTimeoutMS
serverSelectionTimeoutMS
确定在服务器选择循环中花费的最长时间。 该值默认为 30 秒,但如果serverSelectionTryOnce
为true
并且有较小的connectTimeoutMS
值,应用程序通常会更快失败。
最初的默认是在副本集选举需要更长的时间才能完成时建立的。 应用程序可以考虑将此选项设置为略长于选举的预期完成时间。 示例,副本集选举规定选举通常不会超过12秒,因此15秒超时可能是合理的。 连接到分分片集群的应用程序仍可考虑使用较小的值,因为mongos
可使驾驶员免受选举的影响。
也就是说, serverSelectionTimeoutMS
通常不应设立为小于connectTimeoutMS
的值。
serverSelectionTryOnce
serverSelectionTryOnce
确定驱动程序是应该在第一次服务器选择尝试失败后放弃,还是继续等待,直到达到serverSelectionTimeoutMS
。 PHP 默认为true
,允许驱动程序在无法选择服务器时“快速失败”(例如 故障转移期间没有主节点)。
对于高流量的 Web 应用程序来说,默认行为通常是可取的,因为这意味着工作进程不会在服务器选择循环中被阻塞,而是可以返回错误响应并立即继续处理另一个请求。此外,其他驱动程序功能(如可重试读取和写入)仍可使应用程序避免暂时性错误,例如故障转移。
也就是说,将弹性优先级置于响应时间(和工作线程池利用率)之上的应用程序可能需要为false
serverSelectionTryOnce
指定 。
socketCheckIntervalMS
socketCheckIntervalMS
确定在最近未使用套接字的情况下应检查(使用ping
命令)套接字的频率。 默认为 5 秒,并故意低于heartbeatFrequencyMS
,以便更好地允许单线程驱动程序恢复断开的连接。
socketTimeoutMS
socketTimeoutMS
确定读取或写入套接字所花费的最长时间。 由于服务器监控使用connectTimeoutMS
进行套接字超时,因此socketTimeoutMS
仅适用于应用程序执行的操作。
socketTimeoutMS
默认为 分钟;但是,由于5 max_execution_time , PHP Web请求可能会提前终止 ,对于30 Web SAPI,该值默认为 秒。在CLI环境中, max_execution_time
默认没有限制,因此更有可能达到socketTimeoutMS
。
注意
socketTimeoutMS
与服务器选择和监控没有直接关系;但是,它经常与其他选项联系在一起,因此值得一提。