问题现象
- Python连接文档数据库服务时的错误 :
- pymongo.errors.ServerSelectionTimeoutError:表示Python的MongoDB驱动(pymongo)无法选择可用的文档数据库服务服务器,连接超时。
- Java连接文档数据库服务时的错误 :
- com.mongodb.MongoTimeoutException:表示Java的MongoDB驱动无法在规定的时间内连接到文档数据库服务实例,连接超时。
可能原因
- 分片集群(Sharded Cluster):
- 读写请求过多,超过了分片集群的连接数上限。
- 部分分片服务器负载过高,无法处理更多的连接请求。
- 分片键设计不合理,导致部分分片集群负载不均衡。
- 副本集(Replica Set):
- 读写请求过多,超过了副本集的连接数上限。
- 副本集中的主节点(Primary)负载过高,无法处理更多的连接请求。
- 单节点实例:
- 读写请求过多,超过了单节点实例的连接数上限。
处理思路
- 请及时排查业务侧连接是否有效,优化实例连接,释放不必要的连接。
- 排查“net.maxIncomingConnections”参数的值及实例规格,修改参数值或对数据库进行规格扩容。
- 通过文档数据库服务控制台,基本信息页查看监控信息、CPU、内存、磁盘、连接数等指标,通过控制台的告警中心设置告警策略,出现告警时可以提前识别风险。
处理方法
优化实例连接,释放不必要的连接。
- 您可以通过重启实例来临时释放所有的连接。
- 您可以查询节点当前连接数,以及当前连接来源,分析各个终端和文档数据库服务实例分别建立了多少连接,并作出相应调整。
db.serverStatus().connections
{ "current" : 7, "available" : 398, "totalCreated" : 818364 }
#您需要关注以下参数及对应的值:
current:当前已经建立的连接数。
available:当前可用的连接数。
修改参数值或对数据库进行规格扩容。
- 通过文档数据库服务参数设置页面connPoolMaxConnsPerHost 的值进行调整,修改后重启实例生效。
- 如果调整连接数过大,可能导致服务崩溃,这时只能通过变更实例规格增加承载的连接数的数量。