diff --git a/notes/MongoDB_分片.md b/notes/MongoDB_分片.md index 88111cc..ab14e56 100644 --- a/notes/MongoDB_分片.md +++ b/notes/MongoDB_分片.md @@ -1,5 +1,24 @@ # MongoDB Sharding + + ## 一、分片机制 ### 1.1 核心组件 @@ -10,8 +29,7 @@ + **config servers** :配置服务器,它是整个集群的核心,用于存储集群的元数据和配置信息 (如分片服务器上存储了哪些数据块以及这些块的数据范围) 。从 MongoDB 3.4 开始,必须将配置服务器部署为副本集。 + **mongos** :查询服务的路由器,它是集群对外提供服务的门户。mongos 从配置服务器获取数据块的相关信息,并将客户端请求路由到对应的分片服务器上。 -![mongodb-分片模式](D:\Full-Stack-Notes\pictures\mongodb-分片模式.png) - +
### 1.2 分片键 为了将集合中的不同文档分发到不同的数据块,MongoDB 需要用户指定分片键,之后基于选定的分片策略将数据拆分到不同的数据块。每个需要分片的集合只能有一个分片键: @@ -36,12 +54,10 @@ 无论采用何种分片策略,数据最终都被存储到对应范围的数据块 (chunk) 上,每个块默认的大小都是 64 M。由于数据源源不断的加入,当块超过指定大小时,就会进行块拆分。需要强调的是块拆分是一个轻量级的操作,因为在本质上并没有任何数据的移动,只是由 config servers 更新关于块的元数据信息。 -![mongodb-块拆分](D:\Full-Stack-Notes\pictures\mongodb-块拆分.png) - +
当某个分片服务器上的数据过多时候,此时为了避免单服务器上 CPU 和 IO 操作的性能问题,就会发生块迁移,将块从一个分片迁移到另外一个分片,同时 config servers 也会更新相关块的元数据信息。 块迁移是由在后台运行的平衡器 (balancer) 所负责的,它在后台进行持续监控,如果最大和最小分片之间的块数量差异超过迁移阈值,平衡器则开始在群集中迁移块以确保数据的均匀分布。 -![mongodb-块迁移](D:\Full-Stack-Notes\pictures\mongodb-块迁移.png) - +
块的大小是可以手动进行配置修改,但需要注意权衡利弊: - 小块会导致频繁的数据拆分和迁移,从而致保证数据均匀的分布,但数据迁移会带来额外的网络开销,同时也会降低路由性能; @@ -51,16 +67,12 @@ 这里需要注意块的迁移不会对查询造成任何影响,MongoDB 集群和 Redis 集群的查询原理不同。对于 Redis Cluster 而言,数据的散列规则同时也是查询时的路由规则。但是对于 MongoDB 分片集群而言,查询需要先经过 mongos ,mongos 会从 config servers 上获取块的位置信息和数据范围,然后按照这些信息进行匹配后再路由到正确的分片上。因此,从本质上而言 MongoDB 的分片策略和路由规则没有任何关系,假设按照分片策略将某文档分发到 Shard A 的 Chunk01 上,之后 Chunk01 迁移到 Shard B , 由于配置服务器会更新 Chunk01 块的位置信息,所以仍然能够正确路由到。 -![mongodb-路由查询](D:\Full-Stack-Notes\pictures\mongodb-路由查询.png) - +
### 1.6 非分片集合 以上的所有讲解都是针对分片集合的,而在实际开发中并非每个集合都需要进行分片,MongoDB 允许在同一数据库下混合使用分片和非分片集合。每个数据库都有自己的主分片,所有非分片集合同一存储在主分片上。需要特别说明的是主分片和复本集中的主节点没有任何关系,在新数据库创建时程序会自动选择当前集群中最少数据量的分片作为主分片。如下图所示: Shard A 为主分片,集合 Collection1 是分片集合,而集合 Collection2 是非分片集合。 -![mongodb-非分片集合](D:\Full-Stack-Notes\pictures\mongodb-非分片集合.png) - - - +
## 二、集群搭建 这里我只有三台服务器,所以三台服务器上均部署 mongod 服务,形成两个分片副本集;同时三台服务器上均配置 config servers 服务,形成一个配置副本集。集群架构如下: @@ -267,8 +279,7 @@ db.runCommand({ addshard : "rs1/hadoop001:37018,hadoop002:37018,hadoop003:37018" 务必注意,在添加分片副本集之前一定要切换到管理员角色,否则后面的添加操作会返回 `"ok" : 0` 的失败状态码,同时会提示 `addShard may only be run against the admin database.` 添加成功后,可以使用 `sh.status()` 查看集群状态,此时输出如下,可以看到两个分片副本集已经被成功添加。 -![mongodb-分片集群状态](D:\Full-Stack-Notes\pictures\mongodb-分片集群状态.png) - +
### 2.8 测试分片 #### 1. 开启分片功能 @@ -305,12 +316,7 @@ db.users.insertMany(arr); 插入数据完成后,执行 `sh.status()` 命令可以查看分片情况,以及块的数据信息,部分输出如下: -![mongodb-分片测试](D:\Full-Stack-Notes\pictures\mongodb-分片测试.png) - - - - - +
## 参考资料 + 官方文档:https://docs.mongodb.com/manual/sharding/ diff --git a/notes/MongoDB_复制.md b/notes/MongoDB_复制.md index af62c21..5333645 100644 --- a/notes/MongoDB_复制.md +++ b/notes/MongoDB_复制.md @@ -1,13 +1,30 @@ # MongoDB Replication + + + ## 一、副本集 ### 1.1 复制功能 为保证数据安全,实现高可用,MongoDB 提供了复制功能,可以将主节点上的数据复制到多个从节点上,这样即便主节点异常,由于数据是以多副本的方式存储,仍然可以保证数据安全。一个标准的三节点的副本集的架构如下: -![mongodb-复制](D:\Full-Stack-Notes\pictures\mongodb-复制.png) - +

