在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, 把这个数据库和collection设置到shard环境。 然后把往里面插入100万条数据。

use im

db.message.ensureIndex({"from":1,"snddate":1})

use admin

db.adminCommand({"enableSharding":"im"})

db.adminCommand({"shardCollection":"im.message", key:{from:1, snddate:1}})

完事之后我们可以用sh.status()查看Sharding的状况

然后知道用一个循环把100万条数据插到Shard环境中:

 for (i=0; i<1000000; i++) {

    db.message.insert({"from" : i + "@example.com", "to" : (1000000-i) + "@example.com","snddate" :  new Date()});

}

然后再通过sh.status()或者db.stats()查看Sharding的状况。

由于ShardKey选择的不好, 刚刚插入的完成的时候会发现rs-1的chunk比其他两个的chunk多的多。 这是因为选用了有ascedingKey造成rs-1成为了hotspot。 经过一段时间后3台RelicaSet的chunk数逐渐趋于平衡。

猜你喜欢

转载自zjumty.iteye.com/blog/1856807
今日推荐