mongodb分片的原理与搭建

来源:互联网 发布:怎么更新windows系统 编辑:程序博客网 时间:2024/06/08 00:20

分片(sharding)是指将数据分拆,将其分散存放到不同的机器上的过程,有时候也会用分区(partitioning)来表示这个概念,将数据分散到不同的机器上去,这是一种可以水平扩展的模式,在数据量很大时特给力,也能处理更大的负载,实际大规模应用一般会采用这种架构去构建monodb系统,分片的目标之一就是创建5太,10台甚至上1000太服务器及集群,整个集群对应用程序来说是一台单机服务器,为了隐藏数据库架构的细节,在分片之前要先执行mongos进行一次路由过程。

要构建一个 MongoDB Sharding Cluster,需要三种角色:

ShardServer:每个Shard可以是一个mongod 实例,也可以是一组mongod实例,用于存储实际的数据分片,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障。

ConfigServer:为了将一个特定的collection存储在多个Shard中,需要为该collection指定一个Shard key,决定该记录属于哪个chunk。mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息。具体来说,配置服务器可以存储以下信息:

所有Shard节点的配置信息

每个chunk的Shard key范围

chunk在各Shard的分布情况

集群中所有DB和collection的Sharding配置信息

RouteServer:mongos 实例,前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。路由首先询问配置服务器需要到哪个Shard上查询或保存记录,然后连接相应的Shard执行操作,最后将结果返回给客户端。

分片搭建环境,三台服务器,IP分别为192.168.210.191、192.168.210.168、192.168.210.169,具体如下表所示:

主机

IP

服务及端口

server1

 

192.168.210.191

mongod shard11:27017

mongod shard12:27018

mongod config1:20000

mongs1:30000

server2

192.168.210.168

mongod shard12:27017
mongod shard22:27018
mongod config2:20000
mongs2:30000

server3

192.168.210.169

mongod shard13:27017
mongod shard23:27018
mongod config3:20000
mongs3:30000

 

这样我们集群包含了:

2个shard(mongod)、3个replica

shard1:192.168.210.191:27017、192.168.210.168:27017、192.168.210.169:27017

shard2:192.168.210.191:27018、192.168.210.168:27018、192.168.210.169:27018

3个configserver:192.168.210.191:20000、192.168.210.168:20000、192.168.210.169: 20000

3个mongos:192.168.210.191:30000、192.168.210.168:30000、192.168.210.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/ --oplogSize100 --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)初始化两组ReplicaSet

确认第2步没有报错之后,我们开始配置Replica Set。 通过mongo连接到shard1的一个mongod:

./bin/mongo192.168.210.191:27017

执行如下命令:

config= {_id: 'shard1', members: [{_id: 0, host: '192.168.210.191:27017'}, {_id: 1,host: '192.168.210.168:27017'}, {_id: 2, host: '192.168.210.169:27017'}]};

rs.initiate(config);

同样方法,配置shard2用到的replica set:

./bin/mongo192.168.210.191:27018

config= {_id: 'shard2', members: [{_id: 0, host: '192.168.210.191:27018'}, {_id: 1,host: '192.168.210.168:27018'}, {_id: 2, host: '192.168.210.169:27018'}]};

rs.initiate(config);

4)启动ConfigServer

在三台机器上分别启动并配置一台Config Server。命令如下:

./bin/mongod--configsvr --dbpath /data/db/config/ --port 20000 --logpath/data/db/config.log --logappend --fork

5)启动RoutingServer

部署并配置三台Routing Server

./bin/mongos--configdb 192.168.210.191:20000,192.168.210.168:20000,192.168.210.169:20000--port 30000 --chunkSize 100 --logpath /data/db/mongos.log --logappend --fork

6)添加分片

连接到mongs服务器,并切换到admin

./bin/mongo192.168.210.191:30000/admin

db.runCommand({addshard:"shard1/192.168.210.191:27017,192.168.210.168:27017,192.168.210.169:27017",name:"shard1",maxsize:2048,allowLocal:true });

注意:

如果在上述操作中抛出类似如下的错误信息:

 

inseed list shard1/192.168.210.191:27017,192.168.210.168:27017,192.168.210.169:27017,host 192.168.210.191:27017 does not belong to replica set shard1

那么将“192.168.210.191:27017”去掉再试试,笔者试过,可以成功,但原因目前还不太清楚。

db.runCommand({addshard:"shard2/192.168.210.191:27018,192.168.210.168:27018,192.168.210.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.210.168:27017,192.168.210.169:27017,192.168.210.155:27017"

},

{

"_id": "shard2",

"host": "shard2/192.168.210.168:27018,192.168.210.169:27018,192.168.210.191:27018"

}

],

"ok": 1

}


       许多人可能会混淆复制与分片的概念,记住,复制是让多台服务器都拥有同样的数据副本,每一台服务器都是其他服务器的镜像,而每一个分片都有其他分片拥有不同的数据子集。分片架构维护起来更麻烦,而且需要的机器也比较多,一般比较适合大的数据量,这样可以平衡各种负载,查询处理速度也比较快。

0 0