此操作步骤介绍如何使用MongoDB中的 ingressConnectionEstablishmentRateLimiterEnabled
参数配置速率限制。速率限制器有助于保护您的部署免受可能影响系统稳定性和性能的连接风暴的影响。
开始之前
在开始此过程之前,请确保满足以下要求:
您拥有MongoDB 部署的管理权限
您了解系统的连接负载模式和要求
您了解驱动程序的
connectTimeoutMS
设置
步骤
启用速率限制器
要开始使用速率限制器,启用速率限制器:ingressConnectionEstablishmentRateLimiterEnabled
true
db.adminCommand( { setParameter: 1, ingressConnectionEstablishmentRateLimiterEnabled: true } )
设置连接建立速率
将 ingressConnectionEstablishmentRatePerSec
设置为集群在不对吞吐量产生负面影响的吞吐量下可以处理的最大速率。这应该是一个固定数字,不会因其他工作负载动态而变化。
db.adminCommand( { setParameter: 1, ingressConnectionEstablishmentRatePerSec: 20 } )
配置连接队列深度
根据以下公式设置ingressConnectionEstablishmentMaxQueueDepth
:
maxQueueDepth < (establishmentRatePerSec / 1000) * (connectTimeoutMs - ((averageTimeToCompletedHelloMicros-averageTimeQueuedMicros)*1000))
此公式可确保:
在驾驶员放弃连接尝试之后,新的连接尝试不会保留在队列中。
大多数
hello+auth
尝试都会成功,而不是由于超时错误而失败。
averageTimeQueuedMicros
指标可以帮助调整 ingressConnectionEstablishmentMaxQueueDepth
,因为它大约等于 (maxQueueDepth / establishRatePerSec) * 1e6
。
重要
调整队列大小时,优先考虑较长的队列,而不是较短的队列。与连接在队列中停留时间过长和超时相比,驱动程序由于关闭连接而清除连接池的风险更大。
配置驾驶员设置
如果发现连接失败,请降低驱动程序的maxPoolSize
和maxConnecting
设置。如果减少这些设置,驾驶员会重复使用连接,而不是在延迟增加期间打开更多与服务器的连接,这可能会导致连接风暴。
注意
如果减少 maxPoolSize
和 maxConnecting
,查询可能会在驾驶员层等待连接返回到池中花费更长的时间。减少这些设置有助于保持可用性,但费用在负载峰值期间增加延迟。
监控和故障排除
监控以下指标,确保正确配置速率限制器:
如果您发现被拒绝的连接数量不断增加,请考虑:
ingressConnectionEstablishmentRatePerSec
如果集群似乎有足够的 CPU 资源来处理此负载,则增加 。查看驾驶员连接池设置。