
本书主要包括MongoDB安装部署、增删改查、索引、聚集框架等基础知识;WiredTiger存储引擎、事务、复制集、分片集群等高阶知识;MongoDB的导入导出、备份恢复、性能监控、权限控制等运维管理知识;MongoDB的驱动、应用开发、来自中文社区的精选案例与问答等一线实践知识等。本书在满足现实中的数据库管理及应用需求的基础上,重点突出WiredTiger存储引擎和实践案例的讲解。
前言 数据就像流淌在身体中的血液,贯穿于一个企业或组织的全业务生产过程中。我们正生活在一个数据爆炸的时代,小到个体生命,大到世界500强企业,无时无刻不在生产数据与消费数据。与此同时,如何存储并与分析这些海量数据中蕴含的价值是数据工程师不断追求的目标。 总体来说,数据储算分析经历了近50年的发展,从20世纪70年代“关系模型”理论的提出,并基于此理论诞生了Oracle、DB2等数据库,数据储算分析正式进入商业数据库时代,并进行了快速发展。 从20世纪90年代开始,开源浪潮兴起,信息技术进入另一条高速发展通道,数据储算领域出现了MySQL、PostgreSQL等可以替代商业数据库的开源产品。截至目前,这类产品仍然在许多数据储算分析的应用场景中扮演着关键基础设施的角色。 从2000年开始,随着互联网浪潮到来,尤其是移动互联网的飞速发展,导致数据架构师和数据分析师等从业人员不得不面对指数级增长的数据,传统的数据储算技术已经不能适应这种场景。就在数据工程师采用打补丁式的技术手段勉强应对这种场景时,Google工程师在2003年发表了3篇具有划时代意义的文章,即GFS(分布式文件系统)、MapReduce(并行计算框架)、BigTable(可处理PB级数据量的分布式非关系型数据库)。基于这些文章中开创性的理论,在开源社区诞生了Hadoop、MongoDB等分布式、易扩展、高可用的非关系型数据库,也就是我们现在常说的NoSQL数据库。 作为全球热门的NoSQL数据库,MongoDB是本书研究的主要对象,它原生具备的分片集群特性保证了数据存储空间的横向易扩展,复制集及多副本自动选举特性保证了数据库的高可用性,可嵌套的文档特性保证了表结构自由定义。围绕这些核心特性,MongoDB还提供了一些可视化、流变更捕获、管道聚集及分布式文件系统等功能或工具,极大地方便了数据工程师进行海量数据的储算分析。 本书距离作者上一次撰写MongoDB相关书籍已经过去8年,在开源产品快速迭代更新的年代,MongoDB也已发生了巨大改变。例如,存储引擎从MMAP切换到更加复杂且性能更好的WiredTiger存储引擎,分片集群下多文档事务的引入、关联查询、地理位置索引与权限控制等内容发生了改变。因此,为了帮助读者重新梳理关于MongoDB的知识体系,更好地将其应用到实际业务场景中,有必要系统且全面地重新剖析MongoDB,这也是作者撰写本书的原因。 在撰写本书过程中,始终站在读者视角,对每章节的内容及顺序反复打磨,由于MongoDB的版本及新功能更新较快,有些章节甚至是在写完后推倒重新编写的。之所以这么做,其目的就是确保书中的每一个知识点都是最新且正确的,让读者知其然并知其所以然,并能从书中汲取营养。 本书全部内容都是以MongoDB 4.2版本为基础进行撰写的。 在撰写过程中得到了MongoDB中文社区全体伙伴的帮助,尤其是Tapdata创始人兼CEO唐建法,他也是MongoDB中文社区创建者,他对第12章的内容修改提供了帮助;OPPO公司文档数据库MongoDB负责人杨亚洲对第13章的内容修改提供了帮助;云本开源软件公司的系统架构师张志刚对第14章的内容修改提供了帮助。 本书从策划到立项得到了电子工业出版社李淑丽编辑的大力帮助。除此之外,还得到了MongoDB官网、中文社区核心成员、社区志愿者的帮助,在与你们一次次交流研讨中我获得了灵感,积累了知识,在此一并致以衷心的感谢。 本书内容 本书的内容按照循序渐进、由浅入深的原则组织,共分为4篇。 ?第1篇 MongoDB基础知识,包括以下几章内容。 第1章介绍MongoDB的发展历史、安装部署、应用场景等内容。 第2章介绍查询、插入、修改、删除等CRUD操作语法,对任何一种数据库来说,这是必不可少的功能。 第3章介绍索引与查询优化。 第4章介绍强大的聚集分析框架,为大数据分析提供了一把利器。 ?第2篇 深入理解MongoDB,包括以下几章内容。 第5章介绍WiredTiger存储引擎,包括存储引擎的数据结构、page eviction页面淘汰、checkpoint的原理、事务等。 第6章介绍MongoDB的复制集功能,包括复制集功能概述、复制集部署架构、完整部署一个复制集、复制集的维护等。 第7章介绍MongoDB的分片集群功能,以及如何实现海量数据的分布式存储和提高系统吞吐量。 第8章介绍MongoDB所特有的分布式文件存储功能,以及如何将图片、文件等格式的数据直接以二进制类型进行存储。 ?第3篇 MongoDB运维管理,包括以下几章内容。 第9章介绍管理与监控,包括数据导入/导出、数据备份/恢复、命令行工具监控管理、可视化数据库操作。 第10章介绍基于角色于权限控制原理、启动角色权限控制功能、MongoDB默认提供的角色、用户管理、角色管理等内容。 ?第4篇 MongoDB应用实践,包括以下几章内容。 第11章介绍以MongoDB为后端数据库,使用3种主流编程语言读/写数据库的API口,方便读者参考并运用到实际项目中。 第12章介绍基于MongoDB的数据中台案例,建设数据中台是企业数字化转型过程中的一个趋势。 第13章介绍百万级高并发集群性能提高案例,对运维海量数据的集群对象非常有意义。 第14章介绍基于MongoDB的金融系统案例。 第15章介绍云原生MongoDB部署案例。 第16章介绍常见问题分析,包括集合与关系型数据库表的区别、是否支持事务、锁的类型及粒度有哪些等。 本书特色 ?基础夯实:完整阐述了生产级数据库应该具备的基础功能。 ?理论剖析:本书是一本系统且全面介绍存储引擎的图书,读者能知其然并知其所以然。 ?实践探索:本书包含核心开发代码和部署实践,读者可以直接参考并运用到实际项目中。 ?案例丰富:通过大型企业的落地案例及广大mongo爱好者提出的问题分析,读者可以直接从中获取宝贵的经验。 ?内容全面:本书可以作为一本参考手册,读者需要时可以快速查找相应知识。 读者对象 ?系统开发人员,可以直接将MongoDB作为生产数据库使用。 ?数据库运维人员,可以参考书中大量的运维工具和性能调优案例。 ?大数据架构师,可以参考书中的部署架构并运用到实际项目中。 ?大数据分析师,可以参考书中聚集计算框架进行大数据分析。 ?大数据方案规划人员,可以结合书中的案例和理论知识进行落地方案规划。 ?数据库理论研究人员,可以参考书中存储引擎的底层分析,学习大部分数据库理论。
目录 第1篇 MongoDB基础知识 第1章 初识MongoDB 2 1.1 MongoDB的发展与现状 2 1.2 MongoDB与Hadoop比较 5 1.3 关键特性 8 1.4 安装部署 10 1.4.1 在Windows中安装MongoDB 11 1.4.2 在Linux中安装MongoDB 11 1.4.3 在Docker中安装MongoDB 13 1.5 几个重要的可执行文件 16 1.6 适合的业务 19 1.6.1 高并发Web应用 19 1.6.2 实时计算类的应用 20 1.6.3 数据中台 20 1.6.4 游戏类应用 21 1.6.5 日志分析类系统 22 1.6.6 AI应用场景 22 1.7 小结 24 第2章 CRUD操作 25 2.1 查询操作 25 2.1.1 查询条件 27 2.1.2 比较操作符 28 2.1.3 逻辑操作符 30 2.1.4 字段名匹配 31 2.1.5 文本查询 32 2.1.6 正则表达式 34 2.1.7 嵌套文档查询 34 2.1.8 数组查询 35 2.1.9 地理位置查询 38 2.1.10 查询投射与排序 40 2.2 插入操作 41 2.2.1 insertOne 41 2.2.2 insertMany 42 2.2.3 insert 44 2.3 修改操作 45 2.3.1 updateOne 45 2.3.2 updateMany 48 2.3.3 replaceOne 52 2.3.4 update 53 2.4 删除操作 55 2.4.1 deleteOne 55 2.4.2 deleteMany 55 2.5 批量写操作 56 2.6 小结 58 第3章 索引 59 3.1 索引原理 59 3.2 创建索引 61 3.3 单个字段的索引 61 3.4 多字段的复合索引 63 3.5 数组的多键索引 65 3.6 查询计划分析 66 3.7 索引覆盖查询 70 3.8 全文索引 71 3.9 地理位置索引 72 3.10 Hash索引 73 3.11 删除索引 73 3.12 TTL索引 74 3.13 小结 76 第4章 聚集操作 77 4.1 单个集合中的基础聚集函数 77 4.1.1 count()函数 77 4.1.2 estimatedDocumentCount()函数 79 4.1.3 countDocuments()函数 80 4.1.4 distinct()函数 80 4.2 管道聚集框架 82 4.2.1 $group分组 84 4.2.2 $addFields添加新字段 85 4.2.3 $lookup关联查询 86 4.2.4 $project投射 88 4.2.5 $out将结果输出到新集合 88 4.2.6 MongoDB聚集操作语句与SQL语句的比较 89 4.3 MapReduce编程 89 4.4 小结 92 第2篇 深入理解MongoDB 第5章 WiredTiger存储引擎 94 5.1 存储引擎的数据结构 95 5.1.1 典型的B-Tree数据结构 95 5.1.2 磁盘中的基础数据结构 96 5.1.3 内存中的基础数据结构 97 5.1.4 page的其他数据结构 99 5.2 page eviction页面淘汰 100 5.3 page reconcile将数据写入磁盘 101 5.4 Cache的分配规则 102 5.5 page的生命周期、状态、大小 103 5.5.1 page的生命周期 104 5.5.2 page的各种状态 105 5.5.3 page的大小参数 105 5.6 checkpoint的原理 107 5.6.1 checkpoint包含的关键信息 108 5.6.2 checkpoint执行流程与触发时机 109 5.7 wt工具和磁盘中的元数据文件 111 5.7.1 wt工具 111 5.7.2 元数据相关文件 112 5.8 事务 115 5.8.1 事务的基本原理 115 5.8.2 与事务相关的数据结构 118 5.8.3 事务的snapshot隔离 119 5.8.4 MVCC并发控制机制 120 5.8.5 事务日志(Journal) 122 5.9 一个完整的写操作流程 123 5.10 小结 124 第6章 复制集 125 6.1 复制集功能概述 125 6.2 复制集部署架构 126 6.2.1 典型的3节点复制集部署架构 126 6.2.2 多数据中心复制集部署架构 128 6.3 完整部署一个复制集 129 6.3.1 创建每个节点上存储数据的目录 129 6.3.2 创建每个节点的日志文件 130 6.3.3 创建每个节点启动时的配置文件 130 6.3.4 启动每个节点上的mongod实例 131 6.3.5 初始化复制集 131 6.3.6 将其他节点添加到复制集 132 6.3.7 观察复制集的运行状态 132 6.4 复制集的维护 137 6.4.1 删除节点 137 6.4.2 添加Secondary节点 138 6.4.3 添加Arbiter节点 140 6.4.4 复制集的配置信息 140 6.4.5 重新配置复制集 143 6.4.6 故障转移Failover分析 145 6.5 复制集选举Primary节点的机制 149 6.5.1 复制集中的投票节点和非投票节点 149 6.5.2 选举触发条件和选举为Primary节点的因素 150 6.5.3 复制集能正常完成选举的条件 152 6.6 基于Oplog的数据同步机制 154 6.6.1 Oplog集合包含的内容分析 155 6.6.2 Oplog的默认大小及性能影响 156 6.6.3 Oplog集合大小的修改 158 6.6.4 使用initial sync解决Oplog严重落后的问题 159 6.7 写关注(writeConcern)模式 162 6.7.1 默认的“写关注”场景 162 6.7.2 配置写关注 162 6.8 读参考(readPreference)模式 165 6.8.1 读参考常见的应用场景 166 6.8.2 读参考的几种模式分析 167 6.8.3 设置tags标签使读请求指向特定节点 168 6.8.4 如何从多个匹配的节点中选择一个目标 169 6.9 读关注(readConcern)模式 171 6.9.1 Primary节点切换可能导致数据回滚 171 6.9.2 设置读关注避免读到的数据被回滚 172 6.10 Change Streams实现数据实时同步 176 6.10.1 实现原理 176 6.10.2 实时数据流的格式 177 6.10.3 打开实时数据流 178 6.10.4 控制实时数据流的输出 179 6.11 小结 181 第7章 分片集群 182 7.1 分片集群的部署架构 182 7.2 手动部署一个分片集群 184 7.2.1 分片shard1配置 184 7.2.2 分片shard2配置 186 7.2.3 config服务器配置 187 7.2.4 mongos路由配置 188 7.2.5 启动分片集群 189 7.2.6 配置集合使其分片 192 7.2.7 正确关闭和重启集群 194 7.3 片键及选择策略 195 7.3.1 片键选择策略 197 7.3.2 基于Hash分片 200 7.3.3 基于范围的分片 203 7.4 chunk 204 7.4.1 chunk的分割 204 7.4.2 chunk大小的修改 209 7.5 Balancer 210 7.5.1 一个完整的chunk迁移过程 212 7.5.2 Balancer的管理 214 7.5.3 存储元数据的config数据库 217 7.6 小结 220 第8章 分布式文件存储GridFS 221 8.1 什么是GridFS 222 8.2 使用GridFS的场景 226 8.3 GridFS常用操作 227 8.3.1 上传文件 228 8.3.2 下载文件 229 8.3.3 删除文件 230 8.3.4 查询文件 230 8.4 小结 231 第3篇 MongoDB运维管理 第9章 管理与监控 234 9.1 数据导入/导出 234 9.1.1 导出工具mongoexport 235 9.1.2 导入工具mongoimport 237 9.2 数据备份/恢复 240 9.2.1 备份工具mongodump 241 9.2.2 恢复工具mongorestore 243 9.3 命令行工具监控管理 245 9.3.1 mongotop 246 9.3.2 mongostat 247 9.3.3 db.stats() 249 9.3.4 db.serverStatus() 251 9.4 可视化数据库操作 256 9.4.1 Compass工具的安装与连接 256 9.4.2 可视化性能监控 257 9.4.3 可视化数据库操作 258 9.4.4 可视化聚集操作 262 9.4.5 内嵌mongoshell开发环境 263 9.5 小结 264 第10章 权限控制 265 10.1 基于角色与权限控制原理 265 10.2 启动角色权限控制功能 267 10.3 MongoDB默认提供的角色 271 10.3.1 针对特定数据库中的读/写角色 271 10.3.2 针对特定数据库中的管理角色 272 10.3.3 针对所有数据库中的角色 272 10.3.4 超级用户角色 273 10.4 用户管理 274 10.4.1 查看数据库中的用户 274 10.4.2 创建新用户 275 10.4.3 修改用户的角色 276 10.4.4 删除用户 276 10.5 角色管理 277 10.5.1 查看数据库中的角色 278 10.5.2 查看角色对应的权限信息 278 10.5.3 创建一个自定义角色 280 10.5.4 验证自定义角色的权限 282 10.5.5 删除自定义的角色 283 10.6 小结 283 第4篇 MongoDB应用实践 第11章 MongoDB应用开发 286 11.1 基于Python的开发 286 11.1.1 单实例中的CRUD操作 287 11.1.2 复制集中的操作 290 11.1.3 分片集群中的操作 291 11.1.4 GridFS分布式文件操作 292 11.2 基于.net core的开发 294 11.2.1 CRUD操作 296 11.2.2 GridFS分布式文件操作 298 11.3 基于Java和Spring Boot框架的开发 301 11.3.1 开发框架介绍 301 11.3.2 CRUD操作 304 11.4 小结 306 第12章 基于MongoDB的数据中台案例 308 12.1 现代企业数据架构及痛点 308 12.2 什么是数据中台 309 12.3 数据中台的价值 312 12.4 数据中台的技术模块 313 12.5 基于MongoDB的数据中台方案 320 12.6 数据中台方案选型 327 12.7 小结 328 第13章 百万级高并发集群性能提高案例 329 13.1 背景 329 13.2 软件优化 330 13.2.1 业务层面优化 330 13.2.2 MongoDB线程模型优化 331 13.2.3 WiredTiger存储引擎优化 333 13.3 解决服务器系统磁盘I/O问题 342 13.3.1 服务器I/O硬件问题背景 342 13.3.2 服务器I/O硬件问题解决后性能对比 343 13.4 主节点硬件升级后续优化 346 13.4.1 readConcern配置优化 346 13.4.2 替换从节点服务器为升级后的高I/O服务器 350 13.4.3 结论 351 13.4.4 继续优化调整存储引起参数 352 13.5 小结 353 第14章 基于MongoDB的金融系统案例 355 14.1 项目背景 355 14.2 面临的主要挑战 355 14.3 技术选型 356 14.4 方案介绍 356 14.5 技术创新 358 14.6 技术特点 359 14.7 运营情况 360 14.8 项目成效 360 14.9 小结 361 第15章 云原生MongoDB部署案例 363 15.1 部署环境准备 363 15.2 Docker安装 364 15.3 Kubernetes组件安装 365 15.4 集群Master节点初始化 366 15.5 将Work节点添加到集群 369 15.6 分布式网络文件系统安装 369 15.7 PV、PVC、Deployment配置 372 15.8 小结 374 第16章 常见问题分析 375 16.1 集合与关系型数据库表的区别 375 16.2 是否支持事务 376 16.3 锁的类型及粒度有哪些 377 16.4 服务器的内存多大合适 378 16.5 如何解决join查询需求 379 16.6 创建索引对性能的影响 380 16.7 GridFS适合什么应用场景 381 16.8 Journaling、Oplog、Log三种日志的区别 382 16.9 连接数设置为多少合适 383 16.10 集合被分片后是否可以修改片键 387 16.11 为什么分片集合中的文档记录没有分布到所有分片上 387 16.12 通过mongos连接集群时连接数分析 387 16.13 复制集节点之间是否可以使用不同的存储引擎 388