MongoDB: 分片sharding

分片(sharding)是MongoDB用来将大型数据集合分到散不同服务器使用的方法, 这样不需要功能强大的服务器就能够存储更多的数据和处理更大的负载. 基本思想就是将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一部分,最后通过一个均衡器来对各个分片进行均衡(数据迁移. 通过一个名为mongos的路由进程进行操作,mongos知道数据和片的对应关系(通过配置服务器).

基本架构

  • mongos: 访问集群的入口, 其本身不持久化数据, 读写操作建议都通过该组件进行, 保证cluster多个组件处于一致的状态. 一般有多个mongos节点
  • config server: 存储集群的元数据, 即各分片包含了哪些数据的信息(是一种映射, 并不保存真实的数据), 需要空间很小
  • shard: 存储用户的业务数据, 可以是一个副本集也可以是单台机器, 以chunk为单位存数据

什么时候需要使用分片?

  • 单台机器存储不足
  • 单台机器不能满足写入数据的性能要求, 通过分片让写压力分散到各个分片上面, 使用分片服务器自身的资源

chunk是什么?

使用sharding功能后, 数据会根据shard key来把数据分割成不同的chunk放到shard服务器上. chunk(默认64M)主要有以下功能

  • spliting(分裂)
    写入数据时,当 chunk 上写入的数据量,超过chunk size(64M)时,mongodb后台进程就会触发 chunk 的分裂, 分割成更小的chunk, 防止单个chunk过大
  • balancing(平衡)
    当各个shard上chunk分布不均衡时,就会触发chunk迁移. chunk的分裂和迁移非常消耗IO资源.

chunk在写入数据时会分裂, 在读取时不会. chunksize会影响数据的迁移速度, 如果chunksize很大, 数据分裂少, 但是迁移会很慢, 还可能出现chunk内文档数过多无法迁移(chunk 内文档数不能超过 250000)

  • jumbo chunk

    MongoDB 默认的 chunk size 为64MB,如果 chunk 超过64MB 并且不能分裂(比如所有文档 的 shard key 都相同),则会被标记为jumbo chunk ,balancer 不会迁移这样的 chunk,从而可能导致负载不均衡

数据分布

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

  • 范围分片
    优点: 能很好满足范围查询的需求, 因为连续的数据大概率在一个shard上, 也可能在一个chunk上.
    缺点: 如果分片键是连续递增的话, 新插入数据会落到一个chunk上, 如果这部分数据特别活跃, 则不能充分利用集群的性能优势. 注意: mongodb的_id高位是时间戳递增的
  • hash分片
    优点: 可以更好的利用集群性能
    缺点: 不能快速进行范围查询

分片键

分片键决定了数据会以怎样的策略进行分布, 主要有

  • 递增型
  • 随机性
  • 混合型

可以结合业务特点来选择合适的分片键, 同时要注意以下

  • 分片键一旦设置不能取消
  • 分片键必须有索引. 如果集合是非空, 必须先设置该field为索引, 才能指定为分片键
  • 分片键用于路由查询
  • 分片键大小限制512bytes
# 启用数据库分片:
sh.enableSharding("<database>")

# 使用hash分片键
sh.shardCollection('db.collection', {'field':'hashed'})

# 使用递增分片键
sh.shardCollection('db.collection', { field: 1})

# 查看分片是否成功
db.collection.stats().sharded

# 查看数据分布
db.collection.getShardDistribution()

参考资料

原文地址:https://www.cnblogs.com/zlone/p/11964850.html

时间: 2024-12-20 17:26:12

MongoDB: 分片sharding的相关文章

Mongodb分片(Sharding)功能实现

MongoDB 分片概述 分片 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求. 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量.这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据. 为什么使用分片 复制所有的写入操作到主节点 延迟的敏感数据会在主节点查询 单个副本集限制在12个节点 当请求量巨大时会出现内存不足. 本地磁盘不足 垂直扩展价格昂贵 MongoDB分片 下图展

MongoDB分片(sharding)

1.概念 分片(sharding)是指将数据拆分,将其分散存在不同的机器上的过程.有时也用分区(partitioning)来表示这个概念.将数据分散到不同的机器上,不需要功能强大的大型计算机就可以储存更多的数据,处理更多的负载. 2.分片 mongos就是一个路由服务器,它会根据管理员设置的"片键"将数据分摊到自己管理的mongod集群,数据和片的对应关系以及相应的配置信息保存在"config服务器"上. mongod:一个普通的数据库实例,如果不分片的话,我们会直

【MangoDB分片】配置mongodb分片群集(sharding cluster)

配置mongodb分片群集(sharding cluster) Sharding cluster介绍 这是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架构去构建monodb系统. 要构建一个 MongoDB Sharding Cluster,需要三种角色: Shard Server: mongod 实例,用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障 Config Server: m

mongodb复制集(Replica sets)+分片(Sharding)环境搭建

1.创建数据目录--server a:# mkdir -p /data/shard1_1# mkdir -p /data/shard2_1# mkdir -p /data/config --server b:# mkdir -p /data/shard1_2# mkdir -p /data/shard2_2# mkdir -p /data/config --server c:# mkdir -p /data/shard1_3# mkdir -p /data/shard2_3# mkdir -p

MongoDB分片实战

MongoDB分片实战(一):集群搭建 http://www.cnblogs.com/magialmoon/archive/2013/04/10/3013121.html MongoDB分片实战(二):Sharding http://www.cnblogs.com/zhanjindong/archive/2013/04/11/3015394.html MongoDB分片实战(三):性能和优化 http://www.cnblogs.com/zhanjindong/archive/2013/04/1

MongoDB分片存储的集群架构实现

MongoDB分片存储的集群架构实现 如果需要存储大量数据,或者系统的读写吞吐量很大的时候,单个server就很难满足需求了.这个时候我们可以使用MongoDB的分片机制来解决这些问题. 分片的基本概念 分片(sharding)是一种水平扩展(horizontal scaling)的方式,把一个大的数据集分散到多个片服务器上,所有的片服务器将组成一个逻辑上的数据库来存储这个大的数据集.分片对用户(应用层)是透明的,用户不会知道数据很被存放到哪个片服务器上. 这种方式有两个好处: 分片之后,每个片

MongoDB分片之数据分割方式

随着移动互联网的发展,大量的非结构化数据随之产生,不仅对数据库存储大数据提出了新的要求,同时对于查询数据和进行大数据分析也提出了苛刻的要求,这些显然是单服务器处理能力无法满足的,自然建立一个集群是不可避免的.集群的复杂性大家众所周知,而MongoDB的优势之一正式可以帮助我们解决这些问题. 分片(sharding) 分片是MongoDB提供的一种机制,其可以将大型的集合分割保存到不同的服务器上.与其他的分区方案相比,MongoDB几乎能自动为我们完成所有事情.只要我们进行简单的配置,并告诉Mon

Bugsnag的MongoDB分片集群使用经验

Bugsnag是一家为移动应用开发者提供实时的Bug追踪及检测服务的创业公司,Bugsnag已经使用MongoDB存储超过TB级的文档数据.从Bugsnag的第一个版本开始他们就使用MongoDB存储业务数据.近日,Bugsnag的工程师Simon Maynard在博客上分享了他们的MongoDB分片集群经验,并开源了几个他们常使用的脚本. 带标签的分片(Tag Aware Sharding) 带标签的分片是MongoDB 2.2版本中引入的新特性,此特性支持人为控制数据的分片方式,从而使数据存

MongoDB 分片

分片 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求. 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量.这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据. 为什么使用分片 复制所有的写入操作到主节点 延迟的敏感数据会在主节点查询 单个副本集限制在12个节点 当请求量巨大时会出现内存不足. 本地磁盘不足 垂直扩展价格昂贵 MongoDB分片 下图展示了在MongoDB中使用