本文介绍分片的思想和MongoDB中的实现方法。

首先须要介绍一些主要的概念。


分片

分片。也叫做分区。是一种经常使用的数据库优化技术。其含义就是将数据拆分,将数据分散到不同机器上的过程。这样就能够使得系统能够存储很多其它的数据,处于更大的负载。

差点儿全部的数据库软件都能够进行手动分片,通过应用程序管理不同server上的不同数据,查询也须要寻找正确的server。这样尽管能够减轻负载,可是却难以维护,比方我们向集群加入节点或者删除节点。都须要相应的调整数据的分布。

MongoDB在这一点上做得不错,它支持自己主动分片,集群能够自己主动切分数据,达到负载均衡,从而使管理人员能够摆脱手动分片。


分片原理

以下说说分片的原理。MongoDB分片的基本思想就是将集合切分成小块,这些块分散到若干片里面。每一个片仅仅负责总数据的一部分。

应用程序不须要知道哪些片相应哪些数据,也不须要知道数据是否已经拆分

MongoDB通过另外一个独立的路由进程mongos来实现这个功能。

mongos路由进程知道全部数据的存放位置,所以应用能够连接它来正常发送请求。而对于应用来说。自己仅仅知道连接了一个普通的mongod。

也就是说,mongos相应用隐藏了分片的细节

为什么要隐藏了?事实上就是为了拓展的时候,不必改动应用程序的代码。

应用场景

说完了原理。那什么时候须要用到分片呢?有以下几种情况:

1. 机器的磁盘不够用了

2. 单个mongodb已经不再满足性能须要

3. 想将大量数据放入内存提高性能

一般来说,先从不分片開始。然后在须要的时候将其转换成分片。

片键

设置分片时,须要从集合里面选一个键,用该键的值作为数据拆分的根据。这个键成为片键

假设有个文档集合表示的是人员,假设选择名字”name”做为片键,第一篇可能会存放名字以A-F开头的文档;第二片存G-P开头的文档;第三篇存Q-Z的文档。

随着添加或删除片,MongoDB会又一次平衡数据,使得每片的流量比較均衡,数据量也在合理范围内。

那么我们应该怎样选择片键呢?

假设我们选择了时间属性的键作为片键。那么随着时间增长。全部的文档都会以最后一片插入。这就不适合写入操作负载非常高的情况,可是查询起来就比較方便。

假设我们选择了分布均匀的片键,就会提高写入操作的负载能力,可是就会影响查询的性能。

我们也能够选择复合片键,将两个属性键结合为一个片键。

事实上和索引的原理类似,事实上,片键也是最经常使用的索引。

说了半天的概率,也累了,以下看看实际操作吧。


建立分片

建立分片有两步:启动server,然后决定怎么切分数据。

分片一般由三个部分组成:

1.

片就是保存子集合数据的容器。片能够是单个mongodserver。也能够是副本集。

2. mongos

路由进程,它接收全部的请求。然后将结果聚合,它本身并不存储数据或者配置信息,可是会缓存配置server的信息。

3. 配置server

存储集群的配置信息:数据和片的相应关系。

配置server是帮mongos存放分片的配置信息的,mongos自己不存放数据。直接同步配置server中数据就可以。

以下介绍具体过程:

首先要启动配置server和mongos。

配置server须要先启动,由于mongos会用到其上的配置信息。


第一步,启动配置server

配置server的启动就像普通的mongod一样:

mongod – config d:\mongodb\mongo.config --port 20000


第二步,建立mongos进程

建立mongos进程。以供应用程序连接。这样的路由server连接数据文件夹都不须要,但一定要指明配置server的位置:

mongos --port 30000 --configdb 127.0.0.1:20000

分片管理一般是通过mongos完毕的,完毕后效果例如以下:


第三步,加入片

加入片。片就是普通的mongod:





连接刚才启动的mongos,为集群加入一个片。

启动shell,连接mongos:

确定连接的是mongos而不是mongod,通过addshard命令加入片:

>mongo 127.0.0.1:30000
mongos> use admin
switched to db admin
mongos> db.runCommand(
... {
... "addshard":"127.0.0.1:10000",
... "allowLocal":1
... }
... )
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> db.runCommand(
... {
... "addshard":"127.0.0.1:10001",
... "allowLocal":1
... }
... )
{ "shardAdded" : "shard0001", "ok" : 1 }





当在本机执行片的时候,得设定allowLocal键为true。MongoDB尽量避免由于错误的配置,将集群配置到本地,所以得让它知道这仅仅是开发,并且我们非常清楚自己在做什么。

假设是生产环境中,则要将其部署在不同的机器上。

想加入片的时候,就执行addshard,MongoDB会负责将片集成到集群


第四步,切分数据

MongoDB不会将存储的每一条数据都直接公布,得先在数据库和集合的级别将分片功能打开。

假设是连接配置server,

E:\mongo\bin>mongo 127.0.0.1:20000
MongoDB shell version: 2.0.6
connecting to: 127.0.0.1:20000/test
> use admin
switched to db admin
> db.runCommand({"enablesharding":"test"})
{
"errmsg" : "no such cmd: enablesharding",
"bad cmd" : {
"enablesharding" : "test"
},
"ok" : 0
}

应该是连接路由server,

db.runCommand({"enablesharding":"test"})//将test数据库启用分片功能.

对数据库分片后,其内部的集合便会存储到不同的片上,同一时候也是对这些集合分片的前置条件。

