架构原理篇
MongoDB 是由 C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
存储结构
MongoDB3.0 引入了插件式存储引擎 API,为第三方的存储引擎厂商加入 MongoDB 提供了方便,这一变化无疑参考了 MySQL 的设计理念。
图 11 mongodb 插件式存储引擎
备注:
- MMAP 是 MongoDB 的原生存储引擎,有以下缺陷:耗费磁盘空间和内存空间且难以清理,库级别锁。
- WiredTiger:收购存储引擎厂商 WiredTiger,将 WiredTiger 存储引擎集成进 3.0 版本(仅在 64 位版本中提供)。支持文档级别并发控制;磁盘数据压缩。
存储结构
MongoDB 的数据目录下主要存储有:预写日志(journal)、集合的数据(collection)、集合的索引(index)。
图 12 MongoDB 数据文件内部结构
说明:Collection -- Extent -- Doc
MongoDB 在数据存储上按命名空间来划分,一个 Collection 是一个命名空间,一个索引也是一个命名空间
同一个命名空间的数据被分成很多个 Extent,Extent 之间使用双向链表连接
在每一个 Extent 中,保存了具体每一行的数据,这些数据也是通过双向链接连接的
每一行数据存储空间不仅包括数据占用空间,还可能包含一部分附加空间,这使得在数据 update 变大后可以不移动位置
索引以 BTree 结构实现
MongoDB 的逻辑结构是一种层次结构,主要由:文档 (Document)、集合 (Collection)、数据库 (database) 这三部分组成。
MongoDB 的文档 (Document),相当于关系数据库中的一行记录。
多个文档组成一个集合 (Collection),相当于关系数据库的表。
多个集合 (Collection),扩及上组织在一起,就是数据库(database)。
一个 MongoDB 实例支持多个数据库 (database)。
集群架构
集群组件
单机实例 (mongod instance):只有一个单机实例,客户端与其直接连接使用。
副本集 (Replica sets):至少 3 个节点组成(一主多从)。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。
分片 (Sharding):将一个集合的数据分别存储在不同的 shard 节点上减轻单机压力。
路由服务器 (mongos):负责把对应的数据请求请求转发到对应的 shard 服务器上 mongos,相当于一个负载均衡器。
配置服务器 (mongos):存储所有数据库元信息(路由、分片)的配置。mongos 本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。
图 13 mongodb 集群架构
单机 mongod 组成副本集 -> 分片,客户端通过 mongos 读取 config servers 的信息与分片通信,客户端程序感觉不到集群的存在,他只需要知道 mongos 服务器的 ip 和连接方式,至于它有多少个集群 ip 都不需要关注,mongos 会自动选择。
图 14 MongoDB 分片集群结构
上图中主要有如下所述三个主要组件:
- Shard: 用于存储实际的数据块,实际生产环境中一个 shard server 角色可由几台机器组个一个 replica set 承担,防止主机单点故障
- Config Server: mongod 实例,存储了整个 ClusterMetadata,其中包括 chunk 信息。
- Query Routers: 前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论