张程伟:MongoDB 技术分析 -TransportLayer
Posted ABCLink社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了张程伟:MongoDB 技术分析 -TransportLayer相关的知识,希望对你有一定的参考价值。
MongoDB 是非常流行的分布式文档型 NOSQL 数据库,拥有很好的性能表现和扩展能力,并且具有 Scheme-free,以及丰富的二级索引和周边生态,在互联网应用中有着广泛的使用场景。笔者因为工作原因接触到 MongoDB 数据库,在查找 MongoDB 的文档时发现大多是介绍怎么使用的文档,对 MongoDB 的内部实现原理介绍的很少,因此把自己对 MongoDB 3.4 版本代码的理解记录并分享出来。
MongoDB 主体上包含 3 个子系统:Mongos、ShardServer、ConfigServer;Mongos 负责将请求路由到对应的 ShardServer 节点,ShardServer 负责具体的数据库业务逻辑处理,ConfigServer 负责集群管理等工作。
本文介绍的 TransportLayer 是 MongoDB 的一个基础模块,负责网络服务端的收发包处理逻辑,是 Monogs、ShardServer 和 ConfigServer 中接收网络请求的公共模块,所有网络请求首先达到 TransportLayer 模块,然后再转交由业务模块处理。
TransportLayer 的业务逻辑
A
如上图所示,TransportLayer 包含如下几个功能:
启动时创建 listener 线程监听网络端口,接受客户端连接请求;
收到新连接后建立会话,并创建新的 conn 线程处理该连接的后续请求;
3.4 版本是为每个网络连接创建一个专用线程,并同步调用网络接口 recv/send 收发包;3.6 版本做了较大修改,引入了 boost.asio 库实现网络接口的异步调用并作为默认配置,同时还把线程模型调整为线程池,动态根据 workload 压力情况调整线程数量,在大量连接情况下可以避免产生大量的处理线程,降低线程切换开销,以获得更稳定的性能表现。
conn 线程循环处理:sourceMessage 从网络收包,processMessage 处理业务逻辑,sinkMessage 发送响应请求给客户端。
该部分逻辑在 mongos 或 mongod 的 service_entry_point 文件中_sessionLoop 函数中实现,进一步根据 message 的类型走不同 COMMAND 的处理流程。
TransportLayer 模块设计
ListenerLegacy 类负责监听端口,接收新连接;
MessagingPort 类负责具体收发包处理;
TransportLayerLegacy 的_handleNewConnection 函数会判断是否超过允许的最大连接数;
LegacySession 维持一个连接中多次操作的会话关系;
LegacyTicket 增加收发包超时机制。
分享人介绍 :
张程伟,华为云文档数据库架构师,NOSQL 内核技术研究团队 Leader,从事数据库和存储融合方向的技术研究工作,有十多年的企业存储及分布式存储研发经验。
ABCLink 社区
人工智能 大数据 云计算
技术 | 管理 | 分享 | 互助
以上是关于张程伟:MongoDB 技术分析 -TransportLayer的主要内容,如果未能解决你的问题,请参考以下文章