跳至主要內容

《MongoDB 权威指南》笔记二

钝悟...大约 9 分钟笔记数据库数据库文档数据库MongoDB

《MongoDB 权威指南》笔记二

第 5 章 索引

索引是用于提升查询效率的一种存储结构。

索引简介

在 MongoDB 中,不使用索引的查询称为集合扫描,这意味要扫描所有数据。

创建索引

db.users.createIndex({"username" : 1})

创建复合索引

如果查询中有多个排序方向或者查询条件中有多个键,那么复合索引会非常有用。

db.users.createIndex({"age" : 1, "username" : 1})

explain

何时不使用索引

索引类型

索引管理

第 6 章 特殊的索引和集合类型

地理空间索引

全文搜索索引

固定集合

TTL 索引

使用 GridFS 存储文件

第 7 章 聚合框架

管道、阶段和可调参数

阶段入门:常见操作

表达式

$project

$unwind

数组表达式

累加器

分组简介

将聚合管道结果写入集合中

第 8 章 事务

第 9 章 应用程序设计

第 10 章 创建副本集

如何设计副本集

在 MongoDB 中,副本集``是一组服务器,其中一个是用于处理写操作的主节点(primary),还有多个用于保存主节点的数据副本的从节点(secondary)。如果主节点崩溃了,则从节点会从其中选取出一个新的主节点。

副本集中的停止运行或不可用的节点数只要不到一半,副本集整体都是可以对外提供服务的。——这是为什么呢?

MongoDB 的故障转移能力基于 Raft 共识协议实现。该协议的核心在于,当主节点出现故障时,集群中半数以上的节点所认可的节点才能当选为新的主节点。假设一个集群中有 5 个节点,其中 3 个节点不可用,2 个节点可以正常工作。这 2 个节点不能达到副本集大多数的要求(至少需要 3 个节点),因此它们无法选举出一个主节点。如果这 2 个节点中有一个是主节点,那么当它注意到无法得到大多数节点支持时,就会从主节点上退位。几秒后,副本集中会包含 2 个从节点和 3 个无法访问的节点。

为什么剩下的 2 个节点不能选举出主节点?问题在于:其他 3 个节点实际上可能没有崩溃,而是因为网络故障而不可达。在这种情况下,左侧的 3 个节点将选举出一个主节点,因为它们可以达到副本集节点中的大多数(5 个节点中的 3 个)。在网络分区的情况下,我们不希望两边的网络各自选举出一个主节点,因为那样的话副本集就拥有 2 个主节点了。如果 2 个主节点都可以写入数据,那么整个副本集的数据就会发生混乱,这就是所谓的“脑裂”。

有两种推荐的集群模式:

  • 将“大多数”成员放在一个数据中心。如果有一个主数据中心,而且你希望副本集的主节点总是位于主数据中心,那么这是一个比较好的配置。只要主数据中心正常运转,就会有一个主节点。不过,如果主数据中心不可用了,那么备份数据中心的成员将无法选举出主节点。
  • 在两个数据中心各自放置数量相等的成员,在第三个地方放置一个用于打破僵局的副本集成员。如果两个数据中心“同等”重要,那么这种配置会比较好,因为任意一个数据中心的服务器都可以找到另一台服务器以达到“大多数”。不过,这样就需要将服务器分散到 3 个地方。

如何进行选举

当一个从节点无法与主节点连通时,它就会联系并请求其他的副本集成员将自己选举为主节点。其他成员会做几项健全性检查:它们能否连接到一个主节点,而这个主节点是发起选举的节点无法连接到的?这个发起选举的从节点是否有最新数据?有没有其他更高优先级的成员可以被选举为主节点?

MongoDB 在其 3.2 版本中引入了 Raft 共识协议。

副本集成员相互间每隔两秒发送一次心跳(heartbeat,也就是 ping)。如果某个成员在 10秒内没有反馈心跳,则其他成员会将该不良成员标记为无法访问。选举算法将尽“最大努力”尝试让具有最高优先权的从节点发起选举。成员优先权会影响选举的时机和结果。优先级高的从节点要比优先级低的从节点更快地发起选举,而且也更有可能成为主节点。然而,低优先级的从节点也可能短暂地被选为主节点,即使还存在一个可用的高优先级从节点。副本集成员会继续发起选举直到可用的最高优先级成员被选为主节点。

