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

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

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/

mongo 3.4分片集群系列之一:浅谈分片集群的更多相关文章

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

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

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

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

  3. 【公众号系列】浅谈SAP项目管理的技能

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[[公众号系列]浅谈SAP项目管理的技能   写 ...

  4. 【ASP.NET MVC系列】浅谈数据注解和验证

    [ASP.NET MVC系列]浅谈数据注解和验证   [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google C ...

  5. 【Fiori系列】浅谈SAP Fiori的设计美感与发展历程

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[Fiori系列]浅谈SAP Fiori的设计美 ...

  6. Spring5.0源码学习系列之浅谈BeanFactory创建

    Spring5.0源码学习系列之浅谈BeanFactory创建过程 系列文章目录 提示:Spring源码学习专栏链接 @ 目录 系列文章目录 博客前言介绍 一.获取BeanFactory主流程 二.r ...

  7. 浅谈elasticsearch 集群

    elasticsearch 集群 摘要: elasticsearch 集群 搭建elasticsearch的集群 现在假设我们有3台es机器,想要把他们搭建成为一个集群 基本配置 每个节点都要进行这样 ...

  8. 浅谈Linux集群

      集群听起来好像就是一个很高端很的技术,其实不是的,那么集群其实就是一堆计算机的集合,给用户提供同一个服务的一组计算机,就称之为集群,对于用户而言好像就是一台计算机提供的服务,集群主要分为三大类, ...

  9. 【ASP.NET MVC系列】浅谈NuGet在VS中的运用

    一     概述 在我们讲解NuGet前,我们先来看看一个例子. 1.例子: 假设现在开发一套系统,其中前端框架我们选择Bootstrap,由于选择Bootstrap作为前端框架,因此,在项目中,我们 ...

随机推荐

  1. jQuery的DOM操作之捕获和设置

    .html()--获取或设置目标元素内的全部内容,包括html的标签及属性在内: .text()--仅获取或设置目标元素内的文本内容. .val()--获取输入框的值: .attr()--获取或设置目 ...

  2. Linux---有关dig命令的有用脚本

    这里直接给出脚本以及运行的效果图,主要推断了一下cdn然后能够直接过滤url.默认就是dig +域名 +short. 脚本qdig(随便能够取一个名字)例如以下: #!/usr/bin/env bas ...

  3. 第6章1节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览

    在上一章中我们有简要的介绍了事件源是怎么一回事.可是并没有进行详细的描写叙述.那么往下的这几个小节我们就须要把这方面的知识给补充完整. 这一节我们先主要环绕MonkeySourceNetwork这个事 ...

  4. 基于MFC的一个简单计算器

    写一个简单的计算器并不是什么很难的事,主要目的是要通过这个程序来学习和分析其中的核心算法.这个简易计算器的核心部分就是对输入的表达式的正确性判断与求值,其中包括对表达式的解析.中缀表达式转后缀表达式. ...

  5. 秒懂C#通过Emit动态生成代码 C#使用Emit构造拦截器动态代理类

    秒懂C#通过Emit动态生成代码   首先需要声明一个程序集名称, 1 // specify a new assembly name 2 var assemblyName = new Assembly ...

  6. CSS总结01

    1 CSS 的作用是? 2 如何引入 CSS 样式? 3 CSS 选择器的基本类型和复合选择器分别是? 4 字体.背景.列表和链接和鼠标的属性有哪些? 5 如何理解盒子模型? 6 浮动的方式有哪些,如 ...

  7. Android自己定义dialog中的EditText无法弹出键盘的解决

    近期我独立开发的项目<全医会>已经在内測其中了.非常快将会上架到各大应用市场.之前开发的几个项目都由于一些原因没有上架还是比較遗憾的.所以,近期我心情格外的好. 今天在做一个新项目,专为律 ...

  8. beego3---gohttp底层实现

    package main //gohttp底层实现,通过gohttp不是通过beego实现的输出 // import ( "io" "log" "ne ...

  9. Linux/Android——Input系统之InputReader (七)【转】

    本文转载自:http://blog.csdn.net/jscese/article/details/42739197 在前文Linux/Android——Input系统之frameworks层Inpu ...

  10. Groonga开源搜索引擎——列存储做聚合,没有内建分布式,分片和副本是随mysql或者postgreSQL作为存储引擎由MySQL自身来做分片和副本的

    1. Characteristics of Groonga ppt:http://mroonga.org/publication/presentation/groonga-mysqluc2011.pd ...