MongoDB-分片

本页目录

  • 分片集群 
  • 分片主键
  • 分片的优势
  • 分片前注意事项
  • 分片与未分片集合的区别
  • 接入到分片集群
  • 分片策略
  • 分片集略中的区域
  • 分片中的集合
  • 改变流
  • 额外资源

分片是一种将数据分发到多台机器上的方法. MongoDB使用分片来支持大数据集和高吞吐量操作的部署; 

单服务器对数据库系统的大数据集和高吞吐量提出了挑战. 例如, 高查询率能耗尽服务器的CPU性能. Working set sizes larger than the system’s RAM stress the I/O capacity of disk drives.

解决系统增长的方法有两种:垂直和横向扩展

 垂直扩展括增加单台服务器的性能,例如使用更强的CPU,添加更多内存或增加更多存储空间. 受限于现在的技术,单服务的性能扩展是有限的,另外基于云的供应商也会有硬件配置的上限,因此,垂直扩展也是有最大值的;

横向扩展涉及到划分系统数据集并在多个服务器上加载,添加额外的服务器以增加所需的容量。虽然单个机器的总体速度或容量可能不高,但每台机器都处理总体工作负载的一个子集,可能比单个高速高容量服务器提供更好的效率。扩展部署的容量只需要根据需要添加额外的服务器,这比单个机器的高端硬件的总体成本要低。这种交易增加了基础设施的复杂性和部署的维护。

分片集群

MongoDB分片集群包含以下组件:

  • shard: 每个分片包含分片数据的子集。可以将每个分片部署为一个副本集。
  • mongos: mongos充当查询路由器,在客户端应用程序和分片集群之间提供接口。
  • config servers: 配置服务器存储集群的元数据和配置设置。从MongoDB 3.4开始,配置服务器必须作为一个副本集(CSRS)部署。

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

MongoDB在集合级别上对数据进行分片,将集合数据分布到集群中的各个分片上。

分片键

要在集合中分发文档,MongoDB使用分片键对集合进行分区。分片键由目标集合中的每个文档中存在的不可变字段组成。

 集合分片键可以选择,但分片后不可修改,一个分片集合只能有唯一分片键;查看 Shard Key Specification.

对非空集合分片,集合必须具有以分片键开始的索引。对于空集合,如果集合没有指定的shard键的适当索引,MongoDB会创建索引 ,查看 Shard Key Indexes.

分片键的选择影响了分片集群的性能、效率和可扩展性。一个具有最好的硬件和基础设施的集群可能会被分片键的选择所限制。分片键及其支持索引的选择也会影响群集可以使用的共享策略。总之,分片键的选择非常重要;

有关更多信息,请参见“分片键”文档。

MangoDB分区将数据分割成块。每个块都包含基于分片键的包含的下限和排他性上限。
MangGDB使用的集群均衡器在分片集群中跨越分片进行迁移。均衡器试图在集群中的所有分片之间实现块的均匀平衡。
有关更多信息,请参见“Data Partitioning with Chunks”。

 

分片的优越性

读 / 写扩展性

MongGDB将读取和写入工作负载分配到分片集群中的分片中,允许每个分片处理集群操作的子集。通过添加更多分片,读取和写入工作负载可以在整个集群上水平缩放。
对于包括分片或复合关键字碎片前缀的查询,Mangos可以针对特定分片或分片集合来进行查询。这些目标运算通常比簇内每个分片的广播更有效。如果可能,建议使用mongos来查询,效率会更高;

 存储容量

分片将数据分发到集群中的分片中,允许每个分片包含集群数据的子集。随着数据集的增长,添加分片可以增加集群的存储容量。

高可用

当一个或多个分片不可用时,一个分片集群可以继续执行部分读/写操作。虽然在停机期间无法访问不可用分片的数据子集,但指向可用分片的读写仍然可以成功。
从Mangodb 3.2开始,您可以将“配置服务器”作为“副本集”部署。具有配置服务器副本集(CSRS)的分片集群可以继续处理读取和写入,只要大多数副本集可用。
在版本3.4中,Mangodb取消了对SCCC配置服务器的支持。
在生产环境中,单个分片应被部署为副本集,提供冗余和可用性。

