mongodb集群与分片的配置说明



Shardingcluster介绍:

这是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架构去构建monodb系统。


系统分为需要三种角色:

Shard Server:mongod 实例,用于存储实际的数据块,实际生产环境中一个        shard server角色可由几台机器组个一个relica set承担,防止主机单点故障

Config Server:mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息。

Route Server:mongos 实例,前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。

架构图:

本系统环境架构图:

注:mongoDB集群最好是奇数数个服务器,本例介绍的是三台服务器


  1. 分别在3台机器上运行一个mongod实例(称为mongod shard11,mongod shard12,mongod shard13)组成replica set1 ,作为cluster的shard1
  2. 分别在3台机器上运行另一个mongod实例(称为mongod shard21,mongod shard22,mongod shard23)组成replica set2 ,作为cluster的shard2
  3. 分别在3台机器运行一个mongod实例,作为3个config server
  4. 分别在每台机器运行一个mongos进程,用于客户连接

主机

IP

端口信息

Server1
192.168.10.207
mongod shard11:27017
mongod shard12:27018
mongod shard1:20000
mongos1:30000
Server2
192.168.10.208
mongod shard11:27017
mongod shard12:27018
mongod shard1:20000
mongos1:30000
Server3
192.168.10.209
mongod shard11:27017
mongod shard12:27018
mongod shard1:20000
mongos1:30000

软件准备

部署前请先关闭防火墙,因为防火墙有时候会屏蔽

1 安装mongoDB软件

下载mongodb

   解压tar zxvf mongodb-linux-***.tar

2 创建数据目录

Server1:


mkdir -p /data/shard11
mkdir -p /data/shard21
 
      
Server2:
 
      
mkdir -p /data/shard12
mkdir -p /data/shard22
 
      
Server3:
 
      
mkdir -p /data/shard13
mkdir -p /data/shard23
 
      
配置replice sets(副本集):
1. 配置shard1所用到的replicasets:
Server1:
 
      
./mongod -shardsvr -replSet shard1 -port 27017 -dbpath/data/shard11/ -oplogSize 100 -logpath /data/shard11.log -logappend --fork
 
      
Server2:
 
      
./mongod -shardsvr -replSet shard1 -port 27017 -dbpath/data/shard12/ -oplogSize 100 -logpath /data/shard12.log -logappend --fork
 
      
Server3:
 
      
./mongod -shardsvr -replSet shard1 -port 27017 -dbpath/data/shard13/ -oplogSize 100 -logpath /data/shard13.log -logappend –-fork
 
      
初始化replica set
用mongo连接其中一个mongod(例如:./mongo 192.168.10.207:27017)执行:
 
      
> config = {_id:"shard1",members:[{_id:0,host:'192.168.10.207:27017'},{_id:1,host:'192.168.10.208:27017'},{_id:2,host:'192.168.10.209:27017'}]}
                                                 
> rs.initiate(config);
 
      
2、同样的方法,配置shard2用到的replica sets:
Server1:
 
      
./mongod -shardsvr -replSet shard2 -port 27018 -dbpath/data/shard21/ -oplogSize 100 -logpath /data/shard21.log -logappend --fork
 
      
Server2:
 
      
./mongod -shardsvr -replSet shard2 -port 27018 -dbpath/data/shard22/ -oplogSize 100 -logpath /data/shard22.log -logappend --fork
 
      
Server3:
 
      
./mongod -shardsvr -replSet shard2 -port 27018 -dbpath/data/shard23/ -oplogSize 100 -logpath /data/shard23.log -logappend –-fork
 
      
初始化replica set
用mongo连接其中一个mongod(例如:./mongo 192.168.10.207:27017)执行:
 
      
> config ={_id:"shard2",members:[{_id:0,host:'192.168.10.207:27018'},{_id:1,host:'192.168.10.208:27018'},{_id:2,host:'192.168.10.209:27018'}]}
                                             
> rs.initiate(config);
 
      
配置三台config server:
Server1:
 
      
./mongod -configsvr -dbpath /data/config -port 20000 -logpath/data/config.log -logappend --fork
 
      
Server2:
 
      
./mongod -configsvr -dbpath /data/config -port 20000 -logpath/data/config.log -logappend --fork
 
      
Server3:
 
      
./mongod -configsvr -dbpath /data/config -port 20000 -logpath/data/config.log -logappend --fork


配置mongos:

Server1


./mongos -configdb192.168.10.207:20000,192.168.10.208:20000,192.168.10.209:20000 -port 30000-chunkSize 5 -logpath /data/mongos.log -logappend --fork
 
      
server2
 
      
./mongos -configdb192.168.10.207:20000,192.168.10.208:20000,192.168.10.209:20000 -port 30000-chunkSize 5 -logpath /data/mongos.log -logappend --fork

