前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MongoDB 集群请求连接被拒绝的分析

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

作者头像
MongoDB中文社区
发布2019-04-22 15:58:55
2.3K0
发布2019-04-22 15:58:55
举报

背 景

某运营商搭建了一套 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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档