MongoDB官方翻译---切片

原文

切片

通过将数据分散保存在不同机器之间称之为切片,MongDB使用切片来支持超大数据和超高负载的环境。

超大数据块或者超高负载的数据库对于单服务器来说压力很大。例如,超高查询率会令榨干CPU资源。比内存还要大的数据集会增加系统I/O的压力。

有两个方法可以增加系统的寻址能力:纵向排列和横向排列。

纵向排列加强了单服务器的处理能力,例如使用更加强大的CPU,扩展内存,或者增加磁盘容量等。总结起来就是:你的机器必须足够强大。

横向排列将系统数据集负载在不同的机器上,必要时可以增加额外的服务器来增加处理能力。单服务器可能会存在瓶颈。多服务器情况下每个服务器处理某个数据集的子集,比单台服务器的效率要高,而且是当有需要的时候才增加新的服务器,比投资单台超高配置的服务器成本要低,但代价是复杂性提高,维护便捷能力下降。

其实横向排列就是分片(sharding).

分片集群

MongDB的分片集群由以下几个部分组成:

  • 分片:每一个分片包含了数据集里的一个子集。每个分片都可以部署为副本集。
  • mongos:mongos充当查询路由角色,提供一个客户端和分片集群之间的接口。
  • config servers: Config servers持有元数据和集群的配置文件。MongoDB3.4以后, Config servers必须部署成副本集。

下图描述了分片集群里的信息交互部分:
[图片上传失败...(image-f67063-1519919513619)]

MongDB分片的数据在collection级,通过集群里的分片来分发数据。

分片Key

为了将一个集合里的文档分开存放,MongoDB利用shard key来将集合里的文档分开。shard key由存在于目标集合的某个唯一字段或唯一的多个字段组成。

在对集合进行分片的时候你要选择一个shard key。分片以后该shard key不能改变。一个分片集合只能有一个shard key。参考 Shard Key Specification.

对一个非空集合进行分片,该集合必须拥有一个由shard key开头的索引。对于空集合,如果指定的shard key没有适当的索引,MongoDB会自动创建一个。参考 Shard Key Indexes.

选择的shard key会对分片集群的性能,效率,可扩展性造成影响。shard key的选择会对即便是最好的硬件和设施造成瓶颈。同时根据你shard key的选择和shard key的索引,也会对集群所使用的 sharding strategy造成一定影响。

MongDB将分片的数据保存在块中。同时每个块根据shard key持有不同的上限和下限。

MongDB通过集群里的碎片使用集群平衡器来移动块,平衡器通过集群里的所有碎片来尝试获得均衡的块。

详情: Data Partitioning with Chunks

分片的优势

读/写

MongDB将读写负载分发给集群里的碎片处理,每个碎片处理该负载的一个子集。读写操作可以通过增加碎片来横向扩展。
对于包含shard key或者shardkey前缀的查询, mongos会用指定的碎片或者复合查询的碎片前缀处理该查询。这种操作通常会比把查询发送到分片集群里的所有碎片看谁能处理更高效。

储存容量

数据通过集群里的碎片分配数据,集群里的每个碎片处理数据的一个子集。当数据越来越大的时候,通过增加碎片来维持容量可靠性。

高可用性

即便一个或多个碎片不可用的时候,分片集群依然可以继续执行局部的读写操作。一个数据的子集在一个不可用的碎片里超时时,
读写操作依然可以直接在可用碎片上成功被执行。

在MongDB3.2开始,你可以将 config servers部署成replica sets.当replica sets.正常运行时,带有CSRS的分片集群就可以正常执行读写操作。MongoDB3.4以后,不支持SCCC 作为config servers,如要从SCCC升级为CSRS,请查看Upgrade Config Servers to Replica Set.
在实际生成环境中,单独的碎片应该部署为副本集,以提高冗余性和可用性。

分片的注意事项

分片集群的配置和复杂性要求谨慎,谨慎执行,谨慎维护。

为确保性能和效率,选择shard key时请务必考虑清楚。shard key一旦部署则无法更改,集合也无法从碎片状态变为普通状态。

分片必须遵守操作规范和限制。

如果查询不包含shard key或者shard key作为复合查询的前缀,mongos把该查询广播到分片集群里的所有碎片,在所有碎片里进行查询操作,这种分/收查询有可能运行时间较长。

分片和非分片集合

数据库可以同时持有分片和非分片集合。分片集合被划分并分布在集群的碎片上。非分片集合仅被primary shard持有。每个数据库都有各自的primary shard。

[图片上传失败...(image-99216e-1519919513620)]

连接到分片集群

你必须连接到集群里的mongos路由来跟集合进行交互。分片或非分片集合都是如此。不要连接到单独的碎片来执行读写操作。

[图片上传失败...(image-fceb99-1519919513620)]

你可以跟连接到 mongod一样连接到 mongos

分片方式

MongoDB通过集群分发数据有两种方式。

哈希碎片

哈希碎片通过计shard key字段计算出哈希值,然后基于该哈希值为每个块分配范围。

Tips:当用哈希索引解析查询的时候,MongDB会自动计算出哈希值。我们不用自行计算。

[图片上传失败...(image-ee973d-1519919513620)]

虽然某个范围的shard key或许是"相近的",但他们的哈希值不太可能是一样的。基于散列值的数据分布更有利于数据的分布,尤其是在shard key单调变化的数据集中。

总之,利用哈希碎片分布数据意味着在shard key上进行范围查询不太可能命中单一碎片。

范围碎片

范围碎片基于shard key值将数据分割,计算出一个范围,然后每个块可以分配该范围的一部分。
[图片上传失败...(image-ebd2d1-1519919513620)]
一系列"相近的"shard key值由可能存在于相同的块中。这允许 mongos可以把操作路由到仅仅包含请求数据的碎片中。

shard key的选择决定了范围碎片的效率。不合适的shard key会导致数据分发不均匀,这样切片的优势可能会收到负面影响或者造成性能瓶颈。

集群的区间

在切片集群里,你可以基于shard key为碎片数据创建zones。你可以把集群里的一个或者多个碎片关联到zone里。一个碎片可以被关联到任意数量的非冲突的zones中。在平衡器中,被zone覆盖的块只会被移动到与该zone关联的碎片中。

每一个zone都会覆盖一个或多个shard key键值的范围。每个zone的范围包括下边界但不包括上边界。

[图片上传失败...(image-c75a9-1519919513620)]

在定义一个新zone的范围时,你必须使用被包含在shard key的字段。如果使用一个复合shard key,范围必须包含该shard key的前缀。

在选择shard key时,请务必充分考虑到未来使用到zone的可能性,因为一旦集合碎片化,shard key将无法改变。

一般,zones用于改善多数据中心的数据局限性。

使用 shardCollection中的 collation : { locale : "simple" }命令对带有 default collation.的集合进行碎片化。
成功碎片化的集合有以下两个特征:

  • 集合必须带有一个前缀是shard key的索引。
  • 索引必须含有collation { locale: "simple" }。

当创建一个带有collation的新集合,确保碎片化前已经满足以上步骤。

在碎片化集合上查询会继续使用集合的默认collation 配置。要使用shard key索引的simple collation,在查询的 collation document指定{locale:"simple"}

你可能感兴趣的:(MongoDB官方翻译---切片)