Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >MongoDB 集群请求连接被拒绝的分析

MongoDB 集群请求连接被拒绝的分析

作者头像
MongoDB中文社区
发布于 2019-04-22 07:58:55
发布于 2019-04-22 07:58:55
2.5K0
举报
文章被收录于专栏:MongoDB中文社区MongoDB中文社区

背 景

某运营商搭建了一套 MongoDB 集群,承载了大大小小的几十个非计费类应用,1亿左右的用户量,随着访问量的增加,业务繁忙时期偶尔出现连接拒绝的错误。

分 析

为了搞清楚原因,先从mongo访问数据库的模式说起,如下图:

我们发现客户端的请求是通过驱动连接到mongos或mongod的。

如果有多个实例化的MongoClient,那么就会有多个对应的连接池。

通过调试看到MongoClient的连接池大小默认值为100。可以在代码里面通过MaxConnectionPoolSize属性来修改默认值。

但mongod或mongos能支持的最大并发访问连接数还与服务端实例上的maxConn这个参数有关。

连上实例后通过命令:db.serverStatus().connections可以查看这个参数值,如下图所示输出:

Current表示当前到实例上正在运行的连接数。

Available表示当前实例还可以支持的并发连接数。

TotalCreated表示当前实例从启动到现在一共创建的连接数,包括历史已经关闭了的。

也就是说此mongod或mongos最大能支持的并发连接数为:Current+available=819.

那这个819是怎么来的?

它其实是由maxIncomingConnections (4.0版本里面参数名改为maxConn)和操作系统单个进程能打开的最大文件描述符数总量的80%决定的,取两个之间的最小值。

可以通过如下命令查看操作系统的限制,如下图:

可以看到单个进程能打开的最大文件描述符数为1024,1024*80% = 819.2 取整数819.

而maxConn参数的默认值65536.

所以最大可以支持的并发连接数为819,刚好等于前面的current+available.

验 证

为了模拟出生产环境的错误,首先将参数maxConn设置为10,也就是让服务器mongod或mongos最大支持10个并发,配置文件修改如下:

通过命令检查最大并发连接确实变为10,如下:

下面写一段代码测试,目的是模拟多线程请求,并发线程为29个,驱动连接池设为20,MongoClient设为“单例”模式,如下:

执行后看日志出现如下错误:

可以看到当并发的连接到达10个后,第11个连接被拒绝了。因为服务端此时设置的maxConn就为10.

下面再次修改服务器上的maxConn参数为100,其它参数不变,测试第二个场景。

程序和上面一样,执行后的日志输出如下,可以看到通过修改服务端的连接数参数maxConn,客户端的20个并发线程都可以成功连接到mongod实例。

在运行过程中也可以监控到,一共21个连接,与预想的一样。

最后测试一个场景:将连接池大小设为5,其它参数不变,并发线程还是为20,服务端maxConn还是100.

运行上面代码,执行输出日志如下:

同时监控服务端连接数:

可以看到只打开了6个连接,说明受连接池大小的约束。

总 结

  1. mongod或mongos支持的最大并发连接数受操作系统ulimit(可通过/etc/security/limits.conf文件来配置)和服务端maxConn参数限制,取其中较小值,这两个参数均可调整。
  2. 如果客户端连接数超过mongod或mongos最大并发数, 会导致超过的连接请求被refused。
  3. 每个mongoClient会维护一个连接池,客户端的请求会通过连接池连接到mongod或mongos, 如果并发客户端请求数超过了连接池MaxConnectionPoolSize大小, 服务端mongod或mongos最多只打开MaxConnectionPoolSize个连接。其中某些连接会为多个客户端请求服务。

1

作 者

