返回介绍

架构原理篇

发布于 2024-10-02 23:28:20 字数 2564 浏览 0 评论 0 收藏 0

MongoDB 是由 C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

存储结构

MongoDB3.0 引入了插件式存储引擎 API,为第三方的存储引擎厂商加入 MongoDB 提供了方便,这一变化无疑参考了 MySQL 的设计理念。

1574510250011

图 11 mongodb 插件式存储引擎

备注:

  1. MMAP 是 MongoDB 的原生存储引擎,有以下缺陷:耗费磁盘空间和内存空间且难以清理,库级别锁。
  2. WiredTiger:收购存储引擎厂商 WiredTiger,将 WiredTiger 存储引擎集成进 3.0 版本(仅在 64 位版本中提供)。支持文档级别并发控制;磁盘数据压缩。

存储结构

MongoDB 的数据目录下主要存储有:预写日志(journal)、集合的数据(collection)、集合的索引(index)。

1574510270814

图 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 本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。

    1574510289110

图 13 mongodb 集群架构

单机 mongod 组成副本集 -> 分片,客户端通过 mongos 读取 config servers 的信息与分片通信,客户端程序感觉不到集群的存在,他只需要知道 mongos 服务器的 ip 和连接方式,至于它有多少个集群 ip 都不需要关注,mongos 会自动选择。

1574510305445

图 14 MongoDB 分片集群结构

上图中主要有如下所述三个主要组件:

  • Shard: 用于存储实际的数据块,实际生产环境中一个 shard server 角色可由几台机器组个一个 replica set 承担,防止主机单点故障
  • Config Server: mongod 实例,存储了整个 ClusterMetadata,其中包括 chunk 信息。
  • Query Routers: 前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文