MongoDB分片

来源:互联网 发布:编程用什么cpu好 编辑:程序博客网 时间:2024/05/16 17:22

分片集群
分片键
数据块
分片的优势
分片前的考虑
分片集合与非分片集合
连接分片集群
分片策略
分片集群中的分片键值空间
分片的字符比较排序规则
其它资源

分片是一种将数据分散存储到多台机器的方法,MongoDB使用分片来支持大数据集和高吞吐量的应用场景。

具有大数据集的数据库系统或高吞吐量的应用程序对单机的处理能力提出挑战。例如,高速查询会耗尽单台服务器的cpu处理能力。工作集的大小大于系统内存会对磁盘的IO造成压力。

有两种方法来应对系统的增长:垂直扩展和水平扩展。

垂直扩展指的是增加单机处理能力,例如使用一个更强大的CPU,添加更多内存,或者增加存储空间的数量。受限于现有的技术,对于给定的工作负载,单台机器并不能变得足够强大。另外,云计算基础服务提供商能提供的硬件服务配置有一定的上限。因此,垂直扩展有一个实际的最大限度。

水平扩展指的是划分系统数据集并负载到多台服务器,需要的时候,可以通过添加更多机器来增加系统的处理能力。虽然单台机器的整体速度或容量可能不高,但每台机器只处理一部分负载,可能比单一高速高容量服务器提供更好的效率。扩展系统的处理能力只需要在需要时添加更多的服务器,这可以获得比单台高端服务器更低的总体成本。代价是增加了基础设施和部署维护的复杂性。

MongoDB支持通过分片实现水平扩展。

分片集群

一个MongoDB的分片集群由以下部分组成:

  • 分片:每个分片包含分片数据的一个子集,每个分片可以被部署为一个副本集(replica set)。
  • mongos:mongos扮演了路由服务的角色,提供客户端应用程序和分片集群之间的接口。
  • 配置服务器:配置服务器存储集群的元数据和配置设定。在Mongo3.4版本,配置服务器必须部署成一个副本集 (CSRS)。

如下图片描述了分片集群中组件的交互:
这里写图片描述

MongoDB是在集合(collection)一层对数据进行分片,将集合中的数据分散存储到分片集群中的各个分片。

分片键

MongoDB使用分片键对集合进行分区,将集合中的文档分散存储到各个分片。分片键由一个或多个不可变的文档字段组成,这些字段必须存在于集合中的每个文档

在对集合进行分片时你需要选择分片键。分片键在集合分片之后不能改变,一个分片集合只能有唯一的一个分片键。查看Shard Key Specification.

当对一个非空集合进行分片时,集合必须拥有一个以分片键开始的索引。对于一个空集合,如果进行分片时集合的分片键还未拥有一个合适的索引,MongoDB会自动创建索引。查看Shard Key Indexes。

分片键的选择会影响性能,效率,和分片集群的可扩展性。一个拥有最好的硬件和基础设施的分片集群,分片键的选择可能成为其瓶颈。分片键的选择以及支持分片的索引也会影响你的集群可以使用的分片策略。

查看shard key 文档获取更多信息。

数据块

MongoDB将分片数据分割到数据块,每个数据块拥有一个基于分片的下限(包含)和上限(不包含) 的范围区间。

MongoDB使用分片集群平衡器( sharded cluster balancer)在集群的分片之间迁移数据块。平衡器试图在集群的分片之间实现数据块的再平衡。

查看Data Partitioning with Chunks 获取更多信息。

分片的优势

读/写
MongoDB将读写请求分散到分片集群中的各分片,使每个分片只处理一部分的集群操作。通过增加更多分片,读和写的负载能力都可以得到水平扩展。

那些查询条件中包含分片键或者复合分片键前缀的查询请求,mongos(路由服务)可以将请求定向路由到一个特定的分片或分片集。被定向路由的操作通常比广播类型的操作更加高效。

存储容量
数据分片将数据分散存储到集群中的各个分片,每个分片只包含整个集群数据的一部分。随着数据的增长,通过增加额外的分片就能够增加集群的存储容量。

高可用性
即便集群中的一个或更多分片不可用,分片集群仍能够执行部分读写操作(只要还有可用的分片)。虽然在宕机时间段内,哪些存储在不可用分片上的数据将不能被访问,但那些路由到可用分片上的读写请求仍然可以执行成功。

从MongoDB 3.2开始,你可以将配置服务器发布为副本集(replica sets)模式。一个拥有多副本配置服务器CSRS(Config Server Replica Set)的分片集群可以持续处理读写请求,只要配置服务器副本集中的大多数副本是可用的。从MongoDB3.4开始将不再支持SCCC(多镜像单节点)模式的配置服务器。将你的配置服务器从SCCC模式升级到CSRS模式,查看Upgrade Config Servers to Replica Set。

生产环境上,每个分片都应该被部署为副本集模式,以提高数据的冗余性和可用性。

