水平分片实例分布图:

mongodb sharding 服务器架构

 

1. 添加mongdb两个shared实例

 # mkdir -p /home/m17 //home/m18 /home/m20 /home/mlog

 ./bin/mongod --dbpath /home/m17 --logpath /home/mlog/m17.log --fork --port  --smallfiles
./bin/mongod --dbpath /home/m18 --logpath /home/mlog/m18.log --fork --port --smallfiles

2.配置 configdb

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

3. 配置路由

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

4. 定制分片信息

   4.1 连接到 configDB  

 # ./bin/mongo --port
MongoDB shell version: 2.4.
connecting to: 127.0.0.1:/test

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

 mongos> sh.addShard('127.0.0.1:27018')
{ "shardAdded" : "shard0000", "ok" : }
mongos> sh.addShard('127.0.0.1:27017')
{ "shardAdded" : "shard0001", "ok" : }
mongos> sh.enableSharding('shop');
{ "ok" : } mongos> sh.status();
--- Sharding Status ---
sharding version: {
"_id" : ,
"version" : ,
"minCompatibleVersion" : ,
"currentVersion" : ,
"clusterId" : ObjectId("5746614b92e27268fdc306b4")
}
shards:
{ "_id" : "shard0000", "host" : "127.0.0.1:27018" }
{ "_id" : "shard0001", "host" : "127.0.0.1:27017" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "test", "partitioned" : false, "primary" : "shard0001" }
{ "_id" : "shop", "partitioned" : true, "primary" : "shard0000" }

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

 mongos> sh.shardCollection('shop.goods',{goods_id:});
{ "collectionsharded" : "shop.goods", "ok" : }
mongos> sh.status();
--- Sharding Status ---
sharding version: {
"_id" : ,
"version" : ,
"minCompatibleVersion" : ,
"currentVersion" : ,
"clusterId" : ObjectId("5746614b92e27268fdc306b4")
}
shards:
{ "_id" : "shard0000", "host" : "127.0.0.1:27018" }
{ "_id" : "shard0001", "host" : "127.0.0.1:27017" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "test", "partitioned" : false, "primary" : "shard0001" }
{ "_id" : "shop", "partitioned" : true, "primary" : "shard0000" }
shop.goods
shard key: { "goods_id" : }
chunks:
shard0000
{ "goods_id" : { "$minKey" : } } -->> { "goods_id" : { "$maxKey" : } } on : shard0000 Timestamp(, ) 修改分片大小
mongos> use config
switched to db config
mongos> db.settings.find();
{ "_id" : "chunksize", "value" : }
mongos> db.settings.save({_id:'chunksize',"value":});

注:
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表为例

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

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

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

 

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

 mongos> sh.status();
--- Sharding Status ---
sharding version: {
"_id" : ,
"version" : ,
"minCompatibleVersion" : ,
"currentVersion" : ,
"clusterId" : ObjectId("5746614b92e27268fdc306b4")
}
shards:
{ "_id" : "shard0000", "host" : "127.0.0.1:27018" }
{ "_id" : "shard0001", "host" : "127.0.0.1:27017" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "test", "partitioned" : false, "primary" : "shard0001" }
{ "_id" : "shop", "partitioned" : true, "primary" : "shard0000" }
shop.goods
shard key: { "goods_id" : }
chunks:
shard0000
{ "goods_id" : { "$minKey" : } } -->> { "goods_id" : { "$maxKey" : } } on : shard0000 Timestamp(, )
shop.user
shard key: { "userid" : }
chunks:
25 shard0001 20 -- 实例1 20个分片
26 shard0000 20 -- 实例2 20个分片

too many chunks to print, use verbose if you want to force print

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

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

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

 --节点1
