拓扑图如下:

从图中可以看到有四个组件:mongos、config server、shard、replica set。

mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。

config server,顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,这个可不能丢失!就算挂掉其中一台,只要还有存货, mongodb集群就不会挂掉。

shard,这就是传说中的分片了。上面提到一个机器就算能力再大也有天花板,就像军队打仗一样,一个人再厉害喝血瓶也拼不过对方的一个师。俗话说三个臭皮匠顶个诸葛亮,这个时候团队的力量就凸显出来了。在互联网也是这样,一台普通的机器做不了的多台机器来做。

环境配置如下:
主机 IP 服务及端口
Server A 192.168.10.88
mongod shard1:27017
mongod shard2:27018
mongod shard3:27019
mongod config1:20000
mongs1:30000

Server B 192.168.10.89
mongod shard1:27017
mongod shard2:27018
mongod shard3:27019
mongod config2:20000
mongs2:30000

Server C 192.168.10.90
mongod shard1:27017
mongod shard2:27018
mongod shard3:27019
mongod config3:20000
mongs3:30000
1. 创建数据目录
在Server A 上:
mkdir -p /data0/mongodbdata/shard1
mkdir -p /data0/mongodbdata/shard2
mkdir -p /data0/mongodbdata/shard3
mkdir -p /data0/mongodbdata/config
在Server B 上:
mkdir -p /data0/mongodbdata/shard1
mkdir -p /data0/mongodbdata/shard2
mkdir -p /data0/mongodbdata/shard3
mkdir -p /data0/mongodbdata/config
在Server C 上:
mkdir -p /data0/mongodbdata/shard1
mkdir -p /data0/mongodbdata/shard2
mkdir -p /data0/mongodbdata/shard3
mkdir -p /data0/mongodbdata/config
2. 配置Replica Sets
2.1 配置shard1所用到的Replica Sets
在Server A 上:
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data0/mongodbdata/shard1 --logpath /data0/mongodbdata/shard1/shard1.log --logappend --fork
在Server B 上:
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data0/mongodbdata/shard1 --logpath /data0/mongodbdata/shard1/shard1.log --logappend --fork
[root@localhost bin]#
在Server C 上:
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data0/mongodbdata/shard1 --logpath /data0/mongodbdata/shard1/shard1.log --logappend --fork
[root@localhost bin]#
用mongo 连接其中一台机器的27017 端口的mongod,初始化Replica Sets“shard1”,执行:
./mongo --port 27017
MongoDB shell version: 2.6.6
connecting to: 127.0.0.1:27017/test
> config = {_id: 'shard1', members: [
{_id: 0, host: '192.168.10.88:27017'},
{_id: 1, host: '192.168.10.89:27017'},
{_id: 2, host: '192.168.10.90:27017'}]
}

> rs.initiate(config)
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
2.2 配置shard2所用到的Replica Sets
在Server A 上:
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data0/mongodbdata/shard2 --logpath /data0/mongodbdata/shard2/shard2.log --logappend --fork
[root@localhost bin]#
在Server B 上:
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data0/mongodbdata/shard2 --logpath /data0/mongodbdata/shard2/shard2.log --logappend --fork
[root@localhost bin]#
在Server C 上:
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data0/mongodbdata/shard2 --logpath /data0/mongodbdata/shard2/shard2.log --logappend --fork
[root@localhost bin]#
用mongo 连接其中一台机器的27018 端口的mongod,初始化Replica Sets “shard2”,执行:
./mongo --port 27018
MongoDB shell version: 2.6.6
connecting to: 127.0.0.1:27018/test
> config = {_id: 'shard2', members: [
{_id: 0, host: '192.168.10.88:27018'},
{_id: 1, host: '192.168.10.89:27018'},
{_id: 2, host: '192.168.10.90:27018'}]
}
> rs.initiate(config)
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
2.3 配置shard3所用到的Replica Sets
在Server A 上:
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard3 --port 27019 --dbpath /data0/mongodbdata/shard3 --logpath /data0/mongodbdata/shard3/shard3.log --logappend --fork
[root@localhost bin]#
在Server B 上:
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard3 --port 27019 --dbpath /data0/mongodbdata/shard3 --logpath /data0/mongodbdata/shard3/shard3.log --logappend --fork
[root@localhost bin]#
在Server C 上:
/usr/local/mongodb/bin/mongod --shardsvr --replSet shard3 --port 27019 --dbpath /data0/mongodbdata/shard3 --logpath /data0/mongodbdata/shard3/shard3.log --logappend --fork
[root@localhost bin]#
用mongo 连接其中一台机器的27019 端口的mongod,初始化Replica Sets “shard3”,执行:
./mongo --port 27019
MongoDB shell version: 2.6.6
connecting to: 127.0.0.1:27019/test
> config = {_id: 'shard3', members: [
{_id: 0, host: '192.168.10.88:27019'},
{_id: 1, host: '192.168.10.89:27019'},
{_id: 2, host: '192.168.10.90:27019'}]
}
> rs.initiate(config)
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}