分片前的考虑

分片集群基础设施的要求和复杂性,需要仔细的规划,执行和维护。

为了保证集群的性能及效率,在分片键的选择上必须仔细考虑。一个已经分片的集合既不能改变分片键也不能取消分片,查看Choosing a Shard Key。

执行分片有确定的操作要求和限制,查看Operational Restrictions in Sharded Clusters获取更多信息。

如果一个查询请求的查询条件中没有包含分片键或者复合分片键前缀,mongos(路由服务)会执行一个广播操作,查询集群中的所有分片。这些 分散/聚集 的查询操作会是耗时较长的操作。

注意 如果您和MongoDB有一个有效期内的支持合同,考虑联系您的客户代表获得分片集群的规划和部署的帮助。

分片集合与非分片集合

一个数据库可以同时拥有分片集合与非分片集合。分片集合中的数据被分割并分散存储在集群中的各个分片。非分片集合的数据存储在集群中的主分片。每个数据库都有它自己的主分片。

这里写图片描述

连接分片集群

你必须通过连接一个mongos路由器来访问分片集群中的任意集合。包括分片集合与非分片集合。客户端不应该连接单一的分片来执行读或写操作。

这里写图片描述

你可以使用像连接mongod(MongoDB系统主程序)一样的方式连接mongos(MongoDB分片路由服务),例如通过mongo命令行或者一个MongoDB驱动。

分片策略

MongoDB支持两种在分片集群中分割数据的策略。

散列分片

散列分片涉及计算分片键字段的散列值。每个数据块分配了一个散列值的范围。

提示
MongoDB当解析到查询中使用了散列索引时会自动计算散列值。应用不需要计算散列值。

这里写图片描述

虽然一系列分片键的键值可能很接近,但它们的散列值落到同一个数据块的可能性很小。基于散列值的数据分布策略更有利于数据的平均分布,特别在数据集的分片键是单向变化的情况下。

但是,散列分布意味着在分片键上的范围查询不太可能路由到单一分片,这将导致更多的集群广播操作。
查看 Hashed Sharding 获取更多信息。

范围分片

范围分片基于分片键值将数据划分到不同的范围。每个数据块分配了一个分片键值的范围。

这里写图片描述

拥有相近分片键值的数据很可能被分配到相同的数据块。这将允许对操作作定向路由,因为mongos可以将操作只路由到包含了所需数据的分片。

范围分片的效率依赖于分片键的选择。欠缺考虑的分片键选择将导致数据分布不均匀,这将抵消某些分片的好处或者成为性能的瓶颈。

查看shard key selection 获取更多关于范围分片分片键选择的信息。

查看Ranged Sharding获取更多信息。

分片集群中的分片键值空间

在分片集群中,你可以创建分片数据的分片键值空间。你可以将每个键值空间关联到集群中的一个或多个分片。每个分片可以关联任意数量的互不冲突的键值空间。在一个执行过平衡操作的集群中,MongoDB做数据块迁移时,如果该数据块被一个键值空间完整覆盖了,MongoDB只会将该数据块迁移到关联了对应键值空间的分片。

每个键值空间覆盖了一个或多个分片键值的范围。键值空间覆盖的每个键值范围拥有一个下限(包含)和一个上限(不包含)。

这里写图片描述

当你定义一个键值空间覆盖的新的键值范围时,你必须使用包含在分片键中的那些字段。如果你使用的是一个复合分片键,那么范围必须包含分片键的前缀。查看shard keys in zones获取更多信息。

选择分片键时,请仔细考虑未来使用键值空间进行分片的可能性,因为在分片之后,你将不能再改变分片键。

更常见的,在那些跨越多个数据中心的分片集群,键值空间提升了数据的局部化。

查看zones 获取更多信息。

分片的字符比较排序规则

使用shardCollection命令及命令选项collation : { locale : “simple” }对一个已经有缺省字符串排序比较规则的集合进行分片时,成功分片的要求有:

  • 集合必须拥有一个分片键前缀的索引
  • 索引的字符串排序比较规则必须是:{ locale: “simple” }

当创建有指定字符串排序比较规则的集合时,确保上述这些条件在集合分片之前得到满足。

注意
在分片集合上的查询会使用集合缺省的字符串比较排序规则配置。如果要使用分片键索引的字符串比较排序规则,需要在查询条件中的collation部分声明{locale : “simple”}。

查看shardCollection获取更多关于分片和字符串比较排序规则的信息。

其它资源

- Sharding Methods for MongoDB (Presentation)
- Everything You Need to Know About Sharding (Presentation)
- MongoDB for Time Series Data: Sharding
- MongoDB Operations Best Practices White Paper
- Talk to a MongoDB Expert About Scaling
- MongoDB Consulting Package
- Quick Reference Cards

分片集群组件 ->

0 0
原创粉丝点击