MongoDB 学习笔记:Sharded Cluster
本文目录
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相关推荐
- MongoDB学习笔记(入门)
MongoDB学习笔记(入门) 一.文档的注意事项: 1. 键值对是有序的,如:{ "name" : "stephen", "genda" ...
- MongoDB学习笔记【2】-- 试用
大部分内容根据MongoDB官方手册整理:http://docs.mongodb.org/manual/contents/ 查看数据库 [root@slayer ~]# mongo MongoDB s ...
- MongoDB学习笔记(四)使用Java进行实时监控与数据收集(空间使用量、连接数)
目录: MongoDB学习笔记(一)环境搭建与常用操作 MongoDB学习笔记(二)使用Java操作MongoDB MongoDB学习笔记(三)使用Spring Data操作MongoDB Mongo ...
- MongoDB学习笔记(一) MongoDB介绍及安装
系列目录 MongoDB学习笔记(一) MongoDB介绍及安装 MongoDB学习笔记(二) 通过samus驱动实现基本数据操作 MongoDB学习笔记(三) 在MVC模式下通过Jq ...
- PHP操作MongoDB学习笔记
PHP操作MongoDB技術總結 <?php /** * PHP操作MongoDB学习笔记 */ //************************* //** 连接MongoDB数据库 ...
- MongoDB学习笔记(四)--索引 性能优化
索引 基础索引 ...
- MongoDB学习笔记一:MongoDB的下载和安装
MongoDB学习笔记一:MongoDB的下载和安装 趁着这几天比較空暇,准备学习一下MongoDB数据库.今天就简单的学习了一些MongoDB的下载和安装.并创建了存储MongoDB的数据仓库. 将 ...
- MongoDB 学习笔记八 复制、分片、备份与恢复、监控
MongoDB 学习笔记八 复制.分片.备份与恢复.监控 MongoDB复制(副本集) 什么是复制? MongoDB 复制原理 MongoDB 副本集设置 副本集添加成员 MongoDB 分片 分片 ...
- MongoDB学习笔记~对集合属性的操作
$unset清除元素 请注意在单个数组元素上使用$unset的结果可能与你设想的不一样.其结果只是将元素的值设置为null,而非删除整个元素.要想彻底删除某个数组元素,可以用$pull 和$pop操作 ...
- 非关系型数据库MongoDB学习笔记
MongoDB学习笔记 --周灿 创建数据库 use "databasename" 查看数据库 show dbs 给指定数据库添加集合和插入记录 db.集合名.insert({ ...
最新文章
- [BZOJ1106/POI2007]Tet立方体大作战
- Android之对Volley网络框架的一些理解
- x86分页机制——《x86汇编语言:从实模式到保护模式》读书笔记42
- linux系统安装金蝶_linux 操作系统安装配置vnc
- java接口测试工具_这 5 款实用性能测试工具,你会如何选择?
- 微型计算机作为载体的部件是,大工11秋《计算机应用基础》辅导资料二
- Java-数组 三种初始化及内存分析
- linux shell 豆瓣,用Linux shell脚本爬取豆瓣邮箱
- linux系统进程类型不包括,linux期末考试练习题
- 安卓中为什么onkeydown没有相应_为什么今年在园区注册个人独资企业能将企业总税率降低至3%?...
- Java软件工程师面试题:Java运行时异常与一般异常有什么不一样?
- Redis 和 memcached 区别(二)
- qt.qpa.plugin: Could not find the Qt platform plugin “xcb“ i
- 虚拟化之升级vUM组件安装
- [转载] 白酒基础知识
- 初次使用Fleck+redis订阅发布实现学习小demo
- Ngork内网穿透简单实现
- 巴比特 | 元宇宙每日必读:3个月销售额近3个亿,虚拟偶像的“钱途”真的是一片光明吗?...
- FIPS 140-3与140-2的差异-1
- scrapy mysql 豆瓣_Scrapy爬取豆瓣图书保存MySQL实验
热门文章
- 第三十五篇、基于Arduino uno,获取DS18B20温度传感器的温度值——结果导向
- OK6410开发板Uboot学习总结----(三)从SD卡启动分析
- Linux下读取smBIOS源码,linux – 了解SMBIOS的段组,总线,设备和功能号码
- 使用javascript实现的雪花飞舞的效果
- 单播、组播、广播区别与联系
- python路径单双斜杠、转义字符
- 【PyTorch】构造VGG19网络进行本地图片分类(超详细过程)——项目介绍
- 大数据分析案例-基于随机森林算法探究影响人类寿命的因素
- git关联远程仓库--码云
- 王者荣耀6月23服务器维护,王者荣耀6月23日维护到几点?6月23日开服时间介绍[多图]...