> db.user.count(); --节点2
> db.user.count();

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

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

    1.分片介绍 分片(sharding)是将数据拆分,将其分散存到不同机器上的过程.MongoDB 支持自动分片,可以使数据库架构对应用程序不可见.对于应用程序来说,好像始终在使用一个单机的 Mongo ...

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

    最近对 MongoDB 产生兴趣,在网上找的大部分都是 2.X 版本,由于 2.X 与 3.X 差别还是很大的,所以自己参考官网,写了本系列.MongoDB 的知识还是很多的,本系列会持续更新,本文作 ...

  3. MongoDB 基础(2019年开篇)

    MongoDB基础知识: 1.什么是MongoDB NoSQL(NoSQL=Not Only SQL),意即"不仅仅是SQL". MongoDB是一个介于关系数据库和非关系数据库之 ...

  4. MongoDB基础学习

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

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

    windows下mongodb基础玩法系列 windows下mongodb基础玩法系列一介绍与安装 windows下mongodb基础玩法系列二CURD操作(创建.更新.读取和删除) windows下 ...

  6. MongoDB基础教程系列--目录结构

    最近对 MongoDB 产生兴趣,在网上找的大部分都是 2.X 版本,由于 2.X 与 3.X 差别还是很大的,所以自己参考官网,写了本系列.MongoDB 的知识还是很多的,本系列会持续更新,本文作 ...

  7. Mongodb 笔记01 MongoDB 简介、MongoDB基础知识、启动和停止MongoDB

    MongoDB 简介 1. 易于使用:没有固定的模式,根据需要添加和删除字段更加容易 2. 易于扩展:MongoDB的设计采用横向扩展.面向文档的数据模型使它能很容易的再多台服务器之间进行分割.自动处 ...

  8. MongoDB学习【二】—MongoDB基础和数据类型

    一.MongoDB基础知识 在MongoDB中相关术语的解释和sql术语对应关系 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table col ...

  9. 常见问题:MongoDB基础知识

    常见问题:MongoDB基础知识 ·MongoDB支持哪些平台? ·MongoDB作为托管服务提供吗? ·集合(collection)与表(table)有何不同? ·如何创建数据库(database) ...

随机推荐

  1. windows下使用waveout函数族播放wav文件

    要使用waveout函数组,族,首先要知道几个数据结构,首先是这个 typedef struct tWAVEFORMATEX { WORD wFormatTag; /* 格式的类型 */ WORD n ...

  2. MFC中PeekMessage的使用,非阻塞消息循环

    在程序设计的时候经常要进行一个数据循环,比如播放音乐需要循环的向缓冲区里面写入数据,在这个时候比较通用的方法是建立一个线程做事情,但是有时候不想创建多线程就可以使用微软提供的PeekMessage方法 ...

  3. LWIP_STM32_ENC28J60_NETCONN_UDP(3)

    前面移植了lwip之后只是简单地做了一个dhcp的程序,但是实际工作中经常要用来通讯,那今天就来讲一讲怎么用lwip来进行UDP通讯 要使用数据通信首先第一步得知道lwip是怎么样保存数据的,在使用n ...

  4. linux 驱动入门1

    世事艰难,人生不易. 夜深人静时候,回顾过去,往事历历在目.创南京,混苏州,下上海.都付出了巨大的努力.多少个不眠的夜晚,在冥思苦想.天生愚钝.又不是学计算机的.一直没较为深刻的理解 编程什么东西,一 ...

  5. 比较实用的webpack配置代码

    var path = require('path');var webpack = require('webpack');var ExtractTextPlugin = require('extract ...

  6. label中添加图片

    创建NSTextAttachment的对象,用来装在图片 将NSTextAttachment对象的image属性设置为想要使用的图片 设置NSTextAttachment对象bounds大小,也就是要 ...

  7. MySQL show slave status命令参数

    ? Slave_IO_State SHOW PROCESSLIST输出的State字段的拷贝.SHOW PROCESSLIST用于从属I/O线程.如果线程正在试图连接到主服务器,正在等待来自主服务器的 ...

  8. MQTT研究

    http://www.jianshu.com/collection/1c742515f8d8 http://blog.csdn.net/gaojq_ios/article/details/481597 ...

  9. BZOJ3270: 博物馆

    3270: 博物馆 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 269  Solved: 147[Submit][Status][Discuss] ...

  10. java class加载机制及对象生成机制

    java class加载机制及对象生成机制 当使用到某个类,但该类还未初始化,未加载到内存中时会经历类加载.链接.初始化三个步骤完成类的初始化.需要注意的是类的初始化和链接的顺序有可能是互换的. Cl ...