日期:2014-05-16  浏览次数:20593 次

在Mac上搭建MongoDB的Shard环境

本文介绍了在Mac上搭建一个MongoDB的Shard环境。 为了能在一台机器上运行多个mongod实例, 在本文中采用每个节点利用一个端口的形式, 实际的生产环境中最好是每个节点一个物理机器。另外本文介绍的方法其实和Mac没有依赖关系。 Linux,Windows上应该也是可行的。

?

首先, 到http://www.mongodb.org/downloads下载最新的MongoDB的Binary。我是在Mac上, 所以下载OSX 64位版。 下载以后, 解压到任意目录, 可以直接运行。

?

下面是要搭建的环境:

1个Router服务器。

1个Config服务器集群(3个Config服务器节点)。

3个ReplicaSet集群, 每个ReplicaSet里有个两个节点(一个Primary,一个Slave)。

共10个节点

?

端口号分别为:

Router:27017

Config服务器1:27109

Config服务器2:27110

Config服务器2:27111

ReplicaSet集群1-Primary:27112

ReplicaSet集群1-Slave:27113

ReplicaSet集群2-Primary:27114

ReplicaSet集群2-Slave:27115

ReplicaSet集群3-Primary:27116

ReplicaSet集群3-Slave:27117

?

?

?



?

在解压以后的mongodb目录里执行以下命令来启动3个Config服务器

?

mkdir -p cfg-1/data
mkdir -p cfg-2/data
mkdir -p cfg-3/data
./bin/mongod --configsvr --port=27109 --dbpath=cfg-1/data --logpath=cfg-1/cfg-1.log &
./bin/mongod --configsvr --port=27110 --dbpath=cfg-2/data --logpath=cfg-2/cfg-2.log &
./bin/mongod --configsvr --port=27111 --dbpath=cfg-3/data --logpath=cfg-3/cfg-3.log &

?

?

这是3个config服务器都启动了, 但彼此还不知道对方的存在。

?

执行以下命令来启动ReplicaSet集群1

?

mkdir -p rs-1/rs-1-a/data
mkdir -p rs-1/rs-1-b/data

./bin/mongod --dbpath=rs-1/rs-1-a/data --logpath=rs-1/rs-1-a/rs-1-a.log --port=27112 --replSet=rs-1/localhost:27113 --rest &
./bin/mongod --dbpath=rs-1/rs-1-b/data --logpath=rs-1/rs-1-b/rs-1-b.log --port=27113 --replSet=rs-1/localhost:27112 --rest &

?

如果是初次建立这个集群,需要初始化这个集群:

./bin/mongo localhost:27112

?

cfg = {_id:'rs-1', members:[{_id:0, host:'localhost:27112'}, {_id:1, host:'localhost:27113', priority : 0}]}

rs.initiate(cfg)

?

如果成功了会输出:

{
??? "info" : "Config now saved locally.? Should come online in about a minute.",
??? "ok" : 1
}

?

同理我们可以创建和初始化ReplicaSet集群2和ReplicaSet集群3

?

?

mkdir -p rs-2/rs-2-a/data
mkdir -p rs-2/rs-2-b/data
mkdir -p rs-3/rs-3-a/data
mkdir -p rs-3/rs-3-b/data

./bin/mongod --dbpath=rs-2/rs-2-a/data --logpath=rs-2/rs-2-a/rs-2-a.log --port=27114 --replSet=rs-2/localhost:27115 --rest &
./bin/mongod --dbpath=rs-2/rs-2-b/data --logpath=rs-2/rs-2-b/rs-2-b.log --port=27115 --replSet=rs-2/localhost:27114 --rest &
./bin/mongod --dbpath=rs-3/rs-3-a/data --logpath=rs-3/rs-3-a/rs-3-a.log --port=27116 --replSet=rs-3/localhost:27117 --rest &
./bin/mongod --dbpath=rs-3/rs-3-b/data --logpath=rs-3/rs-3-b/rs-3-b.log --port=27117 --replSet=rs-3/localhost:27116 --rest &

?

?

最后我们要启动router服务器,并把3个ReplicaSet加到Shard环境中。

?

?

mkdir -p router
./bin/mongos --configdb localhost:27109,localhost:27110,localhost:27111 --logpath=router/router.log &

?

?

router服务器没有数据存储, 所以不用指定dbpath。另外在这里通过

--configdb localhost:27109,localhost:27110,localhost:27111

把3台config服务器联系在一起。

?

然后把三个RelicaSet集群加到Router里面。

./bin/mongo

use admin

db.runCommand({"addShard":"rs-1/localhost:27112,localhost:27113"})

db.runCommand({"addShard":"rs-2/localhost:27114,localhost:27115"})

db.runCommand({"addShard":"rs-3/localhost:27116,localhost:27117"})

?

到此为止, 服务器都已经启动完毕。我们在这个Shard环境中建立一个数据库和一个collection来试一下sharding的状况。 为了能够明显的看出sharding, 我们先把chunksize设置为1M。这样只要用相对少量的数据就可以让每个ReplicaSet集群上插入多个chunk。不然所插入的数据一时半会还无法填满默认size的一个chunk,所以不会发生数据移动。

?

连接到router服务器:

./bin/mongo localhost

?

use config

db.settings.save({_id:"chunksize", value:1})

?

然后我们建立一个叫message的collection,