MongoDB分片介绍

本文简单介绍MongoDB的分片功能,对分片进行了概述,具体的功能详解,后续文章会陆续推出数据库

分片是把数据分配到多个服务器上的一种方式,MongoDB使用分片实现大数据部署以及高吞吐操做。服务器

 

大数据以及高吞吐量的应用会对单个服务器的容量形成很大的挑战。好比,高频率的查询操做会消耗服务器的CPU,若是数据集大于系统的RAM容量,也会对硬盘的性能形成影响。性能

 

应对系统容量增长有两种方式:水平扩展和垂直扩展。大数据

 

垂直扩容就是增长单个服务器的容量,好比,使用更高性能的CPU,增长RAM容量,或者增长存储容量。可是单个服务器扩容是有限制性的,况且,云设备提供商在硬件配置上很容易达到容量上限。因此垂直扩容颇有限制性。server

 

水平扩容就是把数据和系统压力分散到多个服务器上,增长多个服务器以达到增长整个系统容量的目的。尽管单个服务器的速度或者容量并非很大,可是每一个服务器均可以分担一部分系统压力,比单个高性能的服务器更加高效。增长整个部署系统的容量只须要增长几台服务器,这样比增长单个服务的性能更节约成本。缺点就是增长了系统的复杂性以及系统的维护成本。blog

 

分片集群

分片集群包括如下几个成员:索引

shard:每一个shard包含一组分片数据,每一个shard均可以以复制集的方式部署。接口

mongos:mongos的任务是查询路由,是客户端和分片集群之间的交互接口路由

config servers:配置服务器存放着系统的元数据以及集群的配置信息。MongoDB3.4以后,配置服务器必须用复制集的方式部署。文档

 

下图是集群的示意图:

 

分片是把数据分配到多个服务器上的一种方式,MongoDB使用分片实现大数据部署以及高吞吐操做。

 

大数据以及高吞吐量的应用会对单个服务器的容量形成很大的挑战。好比,高频率的查询操做会消耗服务器的CPU,若是数据集大于系统的RAM容量,也会对硬盘的性能形成影响。

 

应对系统容量增长有两种方式:水平扩展和垂直扩展。

 

垂直扩容就是增长单个服务器的容量,好比,使用更高性能的CPU,增长RAM容量,或者增长存储容量。可是单个服务器扩容是有限制性的,况且,云设备提供商在硬件配置上很容易达到容量上限。因此垂直扩容颇有限制性。

 

水平扩容就是把数据和系统压力分散到多个服务器上,增长多个服务器以达到增长整个系统容量的目的。尽管单个服务器的速度或者容量并非很大,可是每一个服务器均可以分担一部分系统压力,比单个高性能的服务器更加高效。增长整个部署系统的容量只须要增长几台服务器,这样比增长单个服务的性能更节约成本。缺点就是增长了系统的复杂性以及系统的维护成本。

 

分片集群

分片集群包括如下几个成员:

shard:每一个shard包含一组分片数据,每一个shard均可以以复制集的方式部署。

mongos:mongos的任务是查询路由,是客户端和分片集群之间的交互接口

config servers:配置服务器存放着系统的元数据以及集群的配置信息。MongoDB3.4以后,配置服务器必须用复制集的方式部署。

 

下图是集群的示意图:

 

MongoDB是在集合级别对数据进行分片的。

片键

MongoDB是使用片键对集合中的文档进行分片的。片键是被分片集合中全部文档都有的一个或者多个字段。

 

对集合分片时须要选择片键,片键一旦选定后就不能再进行修改了。一个分片集合只能有一个片键。

 

对于非空集合,片键上必须有索引。若是集合是空的,MongoDB在建立片键的时候会自动在片键上建立索引。

 

片键的选择会影响系统的性能、高效性以及集群的可扩展性。集群即便有最好的硬件设备,若是片键选择有问题也会使集群很快达到性能瓶颈。片键的选择也会影响集群使用的分片策略。

 

MongoDB分片会把数据分配到块中。每一个块都含有基于片键的一部分数据。MongoDB经过均衡器实现各个分片服务器的数据的平衡性。

 

分片的优点

读写

MongoDB集群经过分片来分散读写压力,每一个分片维护一部分集群操做,这样经过增长分片就能够水平扩展读写能力。

 

若是查询中含有片键,mongos会定位到具体的分片上。这种操做比遍历整个集群要高效的多。

存储

每一个分片会维护一组数据,随着数据增加,增长分片就能增长集群的容量。

高可用

分片集群在一个或者多个分片宕机的状况下仍然能够提供读写操做。即便宕机分片上的数据没法操做,其余可用分片上的数据还能够操做。

 

生产环境中,分片建议部署为复制集,提供冗余性以及可用性。

分片前须要考虑的事情

分片集群的基础设施须要通过精细的容量规划、执行、维护。

 

片键的选择必需要谨慎,保证集群的性能和高效性。由于分片后片键不能再修改,也不能取消。若是查询里面没有片键,mongos会遍历整个集群,这种操做会比较耗时。

分片和非分片集合

数据库能够含有分片集合以及非分片集合。分片集合被分配在集群的多个分片服务器中,未分片的集合存放在主分片中。每一个数据库都有一个主分片。

 

 

链接到分片集群

要想与分片中的集合进行交互,就必须先链接到mongos路由上。客户端绝对不该该链接到单个分片上进行读写操做。链接mngos的方法和链接到单个mongod实例是同样的。

 

 

分片策略

MongoDB支持两种分片方式:hash分片、范围分片

Hashed 分片

哈希分片就是把片键的值造成一组哈希值,每一个分片依据哈希值的范围存放必定量的文档。

 

 

即便片键的值是相近的,可是他们的哈希值极可能不同,全部就不会分配在一个分片服务去上,这样的好处就是,在分片键上基于范围的查询会分散到多个服务器上进行操做,减小了单个服务器的压力。

Ranged分片

范围分片是依据片键值的范围进行分片的,每一个分片服务器存储必定范围的数据。

 

 

片键值相近的数据就颇有可能会被分配到同一个块中。对于范围分片来讲,片键的选择很重要,片键选择合适就能够大大提升系统的系统,反之亦然。选择的片键不合理会致使数据分布不均匀,反而体现不出分片的优点或者形成系统早早出现系统瓶颈。

相关文章
相关标签/搜索