第五部分 架构篇 第十七章 MongoDB Sharding 架构(理解块)

1、如何创建块

在前面的已经了解MongoDB分片架构中块的基本概念,那么在此来讲述如何创建块?当你决定分配数据时,必须为块区间选择一个键(前面我们一直在用username)这个键叫做片键(shard key),片键可以是任意字段或者字段的组合,比如如下文档中:

<pre name="code" class="java"><pre name="code" class="java">{"username":"paul","age":23}
{"username":"simon","age":17}
{"username":"widdly","age":16}
{"username":"grill","age":95}
{"username":"bertango","age":55}


如果我们选择age字段作为片键并得到一个块区间[20,26),则此块会包含以下文档:

{"username":"paul","age":23}
{"username":"grill","age":95}
{"username":"bertango","age":55}

如你所见,这个块中的所有文档其age字段值都在这个块的区间内。

2、对集合分片

对一个集合分片时,无论集合里有什么数据MongoDB都只会创建一个块,这个块的区间使(负无穷,正无穷),其中负无穷是MongoDB可以表示最小值(也叫做$minKey),正无穷是最大值(也叫$maxKey)。

注意:如果被分片的集合中包含大量数据,MongoDB会立刻把这个初始化分割为多个较小的块。

事实上,由于上面例子中的集合太小并不能触发分割,所以在插入更多数据之前,都只有一个块(负无穷,正无穷),尽管如此,为了达到演示的目的,我们假设这个数据量已经足够大了。

MongoDB会把初始化块(负无穷,正无穷)分割成为两个新块,分割位置一般选在已有数据区间的中点附近,因此,如果大约一半文档的age字段小于20,且另外一半大于20.MongoDB就会很可能会选择20,这样就得到两个块:(负无穷,20]和[20,正无穷),如果我们往块[20,正无穷)里继续插入数据,它会再一次被分割(比如说分割成[20,30)和[30,正无穷)),这样集合中就有了3个块(负无穷,20)、[20,30)和[30,正无穷),在插入更多数据的同时,MongoDB会持续地将已有块分割成更多的新块。