3. 配置3 台Config Server
在Server A、B、C上执行:
/usr/local/mongodb/bin/mongod --configsvr --dbpath /data0/mongodbdata/config --port 20000 --logpath /data0/mongodbdata/config/config.log --logappend --fork
4. 配置3 台Route Process
在Server A、B、C上执行:
/usr/local/mongodb/bin/mongos --configdb 192.168.10.88:20000,192.168.10.89:20000,192.168.10.90:20000 --port 30000 --chunkSize 1 --logpath /data0/mongodbdata/mongos.log --logappend --fork
5. 配置Shard Cluster
连接到其中一台机器的端口30000 的mongos 进程,并切换到admin 数据库做以下配置
./mongo --port 30000
MongoDB shell version: 2.6.6
connecting to: 127.0.0.1:30000/test
> use admin
switched to db admin
>db.runCommand({addshard:"shard1/192.168.10.88:27017,192.168.10.89:27017,192.168.10.90:27017"});
{ "shardAdded" : "shard1", "ok" : 1 }
>db.runCommand({addshard:"shard2/192.168.10.88:27018,192.168.10.89:27018,192.168.10.90:27018"});
{ "shardAdded" : "shard2", "ok" : 1 }
>db.runCommand({addshard:"shard3/192.168.10.88:27019,192.168.10.89:27019,192.168.10.90:27019"});
{ "shardAdded" : "shard3", "ok" : 1 }
激活数据库及集合的分片
db.runCommand({ enablesharding:"test" })
db.runCommand({ shardcollection: "test.users", key: { _id:1 }})   --->id为片键

use test
for(var i=1;i<=200000;i++) db.users.insert({id:i,addr_1:"Beijing",addr_2:"Shanghai"});

db.users.stats()
{
        "sharded" : true,
        "systemFlags" : 1,
        "userFlags" : 1,
        "ns" : "test.users",
        "count" : ,
        "numExtents" : 18,
        "size" : 22400000,
        "storageSize" : 33546240,
        "totalIndexSize" : 6532624,
        "indexSizes" : {
                "_id_" : 6532624
        },
        "avgObjSize" : 112,
        "nindexes" : 1,
        "nchunks" : 24,
        "shards" : {
                "shard1" : {
                        "ns" : "test.users",
                        "count" : ,
                        "size" : 6823936,
                        "avgObjSize" : 112,
                        "storageSize" : 11182080,
                        "numExtents" : 6,
                        "nindexes" : 1,
                        "lastExtentSize" : 8388608,
                        "paddingFactor" : 1,
                        "systemFlags" : 1,
                        "userFlags" : 1,
                        "totalIndexSize" : 1986768,
                        "indexSizes" : {
                                "_id_" : 1986768
                        },
                        "ok" : 1
                },
                "shard2" : {
                        "ns" : "test.users",
                        "count" : ,
                        "size" : 8258656,
                        "avgObjSize" : 112,
                        "storageSize" : 11182080,
                        "numExtents" : 6,
                        "nindexes" : 1,
                        "lastExtentSize" : 8388608,
                        "paddingFactor" : 1,
                        "systemFlags" : 1,
                        "userFlags" : 1,
                        "totalIndexSize" : 2411920,
                        "indexSizes" : {
                                "_id_" : 2411920
                        },
                        "ok" : 1
                },
                "shard3" : {
                        "ns" : "test.users",
                        "count" : ,
                        "size" : 7317408,
                        "avgObjSize" : 112,
                        "storageSize" : 11182080,
                        "numExtents" : 6,
                        "nindexes" : 1,
                        "lastExtentSize" : 8388608,
                        "paddingFactor" : 1,
                        "systemFlags" : 1,
                        "userFlags" : 1,
                        "totalIndexSize" : 2133936,
                        "indexSizes" : {
                                "_id_" : 2133936
                        },
                        "ok" : 1
                }
        },
        "ok" : 1
}
可以看到Sharding搭建成功了,不过分的好像不是很均匀,所以这个分片还是很有讲究的,后续再深入讨论。