分片前的考虑

集群基础设施需求和复杂性需要有清晰仔细的规划、执行和维护。
仔细考虑选择分片键是必要的,以确保集群性能和效率。切割后不能更改分片键,也不能清除分片集合。
分片有一定的操作要求和限制。有关更多信息,请参阅“分片集群”中的操作限制。
如果查询不包含碎片键或复合分片键的前缀,则mongos执行广播操作,查询分片集群中的所有碎片。这些分散/聚集查询可以是长时间运行的操作。
注释
如果您与Mangodb有一个积极的支持合同,请考虑与您的帐户代表联系以帮助集群规划和部署。

分片与未分片集合

数据库可以有一个混合的分片和非分片集合。分割的集合是分区的,并且分布在集群的分片中。未分割的集合存储在主分片上。每个数据库都有自己的主分片。

连接到分片集群

必须连接到MyGOS路由器,以便与共享集群中的任何集合进行交互。这包括了分片和非分片集合。客户端不应该为了读写操作而连接到单个分片上。

你可以连接到 mongos 请像连接到 mongod 那样, 例如通过 mongo shell 或一个 MongoDB 驱动.

分片策略

MongoDB 支持两种通过分片集群分布数据的分片策略

散列分片

散列分析包含一个分片键字段值的散列,每个块基于散列分片键值分配一个范围.

TIP

MunGDB在使用哈希索引解析查询时自动计算哈希值。应用程序不需要计算散列值.

虽然一系列分片键可能是“关闭”的,但它们的散列值不太可能在同一块上。基于散列值的数据分发有助于更均匀的数据分布,尤其是在分片键单调变化的数据集中。

然而,散列分布意味着基于分片的查询的基于范围的查询不太可能针对单个分片,从而导致更多的集群范围的广播操作。

分片划分

分片划分表明基于分片键的数据划分的范围,根据分键值分配每个区块的范围。

.

一个值为“关闭”的分片键更可能驻留在同一块上,这允许有针对性的操作,作为mongos可以将操作路由到包含所需数据的分片上。

分片划分的效能依赖分片键的选择。考虑不周的分片键可能导致数据分布不均,会减弱分片的优势,可能引起性能瓶劲。

集群中的区域

在分片集群中,您可以基于分片键创建分片数据区域。可以将每个区域与集群中的一个或多个分片关联。分片可以与任意数量的区域关联。在一个平衡的集群中,MongoDB只将一个区域覆盖的块迁移到与该区域相关联的那些分片。

每个区域包含一个或多个分片键值范围。区域所覆盖的每一个范围都包括它的下边界和它的上边界。

在定义要覆盖区域的新范围时,必须使用分片键中包含的字段。如果使用复合分片键,范围必须包括分片键的前缀。有关更多信息,请参阅区域中的分片键。

在选择分片键时,仔细考虑在将来使用区域分片的可能性,因为您不能在共享集合之后更改分片键。

最常见的情况是,专区用于改善跨多个数据中心的分片集群的数据局部性。

有关更多信息,请参见专区。

分片中的集合

使用shardCollection命令和collation: {locale: "simple"}选项来切分具有默认排序的集合。成功的分片需要:

  • 集合必须有一个以分片键为前缀的索引
  • 索引必须有集合 { locale: "simple" }

使用排序规则创建新集合时,请确保在分片集合之前满足这些条件

NOTE

对分片集合的查询继续使用为集合配置的默认排序规则。要使用分片键索引的简单排序,请在查询的排序规则文档中指定{locale: "simple"}。 有关分片和排序的更多信息,请参见 shardCollection

改变流

从MongoDB 3.6开始,更改流可以用于副本集和分片集群。更改流允许应用程序访问实时数据更改,而不会带来跟踪操作日志的复杂性和风险。应用程序可以使用更改流订阅集合或集合上的所有数据更改。

你可能感兴趣的:(mongodb)