本文目录

1 整体架构

2 Shard Key

3 Chunk


1 整体架构

1.1 Shard

Shard用于存储用户数据,每个Shard存储用户数据中的一部分。

当数据量超过Shard整体容量时,可以动态增加Shard节点,从而动态扩展数据容量。

每个Shard节点部署在一台服务器上,每台服务器上可能部署了多个Shard节点。

1.2 Router(Mongos)

Router(Mongos)是Sharded Cluster的访问入口,使得集群内部对外透明。

Router本身不存储数据,而是用于请求的路由,将请求分发至相应的Shard节点。

元数据将存储到Config Server,而用户数据将存储到各Shard中。

1.3 Config Server

Config Server用于存储原数据和集群配置。

2 Shard Key

Shard Key(片键)由文档中的一个或多个字段组成,Shard Key 中的字段必须是某个索引的前缀,即至少需要创建一个索引,且该索引以 Shard Key 作为前缀字段,或该索引仅包含Shard Key字段。

MongoDB会根据数据的Shard Key对数据进行一个范围划分,每一个范围内的数据对应一个Chunk。

从而决定该文档应该存储在哪一个Shard上,最终决定该文档应该存储在哪一个机器上。

2.1 Sharding Strategy(分片策略)

MongoDB 支持两种分片策略:Ranged Sharding(范围分片) 和 Hashed Sharding(哈希分片)

Ranged Sharding 就是基于 Shard Key 值进行范围划分;

Hashed Sharding 则是将 Shard Key 先进行一次 Hash 操作,得到一个 Hash 值,然后基于该 Hash 值进行范围划分。

2.2 Shard Key 的设计

原则:

(1)尽量让数据均匀分布在各Chunk中,从而均匀分布在各Shard中,减少Chunk拆分和迁移的可能性。

(2)尽量保证范围查询可以落在较少的Shard中,以避免Scatter/Gather操作,提升性能。

例如:当希望以用户ID(一组递增数字)作为Shard Key。

但由于用户ID是递增数字,导致新用户的数据总是落在最后一个Chunk中,进而可能导致不断拆分和迁移后面的Chunk数据。

因此,在设计Shard Key的时候,可以创建一个单独的字段SK,该字段内容如下(+号标识连接):

SK = 1 + 用户ID最后一位 + 用户ID

即,当用户ID为10055123时,SK值为1310055123。

这时,新增用户的SK值前两位将从10-19依次变化,相当于将用户ID分成了10个大组,分别对应不同的Chunk,起到了分散数据的作用。即满足(1)的要求。

当经常通过用户ID查询某用户的数据。上述设计也可以保证相同用户的数据会保存在同一个Chunk中,即保证了相同的用户数据会保存在同一个Shard中。当请求某个用户的数据时,查询会被路由至相应的Shard执行,而不会让所有Shard都查询是否有该用户数据,然后再汇集返回给调用者。即满足(2)的要求。

3 Chunk

MongoDB会根据Shard Key将数据对应保存在不同Chunk上,每个Chunk保存一部分数据。

每个Chunk有一定容量上限,当Chunk内数据超过该上限,该Chunk将会被拆分成两个Chunk,拆分后的Chunk将对应更小范围的Shard Key值。

当某个Chunk仅对应一个Shard Key时,将无法被拆分,即每个Chunk以Shard Key作为最小单位,进行数据的保存。

每个Chunk属于一个Shard,每个Shard包含一个或多个Chunk。

当各Shard上的数据量不均衡时,超过某个阈值,将会引发Chunk的迁移操作,数据量过多的Shard中的部分数据,将会以Chunk为单位,迁移至其它Shard中,以达到各Shard相对均衡的状态。

当Shard Key设计完成后,有时,需要根据Shard Key对Chunk进行预设。

从而,在初始阶段,就将Chunk进行了初始拆分,且确定了每个Chunk的边界,以减少前期频繁的Chunk拆分及迁移。

