zoukankan      html  css  js  c++  java
  • mongo 3.4分片集群系列之一:浅谈分片集群

    这篇为理论篇,稍后会有实践篇。

    这个系列大致想跟大家分享以下篇章:

    1、mongo 3.4分片集群系列之一:浅谈分片集群

    2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片

    3、mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全

    4、mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + 安全 + 区域

    5、mongo 3.4分片集群系列之五:详解平衡器

    6、mongo 3.4分片集群系列之六:详解配置数据库

    7、mongo 3.4分片集群系列之七:配置数据库管理

    8、mongo 3.4分片集群系列之八:分片管理

    1、分片集群是个啥玩意儿

    要回答这个问题,首先得知道它是由什么东东组成的。

    MongoDB分片集群由以下组件组成:

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

       

    MongoDB基于集合级别的数据分片,将集合数据分布在集群的分片上。

    2、 为啥要用分片集群(分片的好处)

      分片是一种在多台机器上存储数据的方法。MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署。

    1)工作负载

      MongoDB将读写工作负载分布在分片集群的 分片上,从而允许每个分片处理集群操作的一个子集。通过添加更多的分片,可以在集群之间水平地缩放读取和写入的工作负载。

    2)存储容量

      分片用来存储数据,当数据集增大,可以通过添加分片来扩展分片集群的容量。因此,理论上,分片集群的容量可以无限水平扩展。

    3)高可用

      分片集群可以继续执行部分读/写操作,即使一个或多个分片不可用。虽然在停机期间无法访问不可用的分片上的数据子集,但是可用分片上的读取或写入仍然可以成功。

    3、分片集群要知道的名词(分片键,块)

    1)分片键

      分片键就是由集合中每个文档中存在的字段或不可变字段组成。

      分片键的作用:MongoDB 使用分片键对集合进行分片。

      注意:分片后的分片键的选择不能改变,也就是说字段不能更改为其他字段,并且字段的值不能修改。分片集合只能有一个分片键。

      要分割非空集合,集合必须具有 以分片键开头的索引。对于空集合,如果集合尚未具有指定分片键的适当索引,则MongoDB将创建索引。

      分片键的选择会影响分片集群的性能,效率和可扩展性。

    2)块

    MongoDB将分片数据分割成块。基于分片键,每个块都有一个包含下限,但不包含上限的范围。

    MongoDB使用分片集群平衡器在分片集群的分片之间迁移块。平衡器试图实现在群集中的所有分片的块均匀分布。

    4、分片前考虑事项

      为确保集群性能和效率,必须认真考虑选择分片键。分片后您不能更改分片键,也不能取消集合分片。如果查询包含分片键或复合分片键的前缀 ,则mongos执行广播操作,查询分片集群中的所有分片。这可能需要长时间运行的操作。

    分片具有一定的操作要求和限制。

    1)在分片中不可用的操作

      不起作用:group, db.eval(), $where不允许引用db对象,$isolated, $snapshot, geoSearch命令。

    2)在分片中单个文档的修改操作

      所有的updateOne(),removeOne()以及deleteOne()用于分片集合操作必须包括分片键 _id在查询字段中。否则,会返回一个错误。

    3)分片集合的唯一索引

      MongoDB不支持分片上的唯一索引,除非唯一索引包含完整的分片键作为索引的前缀。在这些情况下,MongoDB将强制执行完整键的唯一性,而不是单个字段。

      即可以有唯一索引,但这个唯一索引必须包含分片键的全部。

    5、分片策略

    MongoDB支持两种分片策略,哈希分片和范围分片。

    1) 哈希分片

      哈希分片,Mongo自动计算分片键字段值的哈希值。然后,基于哈希的分片键值为每个块分配一个范围。

      当使用哈希索引解析查询时,Mongo会自动计算哈希值。应用程序需要计算哈希值。

         

           示例是用“X” 作为分片键,采用哈希分片策略,它们的哈希值可能不在同一块,基于哈希值有助于更均匀的数据分布,特别是在分片键单调变化的数据集中。

    2)范围分片

    范围分片,基于分片键值将数据划分为范围。每个块被分配基于所述分片键值的范围内。

       

    值为“X”的分片键的范围更可能存储在相同的块上。这允许目标操作,因为mongos可以将操作路由到仅包含所需数据的分片。

    3)哈希分片 VS 范围分片

    给定使用单调递增值的集合,X作为分片键,使用范围分片可以得到类似于以下内容的插入分布:

       

    由于X的值总是在增加,所以具有上限maxKey的块接收到大部分的写入。这将限制对包含此块的单个分片的插入操作,从而减少或消除分布式写入在分片集群中的优势。

    通过使用哈希索引,X作为分片键,插入的分布类似于以下内容:

       

    由于数据现在更均匀地分布,所以插入在整个集群中有效地分布。

    --------------------------------------- over ------------------------------------------------------

    以上资料,大部分是参考官网的资料,在此表示感谢。

    https://docs.mongodb.com/manual/sharding/

  • 相关阅读:
    用 Python 带你看各国 GDP 变迁
    Fluent Interface(流式接口)
    probing privatePath如何作用于ASP.NET MVC View
    Word插入htm文件导致文本域动态增加的一个问题
    Visual Studio 2013附加进程调试IE加载的ActiveX Control无效解决方法
    Ubuntu下Chrome运行Silverlight程序
    Windows Phone Bing lock screen doesn't change解决方法
    SPClaimsUtility.AuthenticateFormsUser的证书验证问题
    Web Service Client使用Microsoft WSE 2.0
    Visual Studio 2013安装Update 3启动crash的解决方法
  • 原文地址:https://www.cnblogs.com/ddbear/p/7746076.html
Copyright © 2011-2022 走看看