软件准备下载mongoDB(mongoDB下载地址),笔者使用的是mongoDB2.0.4的Linux64-bit版本。解压:tarxzfmongo.tgz默认情况下,mongoDB将数据存储在/data/db目录下,但它不会自动创建该目录,所以我们需要手动创建它:$sudomkdir-p/data/db/$sudo
软件准备
下载mongoDB(mongoDB下载地址),笔者使用的是mongoDB 2.0.4的Linux 64-bit版本。
解压:tar xzf mongo.tgz
默认情况下,mongoDB将数据存储在/data/db目录下,但它不会自动创建该目录,所以我们需要手动创建它:
$ sudo mkdir -p /data/db/
$ sudo chown `id -u` /data/db
也可以使用--dbpath参数来指定别的数据库目录。
如果只是想在单机上测试一下mongoDB的话,非常简单,首先启动MongoDB server,
$ ./mongodb-xxxxxxx/bin/mongod
在另外一个终端,连接到我们启动的server:
$ ./mongodb-xxxxxxx/bin/mongo
> db.foo.save( { a : 1 } )
> db.foo.find()
Sharding Cluster介绍
这是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架构去构建monodb系统,其构架图如下:
要构建一个 MongoDB Sharding Cluster,需要三种角色:
Shard Server:每个Shard可以是一个mongod
实例,也可以是一组mongod实例,用于存储实际的数据分片,实际生产环境中一个shard
server角色可由几台机器组个一个relica set承担,防止主机单点故障。
Config
Server:为了将一个特定的collection存储在多个Shard中,需要为该collection指定一个Shard
key,决定该记录属于哪个chunk。mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk
信息。具体来说,配置服务器可以存储以下信息:
每个chunk的Shard key范围
chunk在各Shard的分布情况
集群中所有DB和collection的Sharding配置信息
Route Server:mongos
实例,前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。路由首先询问配置服务器需要到哪个Shard上查询或保存记录,然后连接相应的Shard执行操作,最后将结果返回给客户端。
整体配置概览
首先说一下笔者的分片搭建环境,三台服务器,操作系统都是Ubuntu 11.04 Server
版,64位。IP分别为192.168.56.191、192.168.56.168、192.168.56.169,具体如下表所示:
主机
|
IP
|
服务及端口
|
server1
|
192.168.56.191
|
mongod shard11:27017
mongod shard12:27018
mongod config1:20000
mongs1:30000
|
server2
|
192.168.56.168
|
mongod shard12:27017
mongod shard22:27018
mongod config2:20000
mongs2:30000
|
server3
|
192.168.56.169
|
mongod shard13:27017
mongod shard23:27018
mongod config3:20000
mongs3:30000
|
这样我们集群包含了:
2个shard(mongod)、3个replica
shard1:192.168.56.191:27017、192.168.56.168:27017、192.168.56.169:27017
shard2:192.168.56.191:27018、192.168.56.168:27018、192.168.56.169:27018
3个config
server:192.168.56.191:20000、192.168.56.168:20000、192.168.56.169:
20000
3个mongos:192.168.56.191:30000、192.168.56.168:30000、192.168.56.169:
30000
步骤
1)创建文件夹
在各台server上创建shard文件目录
Server1:
mkdir -p data/db/shard11
mkdir -p data/db/shard21
Server2:
mkdir -p data/db/shard12
mkdir -p data/db/shard22
Server3:
mkdir -p data/db/shard13
mkdir -p data/db/shard23
创建完毕后,请确保当前用户对该文件夹拥有读写权限(使用chown命令),否则之后会报错。
2) 在三台机器上分别启动mongod进程
Server1:
./bin/mongod --shardsvr --replSet shard1 --port 27017
--dbpath /data/db/shard11/ --oplogSize 100 --logpath
/data/db/shard12.log --logappend --fork --rest
./bin/mongod -shardsvr -replSet shard2 -port 27018 -dbpath
/data/db/shard21/ -oplogSize 100 -logpath /data/db/shard22.log
-logappend -fork
Server2:
./bin/mongod --shardsvr --replSet shard1 --port 27017 --dbpath
/data/db/shard11/ --oplogSize 100 --logpath /data/db/shard12.log
--logappend --fork --rest
./bin/mongod -shardsvr -replSet shard2 -port 27018 -dbpath
/data/db/shard21/ -oplogSize 100 -logpath /data/db/shard22.log
-logappend -fork
Server3:
./bin/mongod --shardsvr --replSet shard1 --port 27017 --dbpath
/data/db/shard13/ --oplogSize 100 --logpath /data/db/shard12.log
--logappend --fork --rest
./bin/mongod -shardsvr -replSet shard2 -port 27018 -dbpath
/data/db/shard23/ -oplogSize 100 -logpath /data/db/shard22.log
-logappend -fork
3) 初始化两组Replica Set
确认第2步没有报错之后,我们开始配置Replica Set。 通过mongo连接到shard1的一个mongod:
./bin/mongo 192.168.56.191:27017
执行如下命令:
cOnfig= {_id: 'shard1', members: [{_id: 0, host:
'192.168.56.191:27017'}, {_id: 1, host: '192.168.56.168:27017'},
{_id: 2, host: '192.168.56.169:27017'}]};
rs.initiate(config);
同样方法,配置shard2用到的replica set:
./bin/mongo 192.168.56.191:27018
cOnfig= {_id: 'shard2', members: [{_id: 0, host:
'192.168.56.191:27018'}, {_id: 1, host: '192.168.56.168:27018'},
{_id: 2, host: '192.168.56.169:27018'}]};
rs.initiate(config);
4) 启动Config Server
在三台机器上分别启动并配置一台Config Server。命令如下:
./bin/mongod --configsvr --dbpath /data/db/config/ --port
20000 --logpath /data/db/config.log --logappend --fork
5)启动Routing Server
部署并配置三台Routing Server
./bin/mongos --configdb
192.168.56.191:20000,192.168.56.168:20000,192.168.56.169:20000
--port 30000 --chunkSize 100 --logpath /data/db/mongos.log
--logappend --fork
6)添加分片
连接到mongs服务器,并切换到admin
./bin/mongo 192.168.56.191:30000/admin
db.runCommand({addshard:"shard1/192.168.56.191:27017,192.168.56.168:27017,192.168.56.169:27017",name:"shard1",maxsize:2048,
allowLocal:true });
注意:
如果在上述操作中抛出类似如下的错误信息:
in seed list
shard1/192.168.56.191:27017,192.168.56.168:27017,192.168.56.169:27017,
host 192.168.56.191:27017 does not belong to replica set shard1
那么将“192.168.56.191:27017”去掉再试试,笔者试过,可以成功,但原因目前还不太清楚。
db.runCommand({addshard:"shard2/192.168.56.191:27018,192.168.56.168:27018,192.168.56.169:27018",
name:"shard2",maxsize:2048, allowLocal:true });
db.runCommand( { listshards : 1 } );
如果列出(sharding)了以上二个你加的shards,表示shards已经配置成功。笔者测试的输出如下:
mongos> db.runCommand( { listshards : 1 } );
{
"shards" : [
{
"_id" : "shard1",
"host" :
"shard1/192.168.56.168:27017,192.168.56.169:27017,192.168.56.155:27017"
},
{
"_id" : "shard2",
"host" :
"shard2/192.168.56.168:27018,192.168.56.169:27018,192.168.56.191:27018"
}
],
"ok" : 1
}