From 94eb01fa256c0ea36350914a17a24540c52b44c0 Mon Sep 17 00:00:00 2001 From: heibaiying <31504331+heibaiying@users.noreply.github.com> Date: Mon, 22 Jul 2019 09:07:15 +0800 Subject: [PATCH] =?UTF-8?q?Update=20MongoDB=5F=E5=88=86=E7=89=87.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/MongoDB_分片.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/notes/MongoDB_分片.md b/notes/MongoDB_分片.md index ab14e56..eb14fcd 100644 --- a/notes/MongoDB_分片.md +++ b/notes/MongoDB_分片.md @@ -30,6 +30,7 @@ + **mongos** :查询服务的路由器,它是集群对外提供服务的门户。mongos 从配置服务器获取数据块的相关信息,并将客户端请求路由到对应的分片服务器上。
+ ### 1.2 分片键 为了将集合中的不同文档分发到不同的数据块,MongoDB 需要用户指定分片键,之后基于选定的分片策略将数据拆分到不同的数据块。每个需要分片的集合只能有一个分片键: @@ -55,9 +56,11 @@ 无论采用何种分片策略,数据最终都被存储到对应范围的数据块 (chunk) 上,每个块默认的大小都是 64 M。由于数据源源不断的加入,当块超过指定大小时,就会进行块拆分。需要强调的是块拆分是一个轻量级的操作,因为在本质上并没有任何数据的移动,只是由 config servers 更新关于块的元数据信息。
+ 当某个分片服务器上的数据过多时候,此时为了避免单服务器上 CPU 和 IO 操作的性能问题,就会发生块迁移,将块从一个分片迁移到另外一个分片,同时 config servers 也会更新相关块的元数据信息。 块迁移是由在后台运行的平衡器 (balancer) 所负责的,它在后台进行持续监控,如果最大和最小分片之间的块数量差异超过迁移阈值,平衡器则开始在群集中迁移块以确保数据的均匀分布。
+ 块的大小是可以手动进行配置修改,但需要注意权衡利弊: - 小块会导致频繁的数据拆分和迁移,从而致保证数据均匀的分布,但数据迁移会带来额外的网络开销,同时也会降低路由性能; @@ -68,11 +71,13 @@ 这里需要注意块的迁移不会对查询造成任何影响,MongoDB 集群和 Redis 集群的查询原理不同。对于 Redis Cluster 而言,数据的散列规则同时也是查询时的路由规则。但是对于 MongoDB 分片集群而言,查询需要先经过 mongos ,mongos 会从 config servers 上获取块的位置信息和数据范围,然后按照这些信息进行匹配后再路由到正确的分片上。因此,从本质上而言 MongoDB 的分片策略和路由规则没有任何关系,假设按照分片策略将某文档分发到 Shard A 的 Chunk01 上,之后 Chunk01 迁移到 Shard B , 由于配置服务器会更新 Chunk01 块的位置信息,所以仍然能够正确路由到。
+ ### 1.6 非分片集合 以上的所有讲解都是针对分片集合的,而在实际开发中并非每个集合都需要进行分片,MongoDB 允许在同一数据库下混合使用分片和非分片集合。每个数据库都有自己的主分片,所有非分片集合同一存储在主分片上。需要特别说明的是主分片和复本集中的主节点没有任何关系,在新数据库创建时程序会自动选择当前集群中最少数据量的分片作为主分片。如下图所示: Shard A 为主分片,集合 Collection1 是分片集合,而集合 Collection2 是非分片集合。
+ ## 二、集群搭建 这里我只有三台服务器,所以三台服务器上均部署 mongod 服务,形成两个分片副本集;同时三台服务器上均配置 config servers 服务,形成一个配置副本集。集群架构如下: @@ -280,6 +285,7 @@ db.runCommand({ addshard : "rs1/hadoop001:37018,hadoop002:37018,hadoop003:37018" 务必注意,在添加分片副本集之前一定要切换到管理员角色,否则后面的添加操作会返回 `"ok" : 0` 的失败状态码,同时会提示 `addShard may only be run against the admin database.` 添加成功后,可以使用 `sh.status()` 查看集群状态,此时输出如下,可以看到两个分片副本集已经被成功添加。
+ ### 2.8 测试分片 #### 1. 开启分片功能 @@ -317,7 +323,8 @@ db.users.insertMany(arr); 插入数据完成后,执行 `sh.status()` 命令可以查看分片情况,以及块的数据信息,部分输出如下:
+ ## 参考资料 + 官方文档:https://docs.mongodb.com/manual/sharding/ -+ 官方配置说明:https://docs.mongodb.com/manual/reference/configuration-options/ \ No newline at end of file ++ 官方配置说明:https://docs.mongodb.com/manual/reference/configuration-options/