#### 1. 初始同步 在副本集初始化时,主节点的 mongod 进程会扫描当前节点上每个数据库中的每个集合,然后将这些数据发送给从节点,进行初始化的全量复制。 @@ -26,8 +43,7 @@ MongoDB 按 namespace 或 document id 对每批操作进行分组,并使用不 虽然仲裁者可以占用更少的服务器资源,但是由于其并不存储数据,所以对数据的安全性并不能起到帮助作用。因此应该尽量避免使用仲裁者,同时尽量保证最多只使用一个仲裁者,即如果节点数量恰好是偶数,则添加一个仲裁者,如果节点数量是奇数,那就不需要仲裁者。 -![mongodb-仲裁者](D:\Full-Stack-Notes\pictures\mongodb-仲裁者.png) - +

## 二、故障发现与恢复 ### 2.1 故障发现 @@ -40,8 +56,7 @@ MongoDB 的选举算法会尝试让高优先级的节点优先发起选举,从 -![mongodb-故障恢复](D:\Full-Stack-Notes\pictures\mongodb-故障恢复.png) - +

### 2.3 投票成员 节点发起选举后,需要具有投票权的节点进行投票,当获得半数以上选票时,该备用节点可以成为新的主节点。对于一个复制集,只有处于以下状态的节点拥有投票权,这些节点统称为投票成员: @@ -60,8 +75,7 @@ MongoDB 的选举算法会尝试让高优先级的节点优先发起选举,从 如下示例是一个 9 个成员的副本集,包含 7 个投票成员和 2 个无投票成员: -![mongdb-vote](D:\Full-Stack-Notes\pictures\mongdb-vote.png) - +

## 三、搭建副本集 这里以搭建一个三节点的副本集为例,使用三台服务器,主机名分别为 hadoop001,hadoop002,hadoop003。 @@ -70,7 +84,7 @@ MongoDB 的选举算法会尝试让高优先级的节点优先发起选举,从 选择所需版本的 MongoDB 进行下载,下载地址为: https://www.mongodb.com/download-center/community -
+

这里我下载的版本为 `4.0.10` , 安装环境为 `RHEL 7.0`,下载后进行解压: ```shell @@ -96,7 +110,7 @@ export PATH=${MONGODB_HOME}/bin:$PATH source /etc/profile ``` -### 三、修改配置 +### 3.3 修改配置 MongoDB 默认存放数据的目录为 `/var/lib/mongo` ,默认存放日志的目录为 `/var/log/mongodb`,采用 TGZ 安装包进行安装时,程序不会自动创建这两个目录,需要预先手动创建。同时由于 `/var/` 下只能存放临时文件,所以这里我们使用其他目录进行存储,命令如下: @@ -134,7 +148,7 @@ replication: > MongoDB 的所有配置项可以参考其官方文档:[Configuration File Options](https://docs.mongodb.com/manual/reference/configuration-options/) -### 四、启动服务 +### 3.4 启动服务 以上配置步骤在三台主机上均相同。之后启动三台主机上的 mongod 服务,命令如下: @@ -142,7 +156,7 @@ replication: mongod -f /etc/mongod.conf ``` -### 五、配置副本集 +### 3.5 配置副本集 在任意一台主机上使用 mongo shell 连接到本地服务,之后直接使用以下命令配置副本集: @@ -157,14 +171,11 @@ rs.initiate( { }) ``` -### 六、查看副本集情况 +### 3.6 查看副本集情况 使用 `rs.status()` 命令查看副本集状态,部分输出如下。从输出中可以看到 hadoop001 为 PRIMARY 节点,而 hadoop002 和 hadoop003 均为 SECONDARY 节点,此时代表副本集已经搭建成功。 -![mongodb-副本集状态](D:\Full-Stack-Notes\pictures\mongodb-副本集状态.png) - - - +

## 参考资料 - 官方文档:https://docs.mongodb.com/manual/replication/