MongoDB目前3大核心优点:『灵活模式』+ 『高可用性』 + 『可扩展性』,经过json文档来实现灵活模式,经过复制集来保证高可用,经过Sharded cluster来保证可扩展性。mongodb
什么时候使用分片技术数据库
存储容量需求超出单机磁盘容量
活跃的数据集超出单机内存容量,致使不少请求都要从磁盘读取数据,影响性能
写IOPS超出单个MongoDB节点的写服务能力
json
分片技术,使得集合中的数据分散到多个分片集中。使得MongoDB具有横向的发展。后端
Sharded cluster由Shard、Mongos和Config server 3个组件构成。
架构
Mongos是Sharded cluster的访问入口,
Mongos自己并不持久化数据,Sharded cluster全部的元数据都会存储到Config Server
而用户的数据则会分散存储到各个shard。Mongos启动后,会从config server加载元数据,开始提供服务,将用户的请求正确路由到对应的Shard。
负载均衡
分片支持单个集合的数据分散在多个分片上。目前主要有两种数据分片的策略。运维
如图,集合是根据字段来进行分片。根据字段的范围不一样将一个集合的数据存储在不一样的分片中。
在同一个Shard上,每一个Shard能够存储不少个chunk,chunk存储在哪一个shard的信息会存储在Config server种,mongos也会根据各个shard上的chunk的数量来自动作负载均衡。
范围分片适合知足在必定范围内的查找,例如查找X的值在【100-200】之间的数据,mongo 路由根据Config server中存储的元数据,能够直接定位到指定的shard的Chunk中
缺点 若是shardkey有明显递增(或者递减)趋势,则新插入的文档多会分布到同一个chunk,没法扩展写的能力性能
Hash分片是根据用户的shard key计算hash值(64bit整型),根据hash值按照『范围分片』的策略将文档分布到不一样的chunkserver
优势Hash分片与范围分片互补,能将文档随机的分散到各个chunk,充分的扩展写能力,弥补了范围分片的不足,
缺点但不能高效的服务范围查询,全部的范围查询要分发到后端全部的Shard才能找出知足条件的文档。blog
选择shard key时,要根据业务的需求及『范围分片』和『Hash分片』2种方式的优缺点合理选择,要根据字段的实际缘由对数据进行分片,不然会产生过大的Chunk
Mongos做为Sharded cluster的访问入口,全部的请求都由mongos来路由、分发、合并,这些动做对客户端driver透明,用户链接mongos就像链接mongod同样使用。
查询请求包含shard key,则直接根据shard key计算出须要查询的chunk,向对应的shard发送查询请求
写操做必须包含shard key,mongos根据shard key算出文档应该存储到哪一个chunk,而后将写请求发送到chunk所在的shard。
更新、删除请求的查询条件必须包含shard key或者_id,若是是包含shard key,则直接路由到指定的chunk,若是只包含_id,则需将请求发送至全部的shard。
Config server存储Sharded cluster的全部元数据,全部的元数据都存储在config数据库
Config Server可部署为一个独立的复制集,极大的方便了Sharded cluster的运维管理。
config.shards集合存储各个Shard的信息,可经过addShard、removeShard命令来动态的从Sharded cluster里增长或移除shard
config.databases集合存储全部数据库的信息,包括DB是否开启分片,primary shard信息,对于数据库内没有开启分片的集合,全部的数据都会存储在数据库的primary shard上。
数据分片是针对集合维度的,某个数据库开启分片功能后,若是须要让其中的集合分片存储,则需调用shardCollection命令来针对集合开启分片。
集合分片开启后,默认会建立一个新的chunk,shard key取值[minKey, maxKey]内的文档(即全部的文档)都会存储到这个chunk。当使用Hash分片策略时,也能够预先建立多个chunk,以减小chunk的迁移。
config.settings集合里主要存储sharded cluster的配置信息,好比chunk size,是否开启balancer等
config.locks存储锁相关的信息,对某个集合进行操做时,好比moveChunk,须要先获取锁,避免多个mongos同时迁移同一个集合的chunk。