数据库

 首页 > 数据库 > MongoDB > MongoDB集群(分片)安装与配置方法图解

MongoDB集群(分片)安装与配置方法图解

分享到:
【字体:
导读:
         摘要:软件准备下载mongoDB(mongoDB下载地址),笔者使用的是mongoDB2.0.4的Linux64-bit版本。解压:tarxzfmongo.tgz默认情况下,mongoDB将数据存储在/data/db目录下,但它不会自动创建该目录,所以我们需要手动创建它:$sudomkdir-p/data/db/$sudo...

MongoDB集群(分片)安装与配置方法图解

软件准备

下载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集群(分片)搭建与配置

要构建一个 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

}

MongoDB集群(分片)安装与配置方法图解
分享到:
MongoDB数据库高级查询方法
MongoDB数据库高级查询方法 1 ) . 大于,小于,大于或等于,小于或等于 $size是匹配数组内的元素数量的,如有一个对象:{a:["foo"]},他只有一个元素: 官网上说不能用来匹配一个范围内的元素,如果想找$size=”操作         15. db.foo.find({"timestamp": {"$gte" : 2}})         16. #子对象...
MongoDB数据库的查询基础操作
MongoDB数据库的查询基础操作 1, find 用法 .查询就是返回一个集合中的文档的子集 .查询的一般操作是使用find,若没有向find传递参数,默认的是显示所有文档 db.blog.find() { "_id" : ObjectId("4f6e766e811cca6e90f0dab5"), "name" : "testmongo", "age" : 20 } .指定多个查询条件: db.blog.find("ti...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……