服务器选择算法
在本页面
MongoDB 驱动程序使用服务器选择算法选择要使用的副本集成员,或在连接到多个mongos实例时选择要使用的mongos实例。
服务器选择每操作一次。
读取副本集的首选项
服务器选择每个操作一次,并受read preference和localThresholdMS
设置控制。
将为每个操作重新评估读取的首选项。
3.4 版中的新增功能:MongoDB 3.4 添加了maxStalenessSeconds
读取首选项选项maxStalenessSeconds
来指定secondary可能遭受并仍然有资格进行读取操作的最大复制滞后或“陈旧性”。
Important
maxStalenessSeconds
读取首选项选项适用于从辅助目录读取的应用程序,并且希望避免从辅助目录中进行读取,而该辅助目录在复制主目录的写入操作时落后太多。例如,辅助节点可能由于其自身与主要节点之间的网络中断而停止复制。在这种情况下,Client 端应停止从辅助服务器读取数据,直到 Management 员解决中断并辅助服务器追赶为止。
Read Preference | Selection Process |
---|---|
primary (Default) | 驱动程序选择主要的。 |
secondary | 驱动程序将汇编一个合格的二级成员列表。 maxStalenessSeconds和tag sets可以进一步限制成员的资格。 |
如果合格成员列表不为空,则驱动程序确定哪个合格成员是“最近”成员(即,平均网络往返时间最低的成员),并通过添加平均往返时间来计算延迟窗口此“最近”的服务器和localThresholdMS
。驱动程序使用此延迟窗口将符合条件的成员列表缩减为该窗口内的成员。
从 await 时间窗口内的合格成员列表中,驱动程序随机选择一个合格成员。
| nearest |驱动程序将汇编一个合格成员列表(主要成员和次要成员)。 maxStalenessSeconds和tag sets可以进一步限制成员的资格。
如果合格成员列表不为空,则驱动程序确定哪个合格成员是“最近”成员(即,平均网络往返时间最低的成员),并通过添加平均往返时间来计算延迟窗口此“最近”的服务器和localThresholdMS
[1]。驱动程序使用此延迟窗口将符合条件的成员列表缩减为该窗口内的成员。
从 await 时间窗口内的合格成员列表中,驱动程序随机选择一个合格成员。
| primaryPreferred |如果主要数据库可用,则驱动程序选择主要数据库。
否则,服务器选择将遵循读取首选项secondary
的过程。
| secondaryPreferred |按照读取首选项secondary
的服务器选择过程,如果合格的二级成员列表为非空,则驱动程序将选择合格的二级成员。
否则,如果列表为空,则驱动程序选择主要的。
分片群集的读取首选项
Load Balancing
如果连接种子列表中有多个mongos实例,则驱动程序确定哪个mongos是“最近的”(即平均网络往返时间最低的成员),并通过添加平均往返时间来计算延迟窗口此“最近”的mongos实例和localThresholdMS
的跳闸时间。驱动程序将在延迟窗口内的mongos个实例之间随机进行负载均衡。
读取首选项和分片
对于具有副本集分片的分片集群,当从分片读取时,mongos将应用读取首选项。服务器的选择受read preference和replication.localPingThresholdMs设置控制。
3.4 版中的新增功能:MongoDB 3.4 添加了maxStalenessSeconds
读取首选项选项maxStalenessSeconds
来指定secondary可能遭受并仍然有资格进行读取操作的最大复制滞后或“陈旧性”。
Important
maxStalenessSeconds
读取首选项选项适用于从辅助目录读取的应用程序,并且希望避免从辅助目录中进行读取,而该辅助目录在复制主目录的写入操作时落后太多。例如,辅助节点可能由于其自身与主要节点之间的网络中断而停止复制。在这种情况下,Client 端应停止从辅助服务器读取数据,直到 Management 员解决中断并辅助服务器追赶为止。
在版本 3.0 中进行了更改:将重新评估每个操作的读取首选项。
Read Preference | Selection Process |
---|---|
primary (Default) | mongos选择主要的。 |
secondary | mongos汇总了合格的二级成员列表。 maxStalenessSeconds和tag sets可以进一步限制成员的资格。 |
如果合格成员列表不为空,则mongos确定哪个合格成员是“最近”成员(即,平均网络往返时间最低的成员),并通过添加平均往返时间来计算延迟窗口此“最近的”服务器和replication.localPingThresholdMs(或--localThreshold命令行选项)。 mongos使用此延迟窗口将符合条件的成员列表缩减为该窗口内的那些成员。
mongos从此 await 时间窗口内的合格成员列表中,随机选择一个合格成员。
| nearest | mongos汇集了合格成员(主要和次要成员)的列表。 maxStalenessSeconds和tag sets可以进一步限制成员的资格。
如果合格成员列表不为空,则mongos确定哪个合格成员是“最近”成员(即,平均网络往返时间最低的成员),并通过添加平均往返时间来计算延迟窗口此“最近的”服务器和replication.localPingThresholdMs(或--localThreshold命令行选项)[1]。 mongos使用此延迟窗口将符合条件的成员列表缩减为该窗口内的那些成员。
mongos从此 await 时间窗口内的合格成员列表中,随机选择一个合格成员。
| primaryPreferred |如果主要数据库可用,则mongos选择主要数据库。
否则,服务器选择将遵循读取首选项secondary
的过程。
| secondaryPreferred |在针对读取首选项secondary
的服务器选择过程之后,如果合格的二级成员列表为非空,则mongos选择合格的二级成员。
否则,如果列表为空,则mongos选择主要数据库。
[1] | *(1,2)*默认阈值为 15 毫秒。 |