前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MongoDB分片原理篇

MongoDB分片原理篇

作者头像
林老师带你学编程
发布2019-05-25 23:56:14
5.6K0
发布2019-05-25 23:56:14
举报
文章被收录于专栏:强仔仔强仔仔

MongoDB分片

为什么需要Sharded cluster?

MongoDB目前3大核心优势:『灵活模式』+ 『高可用性』 + 『可扩展性』,通过json文档来实现灵活模式,通过复制集来保证高可用,通过Sharded cluster来保证可扩展性。

何时使用分片技术

存储容量需求超出单机磁盘容量 活跃的数据集超出单机内存容量,导致很多请求都要从磁盘读取数据,影响性能 写IOPS超出单个MongoDB节点的写服务能力

分片技术,使得集合中的数据分散到多个分片集中。使得MongoDB具备横向的发展。

Sharded cluster 分片架构

Sharded clusterShardMongosConfig server 3个组件构成。

MongosSharded cluster的访问入口, Mongos本身并不持久化数据,Sharded cluster所有的元数据都会存储到Config Server 而用户的数据则会分散存储到各个shardMongos启动后,会从config server加载元数据,开始提供服务,将用户的请求正确路由到对应的Shard

数据分布策略

分片支持单个集合的数据分散在多个分片上。目前主要有两种数据分片的策略。

  • 范围分片(Range based sharding)
  • hash分片(Hash based sharding)

范围分片

如图,集合是根据字段来进行分片。根据字段的范围不同将一个集合的数据存储在不同的分片中。 在同一个Shard上,每个Shard可以存储很多个chunkchunk存储在哪个shard的信息会存储在Config server种,mongos也会根据各个shard上的chunk的数量来自动做负载均衡范围分片适合满足在一定范围内的查找,例如查找X的值在【100-200】之间的数据,mongo 路由根据Config server中存储的元数据,可以直接定位到指定的shard的Chunk中 缺点 如果shardkey有明显递增(或者递减)趋势,则新插入的文档多会分布到同一个chunk,无法扩展写的能力

Hash分片

Hash分片是根据用户的shard key计算hash值(64bit整型),根据hash值按照『范围分片』的策略将文档分布到不同的chunk

优点Hash分片与范围分片互补,能将文档随机的分散到各个chunk,充分的扩展写能力,弥补了范围分片的不足, 缺点但不能高效的服务范围查询,所有的范围查询要分发到后端所有的Shard才能找出满足条件的文档。

合理的选择shard key

选择shard key时,要根据业务的需求及『范围分片』和『Hash分片』2种方式的优缺点合理选择,要根据字段的实际原因对数据进行分片,否则会产生过大的Chunk

Mongos

Mongos作为Sharded cluster的访问入口,所有的请求都由mongos来路由、分发、合并,这些动作对客户端driver透明,用户连接mongos就像连接mongod一样使用。

查询请求

  • 查询请求不包含shard key,则必须将查询分发到所有的shard,然后合并查询结果返回给客户端
  • 查询请求包含shard key,则直接根据shard key计算出需要查询的chunk,向对应的shard发送查询请求 写请求 写操作必须包含shard key,mongos根据shard key算出文档应该存储到哪个chunk,然后将写请求发送到chunk所在的shard。 更新/删除请求 更新、删除请求的查询条件必须包含shard key或者_id,如果是包含shard key,则直接路由到指定的chunk,如果只包含_id,则需将请求发送至所有的shard。 其他命令请求 Config Server config database Config server存储Sharded cluster的所有元数据,所有的元数据都存储在config数据库 Config Server可部署为一个独立的复制集,极大的方便了Sharded cluster的运维管理。 config.shards config.shards集合存储各个Shard的信息,可通过addShard、removeShard命令来动态的从Sharded cluster里增加或移除shard config.databases config.databases集合存储所有数据库的信息,包括DB是否开启分片,primary shard信息,对于数据库内没有开启分片的集合,所有的数据都会存储在数据库的primary shard上。 config.colletions 数据分片是针对集合维度的,某个数据库开启分片功能后,如果需要让其中的集合分片存储,则需调用shardCollection命令来针对集合开启分片。 config.chunks 集合分片开启后,默认会创建一个新的chunk,shard key取值[minKey, maxKey]内的文档(即所有的文档)都会存储到这个chunk。当使用Hash分片策略时,也可以预先创建多个chunk,以减少chunk的迁移。 config.settings config.settings集合里主要存储sharded cluster的配置信息,比如chunk size,是否开启balancer等 其他集合
  • config.tags主要存储sharding cluster标签(tag)相关的你洗
  • config.changelog主要存储sharding cluster里的所有变更操作,比如balancer迁移chunk的动作就会记录到changelog里
  • config.mongos存储当前集群所有mongos的信息
  • config.locks存储锁相关的信息,对某个集合进行操作时,比如moveChunk,需要先获取锁,避免多个mongos同时迁移同一个集合的chunk。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年02月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MongoDB分片
    • 为什么需要Sharded cluster?
      • Sharded cluster 分片架构
        • 数据分布策略
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档