MongoDB基础之十 shared分片

水平分片实例分布图:

mongodb sharding 服务器架构

 

1. 添加mongdb两个shared实例

1 # mkdir -p /home/m17 //home/m18 /home/m20 /home/mlog
2
3 ./bin/mongod --dbpath /home/m17 --logpath /home/mlog/m17.log --fork --port 27017 --smallfiles
4 ./bin/mongod --dbpath /home/m18 --logpath /home/mlog/m18.log --fork --port 27018 --smallfiles

2.配置 configdb

# ./bin/mongod --dbpath /home/m20 --logpath /home/mlog/m20.log --fork --port 27020 --configsvr 

3. 配置路由

1 # ./bin/mongos --logpath /home/mlog/m30.log --port 30000 --configdb 127.0.0.1:27020 --fork

4. 定制分片信息

   4.1 连接到 configDB  

1 # ./bin/mongo --port 30000
2 MongoDB shell version: 2.4.9
3 connecting to: 127.0.0.1:30000/test

4.2  添加分片实例以及需要分片的表

 1 mongos> sh.addShard(‘127.0.0.1:27018‘)
 2 { "shardAdded" : "shard0000", "ok" : 1 }
 3 mongos> sh.addShard(‘127.0.0.1:27017‘)
 4 { "shardAdded" : "shard0001", "ok" : 1 }
 5 mongos> sh.enableSharding(‘shop‘);
 6 { "ok" : 1 }
 7
 8 mongos> sh.status();
 9 --- Sharding Status ---