郭远威,大数据资深顾问,MongoDB中文社区联席主席。数据库专家,曾负责迁移英国第一大虚拟运营商; 负责实施了Afrimax集团在非洲多国的BI大数据系统,现负责策划电信领域大数据解决方案。著有《大数据存储MongoDB实战指南》一书。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-08-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Mongoing中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MongoS连接池问题学习笔记
在默认情况下,mongos对客户端的连接都是每个连接对应一个线程,每个线程1M的内存,所以连接数增多,对于MongoS的内存消耗还是很大的。
AsiaYe
2021/03/30
1.3K0
Mongos连接模型探究
经常有同学会问, client/mongos/mongod之间的连接模型是怎样的关系,一个客户端连接对应多少个对后端mongod的连接。这个问题是有意义的,因为我们知道,client到mongod之间的连接,是 one-thread-per-connection的模式的,而且每个连接线程默认分配1MB内存,一千个连接就是1GB的内存; 而且活跃连接多了,内核态的线程切换引起的性能开销又是一个让人头痛的问题。one-thread-per-connection的模型相当传统(落后),该模型将线程切换/调度交给操作系统管理,带来的结果就是:延迟不可控。不过mongos接入层的引入,较好的缓解了该问题,本文主要介绍mongos和mongod之间的连接池模型,以及调优参数项。
MongoDB中文社区
2018/12/27
1.4K0
MongoDB 如何使用内存?为什么内存满了?
Mongod 进程启动后,除了跟普通进程一样,加载 binary、依赖的各种library 到内存,其作为一个DBMS,还需要负责客户端连接管理,请求处理,数据库元数据、存储引擎等很多工作,这些工作都涉及内存的分配与释放,默认情况下,MongoDB 使用 Google tcmalloc 作为内存分配器,内存占用的大头主要是「存储引擎」与 「客户端连接及请求的处理」。
MongoDB中文社区
2019/03/05
2K0
叮咚买菜自建MongoDB上腾讯云实践
随着近年来公有云技术及云基础设施的发展,越来越多的企业转为使用公有云来托管自己的服务。云数据库因为数据可靠性、资源弹性、运维便捷行,云上数据库服务也正成为企业数据管理的较好的选择。   本文以叮咚买菜自建MongoDB数据库整体迁移上腾讯云MongoDB为背景,分享叮咚买菜上云过程中的遇到的疑难问题及对应的性能优化解决方法等,主要包括以下分享内容:    · 云上MongoDB版本选型    · 安全上云及切换方案    · 叮咚买菜业务侧性能优化    · 上云遇到的疑难问题及解决方法    · 自建上
腾讯云数据库 TencentDB
2021/12/15
4.2K3
MongoDB特定场景性能数十倍提升优化实践(记一次MongoDB核心集群雪崩故障)
某核心JAVA长连接服务使用MongoDB作为主要存储,客户端数百台机器连接同一MongoDB集群,短期内出现多次性能抖动问题,此外,还出现一次“雪崩”故障,同时流量瞬间跌零,无法自动恢复。本文分析这两次故障的根本原因,包括客户端配置使用不合理、MongoDB内核链接认证不合理、代理配置不全等一系列问题,最终经过多方努力确定问题根源。
MongoDB中文社区
2020/10/10
1.2K0
MongoDB特定场景性能数十倍提升优化实践(记一次MongoDB核心集群雪崩故障)
使用MongoDB进行分片
本文档回答了有关分片的常见问题。或者可以参考手册的分片章节,其提供了 分片的概述,包括如下细节:
MongoDB中文社区
2019/05/15
1.2K0
使用MongoDB进行分片
高可用mongodb集群(分片+副本):规划及部署
mongodb是最常用的nosql数据库,以下记录如何搭建高可用mongodb集群(分片+副本)
雪人
2022/10/13
3.5K0
011.MongoDB性能监控
MongoDB自带了mongostat 和 mongotop 这两个命令来监控MongoDB的运行情况。这两个命令用于处理MongoDB数据库变慢等等问题非常有用,能详细的统计MongoDB当前的状态信息。除此之外,还可以用db.serverStatus()、db.stats()、开启profile功能通过查看日志进行监控分析。
木二
2019/07/01
2.6K0
Vert.x源码-创建与解析MongDB配置 原
    io.vertx.ext.mongo.impl.MongoClientImpl;
