MongoDB 分片集群搭建

一 .集群部署简介
       MongoDB 的部署方式十分灵活,可以使用单个 MongoDB 实例,也可以使用复制集和分片集群。在测试开发阶段一般使用单个 MongoDB 实例。由于云数 据中心需要存储海量数据且系统并发访问量大,所以需要使用 MongoDB 分片集 群存储数据,这里将使用三台机器来搭建 MongoDB 分片集群,其部署方式如下图所示。
                                  

        MongoDB 分片集群包括三个配置服务器,三个 mongos 路由服务器以及三 个分片组成,其中每个分片是由三个节点组成的复制集。 分片集群设备具体参数如下:
     主机配置:CPU 2GHZ 内存 4G 硬盘 250G
     操作系统:Ubuntu x86_64 GNU/Linux
     MongoDB:x86_64 Version 2.4.12

二.机器部署
MongoDB 分片集群部署步骤如下:
1) 创建数据目录
在每台服务器上使用如下脚本创建数据目录

home=/home/yuzhi/MongoDB
if [ ! -f "$home/ShardEnv" ];then
    #测试环境目录
    mkdir -p $home/ShardEnv
    #配置服务器的数据和日志目录
    mkdir -p $home/ShardEnv/config/data
    mkdir -p $home/ShardEnv/config/log
    #mongos 日志目录
    mkdir -p $home/ShardEnv/mongos/log
    #三个分片服务器的数据和日志目录
    mkdir -p $home/ShardEnv/shard1/data
    mkdir -p $home/ShardEnv/shard1/log
    mkdir -p $home/ShardEnv/shard2/data
    mkdir -p $home/ShardEnv/shard2/log
    mkdir -p $home/ShardEnv/shard3/data
    mkdir -p $home/ShardEnv/shard3/log
fi

        由于 mongos 服务器不需要存储数据,只需创建 mongos 服务器的日志目录, 配置服务器和片服务器需要包含数据目录和日志目录。

2) 启动配置服务器进程

在每台服务器上使用如下脚本来启动配置服务器 
    DataHome=/home/yuzhi/MongoDB/ShardEnv
    config_dbpath=$DataHome/config/data
    config_logpath=$DataHome/config/log/mongod.log

    mongod –configsvr --dbpath $config_dbpath –logpath $config_logpath –logappend --port 20000 --fork

3) 启动 mongos 进程

在每台服务器上运行如下脚本,来启动 mongos 进程 
   DataHome=/home/yuzhi/MongoDB/ShardEnv
   mongos_logpath=$DataHome/mongos/log/mongod.log
   config1=node1:20000
   config2=node2:20000
   config3=node3:20000

   mongos --configdb$config1,$config2,$config3 –logpath $mongos_logpath --logappend –port 30000 –fork

4) 启动分片进程

在每台服务器上运行如下脚本,来启动分片进程
    DataHome=/home/yuzhi/MongoDB/ShardEnv
    shard_dbpath_1=$DataHome/shard1/data
    shard_logpath_1=$DataHome/shard1/log/mongod.log
    shard_dbpath_2=$DataHome/shard2/data
    shard_logpath_2=$DataHome/shard2/log/mongod.log
    shard_dbpath_3=$DataHome/shard3/data
    shard_logpath_3=$DataHome/shard3/log/mongod.log

    mongod--shardsvr--replSetshard1--dbpath$shard_dbpath_1--logpath$shard_logpath _1 --logappend--port22001--fork
    mongod--shardsvr--replSetshard2--dbpath$shard_dbpath_2--logpath$shard_logpath _2 --logappend--port22002--fork
    mongod--shardsvr--replSetshard3--dbpath$shard_dbpath_3--logpath$shard_logpath _3 --logappend--port22003--fork

5) 配置每个分片的复制集

登陆mongo,添加相应的机器,其中分片 shard1 的配置如下:
yuzhi@node1:~/MongoDB/sh$ mongo node1:22001
MongoDB shell version: 2.4.12
connecting to: node1:22001/test
          > config={_id:"shard1",members:[
                     ... {_id:0,host:"node1:22001"}, 
                     ... {_id:1,host:"node2:22001"},
                     ... {_id:2,host:"node3:22001"}
         ...]
配置完成后,使用 rs.initiate(config)命令初始化复制集。
添加成功后,可以使用 rs.status()命令查看复制集的状态,如下图所示,说明复制集 shard1 启动成功。
                            

以相同的方式来配置分片 shard2 和 shard3。

6) 分片配置

运行如下命令,将创建好的三个分片添加到集群中 
yuzhi@node1:~/MongoDB/sh$ mongo node1:30000
MongoDB shell version: 2.4.12
connecting to: node1:30000/test
mongos> use admin switched to db admin
mongos>db.runCommand( {addshard:"shard1/node1:22001,node2:22001,node3:2 2001" } ) { "shardAdded" : "shard1", "ok" : 1 } mongos>db.runCommand( {addshard:"shard2/node1:22002,node2:22002,node3:2 2002" } ) { "shardAdded" : "shard2", "ok" : 1 } mongos>db.runCommand( {addshard:"shard3/node1:22003,node2:22003,node3:22 003" } ) { "shardAdded" : "shard3", "ok" : 1 }

三 验证分片集群
       为了验证分片集群是否正常工作,现将测试数据导入分片集群中, 来查看数据的分布情况。
       默认情况下,创建的数据库和集合不会分片。因此,为了验证分片集群,首先创建允许分片的数据库和集合,其创建方式如下:
mongos> db.runCommand( {enablesharding: "GISNew"} )
          { "ok" : 1 }
mongos>db.runCommand( {shardCollection:" GISNew.baidugis",key:{id:1} )
          { "collectionsharded" : "testshard.shardtable", "ok" : 1 }
这里选择 id 作为分片的片键,然后使用 mongorestore 命令导入数据。
      使用 mongorestore --host node1 --port 30000 baidugis 导入测试数据,导入完 成后,使用 db.printShardingStatus() 查看数据的分布情况,其结果如下图所示。
      可以看到,数据库 GISNew 和集合 baidugis 已经分片, 测试数据分散的存储在 shard1、shard2 和 shard3 上,其中 shard1 和 shard3 上有 4 个数据块,shard2 上有 3 个数据块。
       

你可能感兴趣的:(MongoDB)