易燃物汇聚 YouTube 有声书与书评
MongoDB权威指南(第3版) 封面

MongoDB权威指南(第3版)

香农·布拉德肖 克里斯蒂娜·霍多罗夫 约恩·布拉齐尔

5515人在读
37.6万字总字数
¥64.9定价

内容简介

与传统的关系数据库不同,MongoDB是一种面向文档的数据库。本书这一版共分为6个部分,涵盖开发、管理以及部署等各个方面。这一版对TTL和聚合管道等新特性进行了讲解,还增加了配置MongoDB的章节,涵盖面向文档的存储方式及利用MongoDB的无模式数据模型处理文档、集合和多个数据库,以及监控、安全性和身份验证、备份和修复、水平扩展MongoDB数据库等多方面的内容。

读者书评

★★★★★

本书内容结构 本书分为 6 个部分,涵盖开发、管理以及部署等方面的内容。 MongoDB 入门 第 1 章讲述 MongoDB 的背景,包括 MongoDB 创立的原因、试图达成的目标以及为什么要在项目中选用它。第 2 章更深入地介绍 MongoDB 的一些核心概念和术语,以及如何上手操作数据库和 shell。接下来的两章介绍 MongoDB 开发人员需要掌握的基础知识。第 3 章说明如何在不同的安全和速度等级下执行基本的写入操作。第 4 章解释如何查找文档和编写复杂的查询,以及如何迭代结果集。这一章会提供一些用于处理结果的方法,比如限制结果的数量、略过一些结果,以及对结果排序。 设计应用程序 第 5 章介绍什么是索引以及如何为 MongoDB 集合创建索引。第 6 章说明如何使用几种特殊类型的索引和集合。第 7 章涵盖使用 MongoDB 来聚合数据的技术,包括计数、查找唯一值、文档分组、聚合框架以及将这些操作的结果写入集合中。第 8 章介绍事务,内容包括什么是事务,如何在应用程序中使用事务,以及如何调优。在这个部分的最后,第 9 章介绍关于应用程序设计的内容,包括如何更好地在应用程序中使用 MongoDB。 复制 第 10 章开始介绍复制,包括如何快速地在本地建立一个副本集和许多可用的配置选项。第 11 章涵盖与复制相关的各种概念。第 12 章展示了副本集如何与应用程序进行交互。第 13 章介绍如何管理副本集。 分片 第 14 章开始介绍分片,并在本地展示如何快速进行分片。第 15 章大致介绍集群的组件以及如何进行设置。第 16 章针对如何为各种应用程序选择片键给出了建议。第 17 章介绍分片集群的管理。 应用程序管理 接下来的 3 章从应用程序的角度介绍 MongoDB 管理的各个方面。第 18 章讨论如何查看 MongoDB 正在进行的操作。第 19 章介绍与 MongoDB 安全相关的内容,以及如何配置身份验证和授权。第 20 章解释 MongoDB 如何对数据进行持久化存储。 服务器端管理 最后一部分主要讨论服务器端的管理。第 21 章介绍启动和停止 MongoDB 时的一些常用选项。第 22 章讨论对数据库进行监控时需要查看的统计信息以及查看的方法。第 23 章描述在不同部署类型中如何备份和恢复数据库。最后,第 24 章介绍在部署 MongoDB 时需要关注的一些系统设置。 附录 附录 A 介绍 MongoDB 的版本划分方式,以及如何在 Windows、macOS 和 Linux 系统中进行安装。附录 B 详细说明 MongoDB 的内部工作原理,内容包括存储引擎、数据格式和传输协议。

★★★★★

事无巨细的mongo使用手册,但对原理没有太深的介绍。可以作为工具书,对照目录查阅。

★★★☆☆