随风溜达的向日葵
2018/08/15
1.1K0
利用MongoDB 分片集群(Sharded Cluster)实现高并发大数据处理
考虑这样一个场景,有个数据量有10多亿数据的设备库,里面存放了注册的设备的信息,并且设备数据还可能会递增,然后业务集群需要对指定条件的设备群发信息,那么如何才能高效的来处理这个问题那?
加多
2018/09/06
1.4K0
利用MongoDB 分片集群(Sharded Cluster)实现高并发大数据处理
从连接池到内存池
AI赋能万物,老码农的伙伴们也曾经开发了一个基于图数据库的知识问答系统,在压力测试的时候发现随着并发数的增加,响应的时延明显变长,看时延分布,是应用程序与图数据库之间的交互时延过长。结构不做调整,优化图数据库后,发现在并发量上来之后,效果仍不明显。
半吊子全栈工匠
2018/08/22
1.4K0
从连接池到内存池
MongoDB部署检查列表建议
MongoDB Manual (Version 4.2)> Administration
MongoDB中文社区
2020/09/21
1.2K0
MongoDB部署检查列表建议
jdbc是数据库连接池么_java的jdbc连接数据库
JDBC 是Java应用程序用来连接关系型数据库的标准API,为多种关系型数据库提供一个统一的访问接口。Sun公司一共定义4种 JDBC 驱动类型,一般使用第4种,该类型的Driver完全由Java代码实现,通过使用socket与数据库进行通信。
全栈程序员站长
2022/09/30
3.1K0
jdbc是数据库连接池么_java的jdbc连接数据库
MongoDB 分片集群技术
---- 在了解分片集群之前,务必要先了解复制集技术! ----  1.1 MongoDB复制集简介   一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合。复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础。 1.1.1 复制集的目的   保证数据在生产部署时的冗余和可靠性,通过在不同的机器上保存副本来保证数据的不会因为单点损坏而丢失。能够随时应对数据丢失、机器损坏带来的风险。   换一句话来说,还能提高读取能力,用户的读取服务器和写入服务器在不同的地方,而且,由不同的
惨绿少年
2018/03/30
2.4K0
有赞TCP网络编程最佳实践
本文是根据有赞中间件团队多年的TCP网络编程实践经验总结而来,目的是为了避免应用因各种网络异常而出现各种非预期行为,从而造成非预期的影响,影响系统稳定性与可靠性。
用户1278550
2021/06/16
9580
有赞TCP网络编程最佳实践
MongoDB性能分析之WiredTiger引擎
MongoDB的WiredTiger引擎可以设置其可使用的最大内存,由cacheSizeGB参数控制,单位为G,表示WiredTiger引擎能够缓存的最大热数据量。每一个连接数都会消耗内存使用,可通过命令行db.serverStatus().connections查看当前连接数,如果连接数较大可通过连接池的方式控制mongodb的连接数。
Power
2025/03/02
850
Mongo连接分析
在前面的文章中有分析过关系型数据库的连接,以及连接池的原理。在mongo数据库同样存在,经常看到有网友在问mongo 连接了数据库要不要关,怎么关。内置的数据库连接池是单线程还是多线程,mongo服务器为什么会杀游标,杀连接诸如此类的问题,其实这类问题基本上就是连接池的问题,而很多和关系型数据库是类似的,并不是mongo独有的。本文旨在梳理这些问题,进行一个全面的分析。
方丈的寺院
2019/08/05
2K0
Mongo连接分析
常见问题:MongoDB诊断
·为什么MongoDB会记录这么多“Connection Accepted”事件?
MongoDB中文社区
2019/06/24
1.1K0
巧用 maxTimeMS 服务端超时,避免承载亿级用户的腾讯云数据库MongoDB服务雪崩
腾讯云数据库MongoDB作为一款基于开源社区MongoDB版本的文档数据库产品,其承载着公司内外包括微信、看点、QQ音乐在内的亿级用户重量级APP产品。在某些场景的使用过程中,用户在客户端请求超时后会不断重试,可能导致服务端大量请求积压,出现恶性循环甚至导致服务雪崩。一般遇到这种情况,后台会自动检测并做服务降级,主动拒绝一部分用户请求,或者重启后端服务等举措来应对。但是这些措施对业务有损,或者不可自行恢复。 本文围绕 MongoDB 原生 maxTimeMS 特性和腾讯云MongoDB的优化,并结合 4
腾讯数据库技术
2021/10/14
7410
MySQL 最佳实践:程序端连接池配置
现代网站架构/业务架构越来越重视横向拓展的能力,随之而来的是 Server 或者容器的数量快速增长,但是传统 RDBMS 的扩展性无法跟上这种步伐,导致大量的数据库连接不断的在数据库端创建、断开,不仅性能方面受到影响,在个别极端情况下也会导致数据库本身出现卡死等影响业务的现象。
王文安@DBA
2020/09/30
5.1K0
MySQL 最佳实践:程序端连接池配置
相关推荐
MongoS连接池问题学习笔记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文