MongoDB的分片(9)

什么是分片

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

使用分片的时机:

1,机器的磁盘不够用了。使用分片解决磁盘空间的问题。

2,单个mongod已经不能满足写数据的性能要求。通过分片让写压力分散到各个分片上面,使用分片服务器自身的资源。

3,想把大量数据放到内存里提高性能。和上面一样,通过分片使用分片服务器自身的资源。

在搭建分片之前,先了解下分片中各个角色的作用。

配置服务器。是一个独立的mongod进程,保存集群和分片的元数据,即各分片包含了哪些数据的信息。最先开始建立,启用日志功能。像启动普通的mongod一样启动配置服务器,指定configsvr选项。不需要太多的空间和资源,配置服务器的1KB空间相当于真实数据的200MB。保存的只是数据的分布表。当服务不可用,则变成只读,无法分块、迁移数据。

路由服务器。即mongos,起到一个路由的功能,供程序连接。本身不保存数据,在启动时从配置服务器加载集群信息,开启mongos进程需要知道配置服务器的地址,指定configdb选项。

分片服务器。是一个独立普通的mongod进程,保存数据信息。可以是一个副本集也可以是单独的一台服务器。

1.新建文件夹

data/config20  配置服务器configsvr 27020端口

data/shard17   分片服务器 27017端口

data/shard18   分片服务器 27018端口

2.启动配置服务器

mongod --dbpath C:\Users\yuxl\Desktop\mongodb\data\config20 --port 27020

3. 建立mongos进程,以供应用程序连接

mongos --port 30000 --configdb 127.0.0.1:27020

4.启动分片服务器

mongod --dbpath C:\Users\yuxl\Desktop\mongodb\data\shard17 --port 27017

mongod --dbpath C:\Users\yuxl\Desktop\mongodb\data\shard18 --port 27018

5.添加分片

连接mongos进程mongo 127.0.0.1:30000/admin

添加分片

sh.addShard("127.0.0.1:27017")

sh.addShard("127.0.0.1:27018")

查看状态sh.status(),我们发现两个分片

shards:

{  "_id" : "shard0000",  "host" : "127.0.0.1:27017" }

{  "_id" : "shard0001",  "host" : "127.0.0.1:27018" }

6.添加待分片的库

sh.enableSharding(databaseName);

sh.enableSharding(“shop”);

7: 添加待分片的表

sh.shardCollection(‘dbName.collectionName’,{field:1});

field是collection的一个字段,系统将会利用filed的值,来计算应该分到哪一个片上.

这个filed叫”片键”, shard key

sh.shardCollection(“shop.goods”,{goodsid:1});

接下来插入数据进行测试,为了便于查看效果,使用一下操作

use config

db.settings.update({"_id":"chunksize"},{$set:{"value":1}})

use shop

for(var i=1;i<=10000;i++)

{

db.goods.insert({“goodsid”:i,”goodsname”:”abddsdfsdfsdfsdfsddddddddddddd”})

}

然后我们分别连接两个分片服务器上发现都有数据,但是不是很均匀

原因:

mongodb不是从单篇文档的级别,绝对平均的散落在各个片上, 而是N篇文档,形成一个块"chunk",优先放在某个片上, 当这片上的chunk,比另一个片的chunk,区别比较大时, (>=3) ,会把本片上的chunk,移到另一个片上, 以chunk为单位,维护片之间的数据均衡

问: 为什么插入了10万条数据,才2个chunk?

答: 说明chunk比较大(默认是64M)

在config数据库中,修改chunksize的值.

问: 既然优先往某个片上插入,当chunk失衡时,再移动chunk,

自然,随着数据的增多,shard的实例之间,有chunk来回移动的现象,这将带来什么问题?

答: 服务器之间IO的增加,

问: 能否我定义一个规则, 某N条数据形成1个块,预告分配M个chunk,

M个chunk预告分配在不同片上.

以后的数据直接入各自预分配好的chunk,不再来回移动?

答: 能, 手动预先分片! 注意: 预先分片的collection得是空的

以shop.user表为例

1: sh.shardCollection(‘shop.user’,{userid:1}); //user表用userid做shard key

2: for(var i=1;i<=40;i++) { sh.splitAt(‘shop.user‘,{userid:i*1000}) } // 预先在1K 2K...40K这样的界限切好chunk(虽然chunk是空的), 这些chunk将会均匀移动到各片上.

3: 通过mongos添加user数据. 数据会添加到预先分配好的chunk上, chunk就不会来回移动了.

在生成环境中我们使用replcation set与shard分片结合使用

1:在3台独立服务器上,分别运行 27017,27018,27019实例, 互为副本集,形成3套repl set

2: 在3台服务器上,各配置config server, 运行27020端口上

3: 配置mongos

./bin/mongos --port 30000 \

--dbconfig 192.168.1.201:27020,192.168.1.202:27020,192.168.1.203:27020

4:连接路由器

./bin/mongo --port 30000

5: 添加repl set为片

>sh.addShard(‘192.168.1.201:27017’);

>sh.addShard(‘192.168.1.202:27017’);

>sh.addShard(‘192.168.1.203:27017’);

6: 添加待分片的库

>sh.enableSharding(databaseName);

7: 添加待分片的表

>sh.shardCollection(‘dbName.collectionName’,{field:1});

时间: 2024-09-28 19:00:05

MongoDB的分片(9)的相关文章

【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.