就所有能连接到的成员,被选为主节点的成员必须拥有最新的复制数据。严格地说,所有的操作都必须比任何一个成员的操作都要高,因此所有的操作都必须比任何一个成员的操作都要晚。

第 11 章 副本集的组成

同步

复制是指在多台服务器上保持相同的数据副本。MongoDB 实现此功能的方式是保存操作日志(oplog),其中包含了主节点执行的每一次写操作。oplog 是存在于主节点 local 数据库中的一个固定集合。从节点通过查询此集合以获取需要复制的操作。

每个从节点都维护着自己的 oplog,用来记录它从主节点复制的每个操作。

如果一个从节点由于某种原因而停止运行,那么当它重新启动后,就会从 oplog 中的最后一个操作开始同步。由于这些操作是先应用到数据上然后再写入 oplog,因此从节点可能会重复已经应用到其数据上的操作。MongoDB 在设计时就考虑到了这种情况:将 oplog 中的同一个操作执行多次与只执行一次效果是一样的。oplog 中的每个操作都是幂等的。也就是说,无论对目标数据集应用一次还是多次,oplog 操作都会产生相同的结果。

心跳

每个成员需要知道其他成员的状态:谁是主节点?谁可以作为同步源?谁停止运行了?为了维护副本集的最新视图,所有成员每隔两秒会向副本集的其他成员发送一个心跳请求。

心跳请求用于检查每个成员的状态。

心跳的一个最重要的功能是让主节点知道自己是否满足副本集“大多数”的条件。如果主节点不再得到“大多数”节点的支持,它就会降级,成为一个从节点。

选举

当一个成员无法访问到主节点时,便会申请选举。申请选举的成员会向其所能访问到的所有成员发出通知。如果这个成员不适合作为主节点,那么其他成员会知道原因:可能这个成员的数据落后于副本集,或者已经有一个主节点在申请选举,而那个失败的成员无法访问到此节点。在这些情况下,其他成员将投票反对该成员的申请。

如果申请选举的成员从副本集中获得了大多数选票,该成员将转换到 PRIMARY 状态。

回滚

如果主节点执行一个写操作之后停止了运行,而从节点还没来得及复制此操作,那么新选举出的主节点可能会丢失这个写操作。

第 12 章 从应用程序连接副本集

第 13 章 管理

第 14 章 分片简介

MongoDB 支持自动分片。

MongoDB 通过 mongos 进程来进行分片的路由寻址。mongos 维护着一个“目录”,指明了哪个分片包含哪些数据。mongos 知道哪些数据在哪个分片上,可以将请求转发到适当的分片。如果有对请求的响应,mongos 会收集它们,并在必要时进行合并,然后再发送回应用程序。

在对集合进行分片时,需要选择一个片键(shard key)。片键是 MongoDB 用来拆分数据的一个或几个字段。

包含片键并可以发送到单个分片或分片子集的查询称为定向查询(targeted query)。必须发送到所有分片的查询称为分散–收集查询(scatter-gather query),也称为广播查询:mongos会将查询分散到所有分片,然后再从各个分片收集结果。

第 15 章 配置分片

均衡器

均衡器负责数据的迁移。它会定期检查分片之间是否存在不均衡(一个分片的块数量达到阈值),如果存在,就会对块进行迁移。

MongoDB 3.4 以后,均衡器位于配置服务器副本集的主节点成员上;MongoDB 3.4 及以前,每个 mongos 会偶尔扮演均衡器角色。

第 16 章 选择片键

第 17 章 分片管理

第 18 章 了解应用程序的动态

第 19 章 MongoDB 安全介绍

第 20 章 持久性

第 21 章 在生产环境中设置 MongoDB

第 22 章 监控 MongoDB

第 23 章 备份

第 24 章 部署 MongoDB

参考资料

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.7