10   sharding version: {
11         "_id" : 1,
12         "version" : 3,
13         "minCompatibleVersion" : 3,
14         "currentVersion" : 4,
15         "clusterId" : ObjectId("5746614b92e27268fdc306b4")
16 }
17   shards:
18         {  "_id" : "shard0000",  "host" : "127.0.0.1:27018" }
19         {  "_id" : "shard0001",  "host" : "127.0.0.1:27017" }
20   databases:
21         {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
22         {  "_id" : "test",  "partitioned" : false,  "primary" : "shard0001" }
23         {  "_id" : "shop",  "partitioned" : true,  "primary" : "shard0000" }   

4.3 配置表分片(分片键为 goods_id)

 1 mongos> sh.shardCollection(‘shop.goods‘,{goods_id:1});
 2 { "collectionsharded" : "shop.goods", "ok" : 1 }
 3 mongos> sh.status();
 4 --- Sharding Status ---
 5   sharding version: {
 6         "_id" : 1,
 7         "version" : 3,
 8         "minCompatibleVersion" : 3,
 9         "currentVersion" : 4,
10         "clusterId" : ObjectId("5746614b92e27268fdc306b4")
11 }
12   shards:
13         {  "_id" : "shard0000",  "host" : "127.0.0.1:27018" }
14         {  "_id" : "shard0001",  "host" : "127.0.0.1:27017" }
15   databases:
16         {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
17         {  "_id" : "test",  "partitioned" : false,  "primary" : "shard0001" }
18         {  "_id" : "shop",  "partitioned" : true,  "primary" : "shard0000" }
19                 shop.goods
20                         shard key: { "goods_id" : 1 }
21                         chunks:
22                                 shard0000       1
23                         { "goods_id" : { "$minKey" : 1 } } -->> { "goods_id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 0)
24
25 修改分片大小
26 mongos> use config
27 switched to db config
28 mongos> db.settings.find();
29 { "_id" : "chunksize", "value" : 64 }
30 mongos> db.settings.save({_id:‘chunksize‘,"value":1}); 

注:
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,不再来回移动?

答: 能, 手动预先分片!

5.预先分片

  5.1 以user表为例

1 mongos>sh.shardCollection(‘shop.user‘,{userid:1}); 

  5.2 预先在1K 2K...40K这样的界限切好chunk(虽然chunk是空的), 这些chunk将会均匀移动到各片上

1 mongos> for(var i=1;i<=40;i++) { sh.splitAt(‘shop.user‘,{userid:i*1000}) } .

 

  5.3 查看状态 发现分片已经均匀的分布在两台实例上了

 1 mongos> sh.status();
 2 --- Sharding Status ---
 3 sharding version: {
 4 "_id" : 1,
 5 "version" : 3,
 6 "minCompatibleVersion" : 3,
 7 "currentVersion" : 4,
 8 "clusterId" : ObjectId("5746614b92e27268fdc306b4")
 9 }
10 shards:
11 { "_id" : "shard0000", "host" : "127.0.0.1:27018" }
12 { "_id" : "shard0001", "host" : "127.0.0.1:27017" }
13 databases:
14 { "_id" : "admin", "partitioned" : false, "primary" : "config" }
15 { "_id" : "test", "partitioned" : false, "primary" : "shard0001" }
16 { "_id" : "shop", "partitioned" : true, "primary" : "shard0000" }
17 shop.goods
18 shard key: { "goods_id" : 1 }
19 chunks:
20 shard0000 1
21 { "goods_id" : { "$minKey" : 1 } } -->> { "goods_id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 0)
22 shop.user
23 shard key: { "userid" : 1 }
24 chunks:
25 shard0001 20              --  实例1 20个分片
26 shard0000 20              --  实例2 20个分片
27 too many chunks to print, use verbose if you want to force print

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

1 for(var i=1;i<=40000;i++) {db.user.insert({userid:i,username:‘hello world ‘+i});}; 

5.5 查看数据分片以及数据分布情况

1 --节点1
2 > db.user.count();
3 19999
4
5 --节点2
6 > db.user.count();
7 20001
时间: 2024-08-08 18:07:38

MongoDB基础之十 shared分片的相关文章

MongoDB 基础(九)分片

分片(sharding)是通过多台服务器存储数据的方法.Mongodb使用分片可支持部署非常大的数据集和高的吞吐量操作.单台服务器的能力在各方面都有限,如CPU.IO.RAM.存储空间等.解决扩展的问题,数据库提供了两种方法:垂直扩展和分片. 垂直扩展:增加CPU.RAM,存储资源等,这也受限于硬件设备.而有些基于云的供应商也规定用户使用小的系统. 分片(水平扩展):划分数据集,将数据分布到多台服务器中,每个碎片(chard)是一个独立的数据库,这些碎片共同组成了一个逻辑的数据库.(这类似于Wi

MongoDB基础教程系列--第九篇 MongoDB 分片

1.分片介绍 分片(sharding)是将数据拆分,将其分散存到不同机器上的过程.MongoDB 支持自动分片,可以使数据库架构对应用程序不可见.对于应用程序来说,好像始终在使用一个单机的 MongoDB 服务器一样,另一方面,MongoDB 自动处理数据在分片上的分布,也更容易添加和删除分片. 请记住:复制是让多台服务器拥有同样的数据副本,每一台服务器都是其他服务器的镜像,而每一个分片都与其他分片拥有不同的数据子集. 通常,分片可以用来: 增加可用的内存 增加可用的磁盘空间 减轻单台服务器的负

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

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

windows下mongodb基础玩法系列二CURD附加一

windows下mongodb基础玩法系列 windows下mongodb基础玩法系列一介绍与安装 windows下mongodb基础玩法系列二CURD操作(创建.更新.读取和删除) windows下mongodb基础玩法系列二CURD附加一 说在前面的话 在系列二中CURD只是简单的走了一下代码操作的流程,其中全是简单基础操作的内容, 在我仔细看完接下来的内容后决定再丰富一下前面的操作,并实战一个简单的demo出来,demo具体搭配语言暂时决定在PHP与nodejs之间. 增加内容至文档没说完

MongoDB基础教程系列--未完待续

最近对 MongoDB 产生兴趣,在网上找的大部分都是 2.X 版本,由于 2.X 与 3.X 差别还是很大的,所以自己参考官网,写了本系列.MongoDB 的知识还是很多的,本系列会持续更新,本文作为目录篇,方便阅读,有问题大家一块交流哈.多谢大家关注,转载请注明出处,谢谢! MongoDB基础教程系列--第一篇 进入MongoDB世界 MongoDB基础教程系列--第二篇 MongoDB基本操作(一) MongoDB基础教程系列--第三篇 MongoDB基本操作(二) MongoDB基础教程

MongoDB基础学习

一 简介 MongoDB是一款强大.灵活.且易于扩展的通用型数据库1.易用性 MongoDB是一个面向文档(document-oriented)的数据库,而不是关系型数据库. 不采用关系型主要是为了获得更好得扩展性.当然还有一些其他好处,与关系数据库相比,面向文档的数据库不再有"行"(row)的概念取而代之的是更为灵活的"文档"(document)模型. 通过在文档中嵌入文档和数组,面向文档的方法能够仅使用一条记录来表现复杂的层级关系,这与现代的面向对象语言的开发者

MongoDB基础安装、操作

内容要点: MongoDB介绍 linux系统安装MongoDB MongoDB基础操作 一.MongoDB : (1)MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. (2)MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型.Mongo最大的特点是它支持的查询语言非常强大,其语法有点

windows下mongodb基础玩法系列二CURD操作(创建、更新、读取和删除)

windows下mongodb基础玩法系列 windows下mongodb基础玩法系列一介绍与安装 windows下mongodb基础玩法系列二CURD操作(创建.更新.读取和删除) 简单说几句 在mongodb中3元素:db(数据库).collection(集合).document(文档) 其中collection类似于数据库中的表,document类似于行,这样一来我们就将内容对比起来记忆学习了. 数据格式 MongoDB documents是BSON格式(一种类json的一种二进制形式的存

Java Script基础(十) 访问样式表

Java Script基础(十) 访问样式表 动态控制样式表 在JavaScript中,有两种方式可以动态的改变样式属性,一种是使用style属性,另一种是使用样式的className属性.另外控制元素隐藏和显示使用display属性. 1.使用sytle属性 语法: 元素.style.样式属性="值"; 在JavaScript中使用CSS样式与在html中使用CSS少有不同,由于JavaScript中的-表示减号,因此如果样式属性名称中带有"-"则要省去,后面首字