本书对 MongoDB 做了以下几个点的介绍 1. MongoDB的简介 1.1 易于使用 MongoDB 不是关系数据库,而是面向文档(document-oriented)的数据库。 MongoDB 中也没有预定义模式(predefined schema):文档键值的类型和大小不是固定的。由于没有固定的模式,因此按需添加或删除字段变得更容易。 1.2 易于扩展 MongoDB 会自动平衡跨集群的数据和负载,自动重新分配文档,并将读写操作路由到正确的机器上。 1.3 功能丰富 MongoDB 支持通用的二级索引,并提供唯一索引、复合索引、地理空间索引及全文索引功能。 MongoDB 提供了一种基于数据处理管道的聚合框架。 MongoDB 支持生命周期有限(TTL)集合,适用于保存将在特定时间过期的数据,比如会话和固定大小的集合,以及用于保存最近的数据(日志)。 1.4 性能卓越 它在其 WiredTiger 存储引擎中使用了机会锁,以最大限度地提高并发和吞吐量。它会使用尽可能多的 RAM(内存)作为缓存,并尝试为查询自动选择正确的索引。 2. 入门指南 文档是 MongoDB 中的基本数据单元,可以粗略地认为其相当于关系数据库管理系统中的行(但表达力要强得多)。 2.1 文档 文档是 MongoDB 的核心概念:它是一组有序键值的集合。 MongoDB 会区分类型和大小写 MongoDB 中的文档不能包含重复的键 2.2 集合 集合就是一组文档。如果将文档比作关系数据库中的行,那么一个集合就相当于一张表。 集合名称不能以 system. 开头,该前缀是为内部集合保留的。 用户创建的集合名称中不应包含保留字符 $。 使用 . 字符分隔不同命名空间的子集合是一种组织集合的惯例 2.3 数据库 数据库名称不能是空字符串("")。 数据库名称不能包含 /、\、.、"、*、<、>、:、|、?、$、单一的空格以及 \0(空字符),基本上只能使用 ASCII 字母和数字。 数据库名称区分大小写。数据库名称的长度限制为 64 字节。 通过将数据库名称与该库中的集合名称连接起来,可以获得一个完全限定的集合名称,称为命名空间。 2.4 数据类型 由于只有 null、布尔值、数字、字符串、数组和对象这几种类型,因此 JSON 的表达能力比较有限。 MongoDB 中存储的每个文档都必须有一个 "_id" 键。"_id" 的值可以是任何类型,但其默认为ObjectId。在单个集合中,每个文档的 "_id" 值都必须是唯一的,以确保集合中的每个文档都可以被唯一标识。 前 9 字节保证了 ObjectId 在 1 秒内跨机器和进程的唯一性。最后 3 字节只是一个递增计数器,负责确保单个进程中 1 秒内的唯一性。这允许在 1 秒内为每个进程生成多达 2563(16 777216)个唯一的 ObjectId。 3. 索引 概括来说,在设计复合索引时:等值过滤的键应该在最前面;用于排序的键应该在多值字段之前;多值过滤的键应该在最后面。 对数组创建索引就是对数组中的每个元素创建索引,而不是对数组本身创建索引。 通常来说,一个字段的基数越高,这个字段上的索引就越有用。 根据经验来说,应该在基数比较高的键上创建索引,或者至少应该把基数比较高的键放在复合索引的前面(在低基数的键之前)。 4. 范式化与反范式化 确定少与多的关系有助于决定数据的内嵌和引用。通常来说,“少”的关系使用内嵌的方式会比较好,“多”的关系使用引用的方式则比较好。 5. 同步 当一个从节点过期时,它将依次尝试从副本集中的每个成员进行复制,看看是否有成员拥有更长的oplog 以继续进行同步。如果没有一个成员拥有足够长的 oplog,那么该成员上的复制将停止,并且需要重新进行完全同步或从最近的备份中恢复。 6. 分片 分片是指跨机器拆分数据的过程,有时也会用术语分区(partitioning)来表示这个概念。 通常来说,如果在查询中没有使用片键,mongos 就不得不将查询发送到每个分片上。包含片键并可以发送到单个分片或分片子集的查询称为定向查询(targeted query)。必须发送到所有分片的查询称为分散–收集查询(scatter-gather query),也称为广播查询:mongos 会将查询分散到所有分片,然后再从各个分片收集结果。 mongod 反复尝试分裂某个块却无法成功的过程被称为拆分风暴(split storm)。防止拆分风暴的唯一方法是确保配置服务器尽可能正常运行。 均衡器负责数据的迁移。它会定期检查分片之间是否存在不均衡,如果存在,就会对块进行迁移。在MongoDB 3.4 以上的版本中,均衡器位于配置服务器副本集的主节点成员上,而在 MongoDB 3.4及之前的版本中,每个 mongos 会偶尔扮演“均衡器”的角色。 使用集群的应用程序不需要感知数据的迁移:所有读写请求都会被路由到旧的块上,直到迁移完成。一旦元数据被更新,任何试图访问旧位置数据的 mongos 进程都会收到一个错误。这个错误对客户端是不可见的:mongos 会默默地处理这个错误并在新的分片上重试此操作。 变更流(change stream)允许应用程序跟踪数据库中数据的实时变更。 在分片集群中使用变更流时,有一些事项需要注意。打开变更流可以通过发出打开变更流的操作来实现。在分片集群中,这个操作必须针对 mongos 发出。如果针对开启了变更流的分片集合运行带有 multi: true 的更新操作,那么可能会出现向孤儿文档发送通知的情况。如果一个分片被删除,那么这可能会导致打开的变更流游标关闭——而且,该游标可能无法恢复。 6. 选择片键 最常见的数据拆分方式是升序片键、随机分发的片键和基于位置的片键。 我们永远都无法使用哈希片键执行指定目标的范围查询。如果不打算执行范围查询,那么哈希片键就是一个很好的选择。 片键不能是数组。如果任何键有数组值,那么 sh.shardCollection() 就会失败,并且将数组插入该字段是不允许的。 7. 分片管理 迁移索引。如果这个分片以前从未保存过迁移集合的块,那么它需要知道都索引了哪些字段。如果这个集合中曾经有块迁移到这个分片,那么这个步骤将被忽略。 如果有多个 mongos 进程,则可能会创建超出分片处理能力的连接:默认情况下,一个 mongos 可以接受 65 536 个连接(与 mongod 一样),因此如果有 5 个 mongos 进程,每个与 10 000 个客户端连接,那么这些 mongos 可能会试图创建 50 000 个到分片的连接! 为了防止这种情况发生,可以在 mongos 的命令行配置中使用 --maxConns 选项来限制其可以创建的连接数。一个分片可以处理的单个 mongos 的最大连接数可以用以下公式来计算。maxConns = maxConnsPrimary - (numMembersPerReplicaSet × 3) - (other × 3) /numMongosProcesses 以下是公式的各个部分。maxConnsPrimary 主节点上的最大连接数,通常设置为 20 000,以避免来自 mongos 的连接冲垮分片。(numMembersPerReplicaSet × 3) 主节点会与每个从节点创建一个连接,而每个从节点会与主节点创建两个连接,所以总共有 3 个连接。(other × 3) 这里的其他是指可能连接到 mongods 的各种进程的数量,比如监视或备份的代理、shell 的直接连接(用于管理),或者为了迁移而连接到其他分片的连接。numMongosProcesses  分片集群中 mongos 的总数。 均衡器的任务是把要删除分片上的所有数据移动到其他分片上,这个过程称为排空(draining)。要排空数据,可以运行 removeShard 命令。 均衡过程会增加系统的负载:目标分片必须查询源分片块中的所有文档,将文档插入目标分片的块中,然后源分片必须删除这些文档。在以下两种特殊情况下,迁移会导致性能问题。 8. 应用程序管理 防止这些幻像写入的最好方法是执行写入确认机制:让每次写操作都等待,直到前一个写操作完成,而不是仅仅等到前一个写操作处于数据库服务器的缓冲区中就开始下一次写入。 使用日志机制的成员级别持久性: 为了在服务器发生故障时提供持久性,MongoDB 使用了一种称为日志(journal)的预写式日志(WAL)机制。WAL 是数据库系统中一种常用的持久性技术,其基本原理是,在将对数据库所做的更改应用到数据库本身之前,将对这些更改的一种表示写到持久介质(如磁盘)上。在许多数据库系统中,WAL 也被用来提供原子性这一数据库属性。然而,MongoDB 使用其他技术来确保原子写入。 从 MongoDB 4.0 开始,当应用程序对副本集执行写操作时,MongoDB 会使用与 oplog1 相同的格式创建日志条目 刷新数据文件的 60 秒间隔称为检查点(checkpoint)。日志用于为自上一个检查点以来写入的数据提供持久性。 通过写关注(write concern),可以指定应用程序在响应写请求时需要何种级别的确认。 在 MongoDB 中,读关注(read concern)允许对何时读取结果进行配置。这可以让客户端在写操作被持久化之前就看到写入的结果。读关注可以与写关注一起使用,以控制对应用程序的一致性和可用性的保证级别。不要将读关注与读偏好(read preference)相混淆,后者处理从何处读取数据的问题。具体来说,读偏好决定了副本集中承载数据的成员。默认的读偏好是从主节点中读取。 读关注决定了正在读取的数据的一致性和隔离性。默认的 readConcern 是 local,它所返回的数据不保证已经被写入了大多数承载数据的副本集成员。这可能会导致数据在将来的某个时刻被回滚。majority 读关注只返回被大多数副本集成员确认的持久数据(不会被回滚)。MongoDB 3.4 中增加了 linearizable 读关注,它确保返回的数据反映了在读操作开始之前已成功完成的经过大多数确认的写操作。在返回结果之前,它可能会等待那些正在并发执行的写操作完成。 当磁盘空间不足时,有以下几种选择。如果正在使用分片,那么可以再添加一个分片。删除未使用的索引。可以对特定集合使用 $indexStats 聚合来识别它们。如果还没有进行过压缩操作,那么可以在一个从节点上执行压缩看看是否有帮助。这通常只在从集合中删除了大量数据或索引且没有新数据替换的情况下才有用。关闭副本集的每个成员(一次一个),将其数据复制到更大的磁盘中并进行挂载。重新启动该成员,然后继续对下一个成员重复此操作。用较大驱动器的成员替换副本集中的成员:删除旧成员并添加新成员,然后让新成员追赶上副本集中的其余成员。对集合中的每个成员重复此操作。如果使用了 directoryperdb 选项,并且数据库增长速度非常快,则可以将数据库移动到其自身的驱动器中。然后将磁盘卷作为一个数据目录进行挂载。这样其他数据就不需要移动了。无论选择哪种技术,都需要提前计划以尽量减少对应用程序的影响。进行备份,依次修改集合中的每个成员,将数据从一个地方复制到另一个地方,这些操作都需要时间。 9. 服务器端管理 推荐的RAID配置 RAID0 将磁盘进行分割(striping)以提高性能。 RAID1 使用镜像(mirroring)以提高可靠性。 RAID5 对磁盘进行分割,并保留关于已存储其他数据的额外校验信息,以防止在服务器发生故障时丢失数据。 RAID10 这是 RAID0 和 RAID1 的组合方式:对数据进行分割以提升速度,同时对数据进行镜像以提高可靠性。 推荐使用 RAID10:它比 RAID0 更安全,并且可以解决 RAID1 可能出现的性能问题。 BSON 是一种轻量的二进制格式,能够将任何 MongoDB 文档表示为一串字节。数据库可以理解BSON 格式,而 BSON 也是文档保存到磁盘中的格式。 WiredTiger 存储引擎是 MongoDB 的默认存储引擎。当服务器启动时,它会打开数据文件并开始检查点和日志记录过程。它会与操作系统进行配合,操作系统的职责主要是对数据页进行载入载出,以及将数据刷新到磁盘上。该存储引擎有以下几个重要特性。 10. 小结 个人感觉O'Reilly系列的图书大部分对入门很有帮助,很大一部分解释了一些参数怎么使用,对运维会比较友好,对于开发来说,很多源码设计以及架构没怎么看到,不过对开发入门还是有一定的帮助,对MongoDB有一定全面的了解。

★★★☆☆

本书详细介绍了mongoDB的相关操作指导,涉及部分的副本高可用和分片原理,很多分布式数据库都采用类似架构方法,大同小异

★★★★★

非常实用的一本书,理论知识够用还不枯燥,实操性很强,值得反复阅读。

★★★★★

内容丰富,但是有些地方不是我想要的

★★★★★

写的真的相当好,从使用到原理都讲到了

★★★★★

在😅😅😅mini好的ii fanwebnj🦀🦀

★★★★★

书的内容很不错,很适合入门,深度也不错,就是如果有人工翻译版本就太棒了,机器翻译看起来有点费劲

★★★★★

挺全面的 有原理有操作还有运维

书籍信息

作者香农·布拉德肖 克里斯蒂娜·霍多罗夫 约恩·布拉齐尔
译者牟天垒,王明辉
出版社人民邮电出版社
出版时间2021-11-01
ISBN9787115576538
分类计算机-编程设计
格式EPUB
完结状态连载中
章节数163