在数据库级别启用了分片以后,就能够使用shardcollection命令堆积和进行分片:

db.runCommand({"shardcollection":"test.refactor","key":{"name":1}})//对test数据库的lf集合进行分片,片键是name

假设如今对lf集合加入数据,就会根据”name”的值自己主动分散到各个片上。

这样分片就建立完毕啦!


管理分片

分片建立完毕后,怎样管理分片呢?

分片信息主要存放在config数据库上,这样就能被不论什么连接到mongos的进程訪问到了。

在shell中连接了mongos,并使用了use config数据库。

查看分片

通过db.shards.find()方法:

查看状态

db.printShardingStatus()

删除分片

db.runCommand({"removeshard":"127.0.0.1:10001"})

MongoDB之分片的更多相关文章

  1. mongodb(分片)

    分片(即sharding)是将数据拆分至不同数据节点的方式. 1.在mongoDB中提供了自动分片的方式,它会根据数据块(chunk)大小的设定,对片键进行拆分: 2.mongoDB配置分片,要配置三 ...

  2. 【MongoDB】在windows平台下mongodb的分片集群(五)

    本篇接着上面的四篇继续讲述在window平台下mongodb的分片集群搭建. 在分片集群中也照样能够创建索引,创建索引的方式与在单独数据库中创建索引的方式一样.因此这不再多说.本篇主要聚焦在分片键的选 ...

  3. MongoDB之分片集群(Sharding)

    MongoDB之分片集群(Sharding) 一.基本概念 分片(sharding)是一个通过多台机器分配数据的方法.MongoDB使用分片支持大数据集和高吞吐量的操作.大数据集和高吞吐量的数据库系统 ...

  4. mongodb的分片(2)

    在上一片博客,详细说明了mongodb的分片搭建的详细过程:分片搭建 在这里会说一些分片的维护与操作! 在集群搭建完,我们使用了sh.status()查看分片之后的数据,如下: #连接的是mongos ...

  5. mongodb的分片

    分片是把大型数据集合进行分区成更小的可管理的片的过程. 副本集的每一个成员(仲裁节点除外)都一份数据的完整拷贝! 分片的目的:在节省硬件成本的基础上,提高系统的整体性能.但是却增加了管理和性能的开销. ...

  6. MongoDB 自动分片 auto sharding

    MongoDB部署实验系列文章 MongoDB做为NoSQL数据库,最近几年持续升温,越来越多的企业都开始尝试用MongoDB代替原有Database做一些事情.MongoDB也在集群,分片,复制上也 ...

  7. OpenStack Ceilometer -- 后台数据存储优化之MongoDB的分片存储设置

    https://xiaofandh12.github.io/Mongo-Shard 关于MongoDB MongoDB中的概念与关系型数据库之间的对应: Database --> Databas ...

  8. 转】MongoDB 自动分片 auto sharding

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/4/ 感谢! MongoDB 自动分片 auto shard ...

  9. MongoDB的分片(9)

    什么是分片 分片是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载.基本思想就是将集合切成小块,这些块分散到若干片里, ...

  10. MongoDB 搭建分片集群

    在MongoDB(版本 3.2.9)中,分片是指将collection分散存储到不同的Server中,每个Server只存储collection的一部分,服务分片的所有服务器组成分片集群.分片集群(S ...

随机推荐

  1. Megcup 2017 决赛第一题 规则

    2017Megcup 2017Megcup决赛第三题题解 只做出了一道题,虽然慢慢地退出了前128名,但还是要记录一下. 10点钟开始,一看第一题很熟悉,因为研究过格点图中电流问题,其实就是求解线性方 ...

  2. 【LeetCode】31. Next Permutation (2 solutions)

    Next Permutation Implement next permutation, which rearranges numbers into the lexicographically nex ...

  3. PC端轻松控制Android手机,PC Control Andoroid,PC控制安卓手机

    记录此次经历的目的是帮助需要的人或下次使用时少走弯路,我为此试用了不少工具及方法,因为追求免费,像"Weak Control:在PC上控制你的Android手机"还要收费的我就不弄 ...

  4. Android 方向传感器

    一般情况下,在Android系统中获取手机的方位信息在api中有TYPE_ORIENTATION常量,可以像得到加速度传感器那样得到方向传感器sm.getDefaultSensor(Sensor.TY ...

  5. go 学习笔记(2) --变量、常量、iota、数组

    参考网址:https://gobyexample.com 变量 Go中使用全新的关键字var来声明变量.var我们并不陌生,在Javascript 和C#中均有出现.不同的是Go和C#中变量属于强类型 ...

  6. 实时信号与sigqueue函数

    一.sigqueue函数 功能:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用. 原型:int sigqueue(pid_t pid, int s ...

  7. Linux页面回收概述

    本文主要介绍了一些page reclaim机制中的基本概念.这份文档其实也可以看成阅读ULK第17章第一小节的一个读书笔记.虽然ULK已经读了很多遍,不过每一遍还是觉得有收获.Linux内核虽然不断在 ...

  8. C#二叉树简易实例

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  9. 完美解决 IOS系统safari5.0 浏览器页面布局iframe滚动栏失效问题

    在iframe外层包一层div,加入例如以下样式: style="-webkit-overflow-scrolling:touch;overflow:auto;" 代码例如以下: ...

  10. linux 打包为zip压缩包

    [root@nb linux学习]# zip -r dir.zip dir文件夹/ file文件 adding: dir文件夹/ (stored %) adding: file文件 (deflated ...