设为首页 收藏本站
查看: 1388|回复: 0

[经验分享] MongoDB分片原理篇

[复制链接]

尚未签到

发表于 2017-12-15 12:10:17 | 显示全部楼层 |阅读模式
MongoDB分片
为什么需要Sharded cluster?
  MongoDB目前3大核心优势:『灵活模式』+ 『高可用性』 + 『可扩展性』,通过json文档来实现灵活模式,通过复制集来保证高可用,通过Sharded cluster来保证可扩展性。
  何时使用分片技术
  存储容量需求超出单机磁盘容量
  活跃的数据集超出单机内存容量,导致很多请求都要从磁盘读取数据,影响性能
  写IOPS超出单个MongoDB节点的写服务能力
DSC0000.png

  分片技术,使得集合中的数据分散到多个分片集中。使得MongoDB具备横向的发展。
Sharded cluster 分片架构
  Sharded clusterShardMongosConfig server 3个组件构成。
DSC0001.png

  MongosSharded cluster的访问入口,
  Mongos本身并不持久化数据,Sharded cluster所有的元数据都会存储到Config Server
  而用户的数据则会分散存储到各个shardMongos启动后,会从config server加载元数据,开始提供服务,将用户的请求正确路由到对应的Shard
数据分布策略
  分片支持单个集合的数据分散在多个分片上。目前主要有两种数据分片的策略。

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

  如图,集合是根据字段来进行分片。根据字段的范围不同将一个集合的数据存储在不同的分片中。
  在同一个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
DSC0003.png

  优点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>其他集合
  • config.tags主要存储sharding cluster标签(tag)相关的你洗
  • config.changelog主要存储sharding cluster里的所有变更操作,比如balancer迁移chunk的动作就会记录到changelog里
  • config.mongos存储当前集群所有mongos的信息
  •   config.locks存储锁相关的信息,对某个集合进行操作时,比如moveChunk,需要先获取锁,避免多个mongos同时迁移同一个集合的chunk。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-424338-1-1.html 上篇帖子: mongodb新人扫盲 下篇帖子: 详解 Node + Redux + MongoDB 实现 Todolist
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表