MongoDB 学习笔记:Sharded Cluster相关推荐

  1. MongoDB学习笔记(入门)

    MongoDB学习笔记(入门) 一.文档的注意事项: 1.  键值对是有序的,如:{ "name" : "stephen", "genda" ...

  2. MongoDB学习笔记【2】-- 试用

    大部分内容根据MongoDB官方手册整理:http://docs.mongodb.org/manual/contents/ 查看数据库 [root@slayer ~]# mongo MongoDB s ...

  3. MongoDB学习笔记(四)使用Java进行实时监控与数据收集(空间使用量、连接数)

    目录: MongoDB学习笔记(一)环境搭建与常用操作 MongoDB学习笔记(二)使用Java操作MongoDB MongoDB学习笔记(三)使用Spring Data操作MongoDB Mongo ...

  4. MongoDB学习笔记(一) MongoDB介绍及安装

    系列目录 MongoDB学习笔记(一) MongoDB介绍及安装     MongoDB学习笔记(二) 通过samus驱动实现基本数据操作     MongoDB学习笔记(三) 在MVC模式下通过Jq ...

  5. PHP操作MongoDB学习笔记

    PHP操作MongoDB技術總結 <?php /** * PHP操作MongoDB学习笔记 */ //************************* //**   连接MongoDB数据库  ...

  6. MongoDB学习笔记(四)--索引 性能优化

    索引                                                                                             基础索引 ...

  7. MongoDB学习笔记一:MongoDB的下载和安装

    MongoDB学习笔记一:MongoDB的下载和安装 趁着这几天比較空暇,准备学习一下MongoDB数据库.今天就简单的学习了一些MongoDB的下载和安装.并创建了存储MongoDB的数据仓库. 将 ...

  8. MongoDB 学习笔记八 复制、分片、备份与恢复、监控

    MongoDB 学习笔记八 复制.分片.备份与恢复.监控 MongoDB复制(副本集) 什么是复制? MongoDB 复制原理 MongoDB 副本集设置 副本集添加成员 MongoDB 分片 分片 ...

  9. MongoDB学习笔记~对集合属性的操作

    $unset清除元素 请注意在单个数组元素上使用$unset的结果可能与你设想的不一样.其结果只是将元素的值设置为null,而非删除整个元素.要想彻底删除某个数组元素,可以用$pull 和$pop操作 ...

  10. 非关系型数据库MongoDB学习笔记

    MongoDB学习笔记   --周灿 创建数据库 use "databasename" 查看数据库 show dbs 给指定数据库添加集合和插入记录 db.集合名.insert({ ...

最新文章

  1. [BZOJ1106/POI2007]Tet立方体大作战
  2. Android之对Volley网络框架的一些理解
  3. x86分页机制——《x86汇编语言:从实模式到保护模式》读书笔记42
  4. linux系统安装金蝶_linux 操作系统安装配置vnc
  5. java接口测试工具_这 5 款实用性能测试工具,你会如何选择?
  6. 微型计算机作为载体的部件是,大工11秋《计算机应用基础》辅导资料二
  7. Java-数组 三种初始化及内存分析
  8. linux shell 豆瓣,用Linux shell脚本爬取豆瓣邮箱
  9. linux系统进程类型不包括,linux期末考试练习题
  10. 安卓中为什么onkeydown没有相应_为什么今年在园区注册个人独资企业能将企业总税率降低至3%?...
  11. Java软件工程师面试题:Java运行时异常与一般异常有什么不一样?
  12. Redis 和 memcached 区别(二)
  13. qt.qpa.plugin: Could not find the Qt platform plugin “xcb“ i
  14. 虚拟化之升级vUM组件安装
  15. [转载] 白酒基础知识
  16. 初次使用Fleck+redis订阅发布实现学习小demo
  17. Ngork内网穿透简单实现
  18. 巴比特 | 元宇宙每日必读:3个月销售额近3个亿,虚拟偶像的“钱途”真的是一片光明吗?...
  19. FIPS 140-3与140-2的差异-1
  20. scrapy mysql 豆瓣_Scrapy爬取豆瓣图书保存MySQL实验

热门文章

  1. 第三十五篇、基于Arduino uno,获取DS18B20温度传感器的温度值——结果导向
  2. OK6410开发板Uboot学习总结----(三)从SD卡启动分析
  3. Linux下读取smBIOS源码,linux – 了解SMBIOS的段组,总线,设备和功能号码
  4. 使用javascript实现的雪花飞舞的效果
  5. 单播、组播、广播区别与联系
  6. python路径单双斜杠、转义字符
  7. 【PyTorch】构造VGG19网络进行本地图片分类(超详细过程)——项目介绍
  8. 大数据分析案例-基于随机森林算法探究影响人类寿命的因素
  9. git关联远程仓库--码云
  10. 王者荣耀6月23服务器维护,王者荣耀6月23日维护到几点?6月23日开服时间介绍[多图]...