server3
 
      
./mongos -configdb192.168.10.207:20000,192.168.10.208:20000,192.168.10.209:20000 -port 30000-chunkSize 5 -logpath /data/mongos.log -logappend --fork


注释:mongos不需要dbpath

配置分片:

  1. 连接mongos,并切换到admin ./mongo 192.168.10.207:30000/admin

>db admi



   2.加入shards

如果shard是单台服务器,用:


>db.runCommand({ addshard :“<serverhostname>[:<port>]”})
 
      
 
如果shard是replica sets,用:
 
      
>db.runCommand({ addshard : “replicaSetName/<serverhostname>[:<port>],<serverhostname>[:<port>]..”})


如本机执行:

>db.runCommand({ addshard :“shard1/192.168.10.207:27017,192.168.10.208:27017,192.168.10.209:27017″,name:”s1″,maxsize:20480});
 
      
 
 
      
>db.runCommand({ addshard :“shard2/192.168.10.207:27018,192.168.10.208:27018, 192.168.10.209:27018″,name:”s2″,maxsize:20480})


注释:

name为用于置顶shard的名字,不指定的话系统自动分配

maxsize为指定各个shard可用的最大磁盘空间

3.查看shard是否添加成功


>db.runCommand({listshards:1})

如果列出了以上两个你家的shards,表示添加成功

4.激活数据库分片



>db.runCommand({enablesharding:”<dbname>”})



通过执行以上命令,可以让数据库跨shard,如果不执行这步,数据库只会存放在一个shard,一旦激活数据库分片,数据库中不同的 collection将被存放在不同的shard上,但一个collection仍旧存放在同一个shard上,要使单个collection也分片,还 需单独对collection作些操作

如:


>db.runCommand({enablesharding:"test"})

查看数否生效:


>db.printShardingStatus()
   sharding version: { "_id" : 1, "version" : 3 }
    shards:
       {  "_id" : "s1",  "host" :        "shard1/192.168.10.207:27017,192.168.10.208:27017,192.168.10.209:27017" }
       {  "_id" : "s2",  "host" : "shard2/192.168.10.207:27018,192.168.10.208:27018,192.168.10.209:27018" }
         databases:
       {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
       {  "_id" : "test",  "partitioned" : true,  "primary" : "s1" }

注释:

一旦enable了个数据库,mongos将会把数据库里的不同数据集放在不同的分片上。除非数据集被分片(下面会设置),否则一个数据集的所有数据将放在一个分片上。

Collecton分片:

要使单个collection也分片存储,需要给collections指定一个分片key,如下:


> db.runCommand( {shardcollection : “<namespace>”,key : <shardkeypatternobject> })


a. 分片的collection系统会自动创建一个索引(也可用户提前创建好)
b. 分片的collection只能有一个在分片key上的唯一索引,其它唯一索引不被允许

分片collection例子:



> db.runCommand({shardcollection:"test.c1",key:{id:1}})
> use test



测试一下:



> for(var i =0; i<20000; i++) db.c1.save({id:i,value:"111111"})
            
> db.c1.stats()
            
{
        “sharded” : true,
        “ns” : “test.c1″,
        “count” : 200003,
        “size” : 25600384,
        “avgObjSize” : 128,
        “storageSize” : 44509696,
        “nindexes” : 2,
        “nchunks” : 15,
        “shards” : {
               “s1″ : {
                       “ns” : “test.c1″,
                       “count” : 141941,
                       “size” : 18168448,
                       “avgObjSize” : 128,
                       “storageSize” : 33327616,
                       “numExtents” : 8,
                       “nindexes” : 2,
                       “lastExtentSize” : 12079360,
                       “paddingFactor” : 1,
                       “flags” : 1,
                       “totalIndexSize” : 11157504,
                       “indexSizes” : {
                               “_id_” : 5898240,
                               “id_1″ : 5259264
                       },
                       “ok” : 1
               },
               “s2″ : {
                       “ns” : “test.c1″,
                       “count” : 58062,
                       “size” : 7431936,
                       “avgObjSize” : 128,
                       “storageSize” : 11182080,
                       “numExtents” : 6,
                       “nindexes” : 2,
                       “lastExtentSize” : 8388608,
                       “paddingFactor” : 1,
                       “flags” : 1,
                       “totalIndexSize” : 4579328,
                       “indexSizes” : {
                               “_id_” : 2416640,
                               “id_1″ : 2162688
                       },
                       “ok” : 1
               }
        },
        “ok” : 1
}


如果出现以上相同信息,为系统部署正确

 

 

 

 

附录:

mongod手册:http://cn.docs.mongodb.org/manual/reference/mongod/

服务器状态查询手册:http://cn.docs.mongodb.org/manual/reference/server-status/

数据库统计参考手册:http://cn.docs.mongodb.org/manual/reference/database-statistics/