MongoDB 作为一个开源文档数据库,凭借其灵活可扩展、分布式等优势,逐渐得到国内外越来越多开发者的青睐。经过十几年的发展,MongoDB 的生态越来越完善。在近几年的 DB-Engines 排名中,MongoDB 稳居前五。
截至目前,关系型数据库仍然是学术界和工业界的主流,相信大学期间上过数据库课程的同学对 SQL、范式等概念都不陌生。NoSQL、文档数据库作为后起之秀并没有走进大多数人的视野,因此业界对其的分析和知识沉淀相对较少。
不少 MongoDB 开发者在查阅大量资料后明白了文档的概念,知道了如何配置分片表和负载均衡,并最终搞定了业务需求。但是在希望进一步了解 MongoDB 的底层原理时却步履维艰,不知从哪里分析代码,不知如何真正了解 MongoDB 底层运行的来龙去脉,只能面对 MongoDB 100 多万行代码望洋兴叹(使用 tokei 统计了 r4.0.28 和当前最新的 r7.0.0 版本,不含第三方库)。
几年前,我在机缘巧合之下接触了 MongoDB,然后又从事了国内云厂商 MongoDB 开发和运维工作。从一个没听过 MongoDB 名字的小白开始熟悉操作,了解它的基本原理和运作方式。但只是了解这些知识,距离真正掌控 MongoDB 还有很大差距。对我来说,曾经连续几小时处理一个线上问题而得不到根因,翻遍了 Google 也无济于事的场景记忆犹新。
于是,在后面的工作中主动熟悉 MongoDB 代码,分析社区 jira,做了很多的测试验证。在此过程中,自己记录很多的笔记和心得体会。现在通过 Github/Gitbook 进行总结,希望对学习 MongoDB 的开发者和运维人员有一定的帮助。
有一些公开的文档和书籍非常值得学习,它们详细介绍了 MongoDB 的基本原理、操作和架构设计的相关知识。列举如下:
参考文档 | 链接 |
---|---|
MongoDB 官方操作手册 | https://www.mongodb.com/docs/manual/ |
MongoDB Github Wiki | https://github.com/mongodb/mongo/wiki |
MongoDB 官方课程 | https://learn.mongodb.com/ |
MongoDB 中文社区 | https://mongoing.com/ |
MongoDB 官方设计文档 | https://github.com/mongodb/specifications/tree/master |
WiredTiger 官方文档 | https://source.wiredtiger.com/3.2.1/index.html |
WiredTiger Github Wiki | https://github.com/wiredtiger/wiredtiger/wiki |
一些中文电子书 | https://github.com/y123456yz/reading-and-annotate-mongodb-3.6/tree/master/%E6%96%87%E6%A1%A3%E5%8F%82%E8%80%83 |
本书计划分为下面几个章节进行阐述:
- 文档模型。说明 MongoDB 为什么被称为文档数据库。
- 复制集。深入分析 MongoDB 的一致性算法,以及 oplog、writeConcern、readPreference、readConcern 等特性的实现原理及其发挥的作用。
- 分片。包括分片集群的原理,以及路由、数据均衡等核心模块的实现。
- 执行器。包括锁和并发控制、执行计划的生成、副本集事务和分布式事务的实现。
- 最佳实践。包括一些业务的 MongoDB 使用经验,以及使用过程中经常会碰到的坑。
- 一些有趣的问题。主要来源于平时工作中和同事茶余饭后探讨的一些有趣话题。
- MongoDB 官方已经提供了比较丰富的学习资料。因此,本书主要结合内核代码对 MongoDB 的核心模块进行深入分析,并尽量避免和业界现有的资料重复。另外会结合自身积累的 MongoDB 运营经验对 MongoDB 的使用场景提出一些解决方案。
- MongoDB 内核版本的迭代速度很快,很多模块都会不断进行优化和重构,并增加新功能。因此,本书中涉及到的原理和代码分析会注明版本(以 4.0/4.2/4.4/5.0 为主),并给出对应的代码链接。如果引用了第 3 方的资料,也会通过链接注明出处。
- 除非特别说明,书中的分析和测试都是基于 linux x86_64 架构。
- 转载请注明出处,意见和建议请反馈至 github:https://github.com/pengzhenyi2015/MongoDB-Kernel-Study
彭振翼、尹超、杨林、杨哲、何洋、刘龙权
2023
广东