分片集群Mongos到Shard请求管理

简介: MongoDB Sharded Cluster 原理 如果你还不了解 MongoDB Sharded cluster,可以先看文档认识一下 中文简介:MongoDB Sharded cluster架构原理 英文汇总:https://docs.mongodb.com/manual/sharding/ Mongos 到 Shard请求管理 Mongos 是 MongoDB 分片集群的访问入口,Mongos 收到 Client 访问请求,会根据从 Config Server 获取的路由表将请求转发到后端对应的 Shard 上。

MongoDB Sharded Cluster 原理

如果你还不了解 MongoDB Sharded cluster,可以先看文档认识一下

Mongos 到 Shard请求管理

Mongos 是 MongoDB 分片集群的访问入口,Mongos 收到 Client 访问请求,会根据从 Config Server 获取的路由表将请求转发到后端对应的 Shard 上。

MongoDB-3.2 版本里,Mongos 到 Shard 的请求由一组 TaskExecutor 来执行,TaskExecutor 可以简单理解为一个任务调度器,当Mongos 需要向 Shard 发送请求时,会将调用 TaskExecutor::scheduleRemoteCommand 将请求扔给调度器,然后等待任务执行完成。

_2017_03_31_4_01_23

关于 TaskExecutor

Mongos 会根据请求的类型来选择 TaskExecutor,写请求为了保证顺序,每次都会选择一个特定的 TaskExecutor 来执行任务。对于读请求 Mongos 会采用 RoundRobin 的方式从一组TaskExecutor 中来选择一个执行(默认会初始化CPU核数个 TaskExecutor)。

TaskExecutor 包含2个重要的组成部分,负责调度逻辑的的 NetworkInterfaceThreadPool, 以及负责实际IO操作的 NetworkInterfaceASIO,使用了 boost::ASIO,将所有IO操作都异步化,它包含一个连接池(ConnectionPool),用于管理 Mongos 到 Shard 的网络连接。

当 Mongos 需要向 Shard 发请求时,就会从连接池里获取一个新的网络连接,当没有空闲的网络连接时,则会创建新的网络连接,所以当客户端到 Mongos 并发请求很多时,Mongos 到 后端 Shard 的网络连接也会很多。

关于连接池

ConnectionPool 针对每 个Shard 机器维护一个连接池,这个连接池包含4个小的池子,用于管理连接的生命周期。

  • processingPool: 正在建立的连接
  • readyPool:已经建立并且可用的连接
  • checkoutPool: 正在使用的连接
  • droppedProcessingPool:失败的连接,需要释放

连接池管理规则

  1. 连接池的总连接会控制在[minConnections, maxConnections]之间,默认为1和无穷大
  2. 当需要新建连接时,会发起一个新建连接的异步请求,并把请求放到 processingPool
  3. 当连接建立成功后,会把请求转移到readyPool ,readyPool 里的连接可以直接用于服务新的请求
  4. 服务某个请求时会从 readyPool 里取出连接后,会将连接转移到 checkOutPool,标识为正在使用
  5. 连接使用完后,会归还到 readyPool
  6. 当遇到请求失败 或 一个网络连接空闲超过1分钟时,会释放连接

总结

Mongos 里 TaskExecutor 的个数默认为机器的 CPU 核数,也可以在启动时指定;如果一个机器上部署多个 MongoDB 进程,最好调整该值,可以一定程度上降低到后端 Shard 的连接数量。
修改 TaskExecutor 的方法如下

1. 启动命令行指定

mongos --setParameter taskExecutorPoolSize=16  

2. 配置文件指定

setParameter: 
   taskExecutorPoolSize: 16
   

如果 Client 访问 Mongos 的并发特别高,修改 TaskExecutor 也无法有效的控制 Mongos 到 Shard 的连接数,因为一旦没有了空闲的连接,就会创建新的。目前 Mongos 到 Shard 最大连接数还不支持配置,如果确实有需要,可以修改源码。