块的区间可以只包含一个值(比如仅包含用户名为paul的用户),但是各块的区间必须互不相同(不能有两个块得区间同为["a","f"),另外也不能有区间有互相重叠的块,而且每个块得区间必须紧邻下一个块的区间,因此如果要分割一个区间为[4,8)的块,结果可以使[4,6)好[6,8)(因为二者合起来能覆盖原块得区间),但不可以是[4,5)和[6,8)(因为这样集合将丢失区间[5,6)中的所有数据),也不能是[4,6)和[5,8)(因为会造成块得部分重叠),每个文档必须属于且仅属于一个块,如下图演示一个块分割成两个块:

说明:

由于MongoDB不强制要求任何形式的结构定义,你可能会纳闷,那没有值可以作为片键的文档会被放到哪里呢?

实际上MongoDB并不允许插入无片键的文档(尽管使用null作为片键也是可以的),也不允许修改文档的片键值(如用$set命令)。给文档一个新片键的唯一方法是先删除文档,然后在客户端修改片键的值,再重新插入文档。

如果在一些文档中使用字符串,而在另外一些文档中使用数字呢?这也是可以的,因为在MongoDB中类型之间有严格的次序,如果在age字段插入一个字符串(或者数组、布尔值、null等),MongoDB会按照类型对其排序,类型先后次序如下:

null<数字<字符串<对象<数组<二进制数据<objectId<布尔值<日期<正则表达式。

在同一种类型内,排序与你所期望的很可能相同:2<4或者a<z,在理解分片的例子中每一个块都是几百GB大小,但在真实系统中,块大小默认仅有200MB,这是因为挪动数据的代价非常大,要花费很长的时间,占用系统资源,而且会明显增加网络流量,你可以自己试试看,先插入200MB数据到某一个集合中,然后试着取回所有200MB数据,接着想象一下在建多个索引的系统上做同样的事情,同时该系统上还有其他数据流量存在的情况,你肯定不会愿意看着应用程序逐渐降低性能直到停止,而MongoDB还在后台拖拖拉拉地挪动数据,实际上,如果一个块过大,MongoDB根本就不会移动它,反过来你也不会希望块过小,因为每个块都需要有一点点管理开销(以便你不必为跟踪不计其数的数据块而烦恼),综合考虑之下,我们发现200MB恰好是兼顾可移动性和最小开销的最佳选择。

总结:

块是一个逻辑概念,而非物理实现,一个块中的文档在物理上并不连续存储于磁盘上或者以任何形式聚集在一起,它们可能分散在整个集合的任何角落里,一个文档属于一个块当且仅当其片键值在对应的块区间内。

时间: 2024-10-13 00:09:59

第五部分 架构篇 第十七章 MongoDB Sharding 架构(理解块)的相关文章

第五部分 架构篇 第二十一章 MongoDB Sharding 架构(实践)

这是一种将海量的数据水平扩展的数据库集群系统,数据分别存储在sharding的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式MongoDB集群. MongoDB的数据分块成为chunk,每个chunk都是Collection中一段连续的数据记录,通常最大尺寸是200MB,超出则生成新的数据块. 要构建一个MongoDB Sharding Cluster需要以下三个角色: Shard Server 即存储实际数据的分片,每个Shard可以使一个mongod实例,也可以使一组mongo

第五部分 架构篇 第十八章 MongoDB Sharding 架构(平衡)

1.平衡简介 如果存在多个可用的分片,只要块得数量足够多,MongoDB就会把数据迁移到其他分片上,这个迁移过程叫做平衡(balancing),由叫做平衡器(balancer)的进程负责执行. 2.平衡工作流程 平衡器会把数据块从一个分片挪到另外一个分片上,其优点在于自动化,即你无需担心如何保持数据在分片间的均匀分布,这项工作已经由平衡器替你搞定,不过这也是它的缺点,因为自动意味着如果你不喜欢塔做负载均衡的方式,那只能算你不走运,如果不想让某个块存在于分片3上,你可以手动移动到分片2上,但是平衡

第五部分 架构篇 第十三章 MongoDB Replica Sets 架构(成员深入理解)

在学习复制的概念之前,首先接着前面一章节的还有点未完结的内容做个简单的介绍,主要是自动故障转移.异步复制.以及附加功能,这些在此只做简单的介绍,在以后的相关章节中会专门深入学习. 1.自动故障转移 当Primary服务和架构中其他成员中断通信超过10秒,Replica Set将尝试选举其他成员成为一个新的Primary服务,获得多票数的Scondary将成为Primary. 架构如下: 说明: 在一个Replica Set架构中,如果Primary不可达,则会在除Primary之外的其他成员中自

第五部分 架构篇 第十九章 MongoDB Sharding 架构( mongos)

1.mongos mongos是用户和集群间的交互点,其职责是隐藏分片内部的复杂性并向用户提供一个简洁的单服务器接口,这个抽象层中也存在一些缝隙,不过大多数情况下mongos允许你把一个集群当做一台服务器. 使用集群时,应该连接一个mongos并向它发送所有的读写操作,无论如何,你都不应该直接访问分片(但如果想的话能做到). mongos会将所有用户请求转发到恰当的分片上,如果用户插入一份文档,mongos会查看文档的片键,对照数据块,并把文档发送到持有相应块的分片上. 举个例子,比如说我们要插

第五部分 架构篇 第十六章 MongoDB Sharding 架构(理解分片)

1.简介 这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在sharding的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式的MongoDB集群. 那么首先我们应该理解何为分片(sharding)以及它的基本工作模式. 2.什么是分片 分片(sharding)是MongoDB用来将大型集合分割到不同服务器(或者说一个集群)上所采用的方法,尽管分片起源于关系型数据库分区,但它(像MongoDB大部分方面一样)完全是另外一回事. 和你可能使用过的任何分区方案相比,MongoD

第四部分 性能篇 第十一章 MongoDB 性能监控

声明:该文章主要来自<MongoDB实战>一书内容,主要想通过该书学习MongoDB的相应知识,加深理解,故写在自己的博文当中,作为记录在最后的章节中,会有一个自己集合MongoDB数据库应用的JavaEE的web应用. 1.MongoStat 此工具可以快速的查看某组运行中的MongoDB实例的统计信息,用法如下: [[email protected] bin]# ./mongostat connected to: 127.0.0.1 insert query update delete g

第二部分 应用篇 第七章 MongoDB MapReduce

1.简介 MongoDB的MapReduce相当于MySQL中的group by,所以在MongoDB上使用Map/Reduce进行统计很容易,使用MapReduce要实现两个函数Map函数和Reduce函数,Map函数调用emit(key,value),遍历collection中所有的记录,将key与value传递给Reduce函数进行处理,Map函数和Reduce函数可以使用JavaScript来实现,可以通过db.runCommand或者mapReduce命令来执行一个MapReduce的

第五部分 架构篇 第二十章 MongoDB Sharding 架构( 片键选择)

1.选择片键 选择一个好的片键非常关键,如果选择了一个糟糕的片键,它可以立马或者在访问量变大时毁了你的应用程序,也有可能潜伏着,等待着,没准什么时候突然毁了你的应用程序. 另外一方面,如果你选择了一个好片键,只要应用程序还在正常运行,而且只要发现访问量提高就赶紧添加服务器,MongoDB就会确保一直正确地运行下去. 正如在前面所学的,片键决定了数据在集群中的分布情况,因此你会希望存在这样一个片键,它既能把读写分散开来,又能把正在使用的数据保持在一起,这些看似互相矛盾的目标在现实中却往往是可以实现

《深入浅出Mysql》——第三篇 优化篇 第十七章 常用SQL技巧和常见问题 + 第十八章 SQL优化 + 第十九章 优化数据库对象

可以利用这个函数与ORDER BY子句一起完成随机抽取某些行的功能.它的原理其实 就是ORDER BY RAND()能够把数据随机排序. 加索引 CHECK TABLE 也可以检查视图是否有错误,比如在视图定义中被引用的表已不存在,举例如 下. 原文地址:https://www.cnblogs.com/JasonPeng1/p/12234426.html