mongodb分片集搭建的更多相关文章

  1. 搭建MongoDB分片集群

    在部门服务器搭建MongoDB分片集群,记录整个操作过程,朋友们也可以参考. 计划如下: 用5台机器搭建,IP分别为:192.168.58.5.192.168.58.6.192.168.58.8.19 ...

  2. Windows 搭建MongoDB分片集群(二)

    在本篇博客中我们主要讲描述分片集群的搭建过程.配置分片集群主要有两个步骤,第一启动所有需要的mongod和mongos进程.第二步就是启动一个mongos与集群通信.下面我们一步步来描述集群的搭建过程 ...

  3. Windows 搭建MongoDB分片集群(一)

    一.角色说明 要构建一个MongoDB分片集群,需要三个角色: shard server  即存储实际数据得分片,每个shard 可以是一个Mongod实例,也可以是一组mongod实例构成得Repl ...

  4. MongoDB分片集群原理、搭建及测试详解

    随着技术的发展,目前数据库系统对于海量数据的存储和高效访问海量数据要求越来越高,MongoDB分片机制就是为了解决海量数据的存储和高效海量数据访问而生. MongoDB分片集群由mongos路由进程( ...

  5. Mongodb分片集群技术+用户验证

    随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的.而mongodb主打的就是海量数据架构,“分片”就用这个来解决这个问题. 从图中可以看到有四个组件:mongos.config server. ...

  6. 网易云MongoDB分片集群(Sharding)服务已上线

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. MongoDB sharding cluster(分片集群)是MongoDB提供的数据在线水平扩展方案,包括 ...

  7. MongoDB 分片集群实战

    背景 在如今的互联网环境下,海量数据已随处可见并且还在不断增长,对于如何存储处理海量数据,比较常见的方法有两种: 垂直扩展:通过增加单台服务器的配置,例如使用更强悍的 CPU.更大的内存.更大容量的磁 ...

  8. 分布式文档存储数据库之MongoDB分片集群

    前文我们聊到了mongodb的副本集以及配置副本集,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13953598.html:今天我们来聊下mongodb的分片 ...

  9. MongoDB副本集搭建及备份恢复

    一.MongoDB副本集(repl set)介绍 早起版本使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主: 目前已经淘汰了ma ...

随机推荐

  1. Manacher HDOJ 5371 Hotaru's problem

    题目传送门 /* 题意:求形如(2 3 4) (4 3 2) (2 3 4)的最长长度,即两个重叠一半的回文串 Manacher:比赛看到这题还以为套个模板就行了,因为BC上有道类似的题,自己又学过M ...

  2. Generating RSA keys in PKCS#1 format in Java--转

    原文地址:https://stackoverflow.com/questions/7611383/generating-rsa-keys-in-pkcs1-format-in-java When I ...

  3. maxItemsInObjectGraph解释

    maxItemsInObjectGraph:一个整数,指定要序列化或反序列化的最大项数,可以限制对象图中要序列化的项数.默认的就是65535,当客户端与WebService之间传递的是对象要序列化的个 ...

  4. CSS垂直居中和水平居中的几种方法

    垂直居中 方法一 这个方法把div 的显示方式设置为表格,因此我们可以使用表格的 vertical-align属性. <!DOCTYPE html> <html lang=" ...

  5. WebView浅谈

    课程Demo public class MainActivity extends Activity { private String url = "http://baidu.com/&quo ...

  6. 继续C#开发or转做产品

    本人今年大四,C#开发,在一家公司实习了一年后,面临一个选择,是继续C#开发还是转做产品?我C#开发能力目前还一般,但很有兴趣.也喜欢设计与创意,做过产品专员.求大婶们指导!

  7. CPU位数、操作系统位数、机器字长、C/C++基本数据类型长度

    1.CPU位数=CPU中寄存器的位数=CPU能够一次并行处理的数据宽度(位数)=数据总线宽度: //现在的计算机处理器一般都是64位,这是硬件的事. 2.CPU为了实现其功能设计了指令集,即是CPU的 ...

  8. Modbus测试工具ModbusPoll与Modbus Slave使用方法

    感谢https://blog.csdn.net/byxdaz/article/details/77979114原创,由于CSDN经常调整,故再编辑收藏,并修改了部分BUG. 一.介绍 Modbus P ...

  9. 设置bootstrap modal模态框的宽度和宽度

    (1)修改宽度可以通过修改modal中的modal-dialog这个div宽度实现 <div class="modal-dialog" style="width:6 ...

  10. Discuz!伪静态原理分析

    伪静态在seo火热的时代,是每个站长都比较关注的问题,discuz!论坛如何伪静态,为什么伪静态失效了,为什么列表页无法实现伪静态,为什么有些页面不是伪静态呢?下面dz官方nxy105从两个角度入手为 ...