src/mongo/executor/connection_pool.h

- size_t maxConnections = std::numeric_limits<size_t>::max();
+ size_t maxConnections = 10000;
相关文章
|
存储 监控 安全
TG7100CWiFi&BLE双模芯片 一键连接AIoT平台让你快速自定义智能方案
面对市面上眼花缭乱的双模芯片,许多应用方案商往往挑花了眼,不知道该选择哪款。今天我们推荐是天猫精灵联合平头哥推出的TG7100CWiFi&BLE双模芯片。它具有低功耗、宽工作温度等特点,广泛适用于智能家居,电工照明等领域。
TG7100CWiFi&BLE双模芯片 一键连接AIoT平台让你快速自定义智能方案
|
机器人 数据中心
几个AC/DC电源模块的工业应用场景案例
几个AC/DC电源模块的工业应用场景案例
几个AC/DC电源模块的工业应用场景案例
|
存储 中间件 API
ThinkPHP 集成 jwt 技术 token 验证
本文介绍了在ThinkPHP框架中集成JWT技术进行token验证的流程,包括安装JWT扩展、创建Token服务类、编写中间件进行Token校验、配置路由中间件以及测试Token验证的步骤和代码示例。
ThinkPHP 集成 jwt 技术 token 验证
|
人工智能 移动开发 算法
禁忌搜索(Tabu Search)原理梳理和应用细节-附求解VRPTW问题C++代码
禁忌搜索(Tabu Search)原理梳理和应用细节-附求解VRPTW问题C++代码
禁忌搜索(Tabu Search)原理梳理和应用细节-附求解VRPTW问题C++代码
|
域名解析 弹性计算 安全
|
设计模式 移动开发 前端开发
基于逻辑复用的联合跨端思路与实践
跨端新思路助你业务研发事半功倍。
基于逻辑复用的联合跨端思路与实践
|
SQL 关系型数据库 Go
RDS SQL Server - 最佳实践 - 高CPU使用率系列之二索引碎片
# 摘要 上一篇文章分析了高CPU使用率的原因之一是索引缺失,接下来本系列文章之二的“索引碎片”是CPU高使用率的又一常见的原因。解决索引碎片问题是解决SQL Server服务响应缓慢,查询超时的又一利器。 # 问题引入 “鸟哥,我上一篇文章分享了因为索引缺失导致CPU高使用率的话题,反响不错。接下来,我打算分享索引碎片导致CPU高使用率的话题。”,菜鸟主动找到老鸟汇报工作。 上一篇文章详
4710 0
1000BASE-T/SX/LX/EX/ZX代表哪种SFP光模块?
今天给大家介绍常见的SFP光模块1000BASE-SX、1000BASE-LX、1000BASE-EX、1000BASE-ZX、1000BASE-T这五种传输介质标准代表是哪种光模块呢?1000BASE-LX、1000BASE-LH和1000BASE-LX/LH SFP光模块它们又有哪些区别?现由专业光模块制造商-易天光通信在本文中详细为你解答。
3558 0
|
边缘计算 物联网 云计算
【专访】阿里云朱照远:边缘计算成为CDN下半场竞争新赛道
2019年4月10日,“2019亚太内容分发大会”暨“2019亚太CDN峰会”在北京正式召开,阿里云视频云总经理朱照远出席本次活动,并就CDN、边缘计算、共享计算、P2P技术等行业热门话题与技术趋势及前景进行现场沟通。
3609 0
|
SQL BI 存储
【SQL&nbsp;Server】SQL&nbsp;Server占用CPU使用率100%的解决方法
原文:【SQL Server】SQL Server占用CPU使用率100%的解决方法 近日,帮一个客户解决了服务器CPU占用率高达100%的问题。 以前做的一个某污水处理厂自控系统项目,客户反映其自控服务器有故障,由于自控服务存放iFIX服务器端、现场多套PLC实时数据、过程数据、报表数据等重要软件和数据。
2510 0