本文介绍了在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,