MongoDB之分片

本文介绍分片的思想和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"})
时间: 2024-11-10 12:56:39

MongoDB之分片的相关文章

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

本篇接着上面的四篇继续讲述在window平台下mongodb的分片集群搭建.在分片集群中也照样可以创建索引,创建索引的方式与在单独数据库中创建索引的方式一样.因此这不再多说.本篇主要聚焦在分片键的选取问题上. 分片键通俗来说就是分割海量数据的标记符. 如果更高效的划分海量数据往往依赖于分片键的选择. 分片键选得不好,应用程序就无法利用分片集群所提供的诸多优势.在这种情况下,查询和插入得系能都回显著下降. 一.低效的分片键 1.1 分布差 BSON对象ID是每个mongodb文档的默认主键.所有的

【MongoDB】在window系统下搭建MongoDB的分片系统(一)

这篇主要讲述分片集群的主要原理 坦白说,刚看到这个分片系统(Sharding)有点蒙,感觉有点太高大上了.看美国作家Kyle Banker<Mongodb in action>没有明白.又查询资料,首先对与分片的做个说明.从其他书本上看的,说分片这是一种将海量数据水平扩展的数据库集群系统,数据分表存储在sharding的各个节点上,使用者通过简单的配置就可以很方便地够将一个分布式MongoDB集群. 一.角色说明 要构建一个MongoDB分片集群,需要三个角色: shard server  即

MongoDB的分片集群配置

1.分片 概念:在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求. 当MongoDB存储海量的数据时,一台机器可能不足以存储数据也足以提供可接受的读写吞吐量.这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据. 1.分片简介 分片是指将数据拆分,将其分散存在不同机器上的过程.有时也叫分区.将数据分散在不同的机器上,不需要功能 强大的大型计算机就可以存储更多的数据,处理更大的负载. 使用几乎所有数据库软件都能进行手动分片,应用

MongoDB 自动分片 auto sharding

MongoDB部署实验系列文章 MongoDB做为NoSQL数据库,最近几年持续升温,越来越多的企业都开始尝试用MongoDB代替原有Database做一些事情.MongoDB也在集群,分片,复制上也有相当不错的的表现.我通过将做各种MongoDB的部署实验进行介绍. 原网址:http://blog.fens.me/mongodb-shard/ 第三篇 MongoDB 自动分片 auto sharding,分为6个部分 初始化文件目录 启动shard节点 配置shard节点 插入数据分片实验 删

MongoDB 搭建分片集群

在MongoDB(版本 3.2.9)中,分片是指将collection分散存储到不同的Server中,每个Server只存储collection的一部分,服务分片的所有服务器组成分片集群.分片集群(Sharded Clustered)的服务器分为三中类型:Router(mongos),Config Server 和 Shard(Replica Set 或 Standalone mongod).使用分片集群,不需要使用强大的计算机,就能存储更多的数据,处理更大的负载.分布式数据库系统的设计目的是:

MongoDB:分片(简介 &amp; 自动分片 &amp; 片键)

分片(增加服务器,水平扩展)是MongoDB的扩展方式,通过分片能过增加更多的机器来应对不断增加的负载和数据,还不影响应用. [简介] 分片(sharding)是指将数据拆分,将其分散存在不同的机器上的过程.在关系型数据库中,当一个表太大(超过几亿行数据)时,我们也有分表的做法,和这里的分片是类似的概念. 手动分片:当我们应用的瓶颈出现在数据库系统时,如果我们使用的是关系型数据库,我们通常要进行手动分片.即通过我们的应用层代码去维护与若干个数据库系统的连接,并且每个连接都是独立的.我们应用层代码

【MongoDB】在windows平台下搭建mongodb的分片集群(二)

在上一片博客中我们讲了Mongodb数据库中分片集群的主要原理.在本篇博客中我们主要讲描述分片集群的搭建过程.配置分片集群主要有两个步骤,第一启动所有需要的mongod和mongos进程.第二步就是启动一个mongos与集群通信.下面我们一步步来描述集群的搭建过程. 图1-1  MongoDB分片集群中的组件 图 1-2 由实例分片集群构成的进程全貌 备注:以上两者图片均引自于Kyle Banker著 丁雪丰译<MongoDB 实战> 2.1 创建分片目录 备注:此处于创建复制集类似,详细请查

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

在上两篇博客中我们分别阐述了分片集群的工作原理以及搭建过程.在本篇博客中我们主要一起分析分片集群的测试结果: 首先看分片集群的各个状态,可以看的出复制集A和B都是正常的: 一.开启分片集合 开启一个数据库上的分片,这是对任何集合进行分片的先决条件. 假设测试数据库为slidetest. 分片集合定义注意:它看起来和索引定义有几分相似之处,尤其是有那个unique键.在对一个空集合进行分片时候,mongodb会在每个分片上创建一个与分片对应的索引.可以直接连上分片,运行getIndexs()进行验

MongoDB 3 分片集群安装配置

操作系统:CentOS 6   x86_64 MongoDB版本:3.4.3 集群主机拓扑: 主机 mongo shardsvr & ReplSetName mongo configsvr & ReplSetName mongos test1.lan shard-a    shard-b test2.lan shard-a    shard-b test3.lan shard-a    shard-b test4.lan cfgshard test5.lan cfgshard test6.

MongoDB的分片(9)

什么是分片 分片是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载.基本思想就是将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一部分,最后通过一个均衡器来对各个分片进行均衡.通过一个名为mongos的路由进程操作,mongos通过配置服务器知道数据和片的对应关系.大部分使用场景都是解决磁盘空间的问题,对于写入有可能会变差,查询则尽量避免跨分片查询. 使用分片的时机: 1,机器的磁盘不够用了.使用分片解决