Mongodb ReplicaSet + Sharding集群实现

本文介绍了如何构建一个MongoDB的Sharding Cluster,包括Sharding集群的基本概念,集群设计,环境准备,以及详细的Replica Set和Sharding集群的安装步骤。在集群中,Shard Server由多个Replica Set组成,Config Server存储元数据,而Route Server提供客户端接入。文章详细阐述了在三台服务器上设置Replica Set和配置Sharding的步骤,包括创建数据文件目录,启动mongod实例,初始化Replica Set,配置Config Server和mongs,以及激活数据库分片和分片collection的操作。
摘要由CSDN通过智能技术生成

1 集群概述

1.1 Sharding cluster介绍

是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架构去构建monodb系统。

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

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

Config Server: mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息。

Route Server: mongos 实例,前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。

 

2 Mongodb集群设计

2.1 环境准备

【集群环境至少需要两台服务器作为集群节点,此次集群为正常集群的安装部署,不涉及伪集群部署】

 

硬件配置

软件配置

集群节点服务器121

IP:192.168.0.121

OS:CentOs 6.4 (64位)

配置:4G内存,30G硬盘。双核CPU

mongodb-linux-x86_64-2.6.9.tgz

集群节点服务器185

IP:192.168.0.185

OS:CentOs 6.4 (64位)

配置:4G内存,30G硬盘。双核CPU

mongodb-linux-x86_64-2.6.9.tgz

集群节点服务器192

IP:192.168.0.192

OS:CentOs 6.4 (64位)

配置:4G内存,30G硬盘。双核CPU

mongodb-linux-x86_64-2.6.9.tgz

 

注:请确保Linux系统的时间跟当地标准时间是一致的,如果不一致,请用date命令修改系统时间,如:date -s "201301218 16:12:00" &&hwclock --systohc

2.2 拓扑结构

2.2.1 Mongodb Replica Set + Sharding集群架构图

 

2.2.2 环境架构


2.3 Replica Set + Sharding集群安装

2.3.1 环境准备

分别在3台机器运行一个mongod实例(称为mongod shard11mongod shard12mongod shard13)组织replica set1,作为clustershard1

分别在3台机器运行一个mongod实例(称为mongod shard21mongod shard22mongod shard23)组织replica set2,作为clustershard2

每台机器运行一个mongod实例,作为3config server

每台机器运行一个mongs进程,用于客户端连接

主机  IP 端口信息

Server1 192.168.0.121

mongod shard11-27017

mongod shard12-27018

mongod config1-20000

mongs1-30000

Server2 192.168.0.185

mongod shard12-27017

mongod shard22-27018

mongod config2-20000

mongs2-30000

Server3 192.168.0.192

mongod shard13-27017

mongod shard23-27018

mongod config3-20000

mongs3-30000

 

根据sharding架构图所示,在各台sever上创建shard数据文件目录

Server1:

su – monodb

cd /home/monodb

mkdir -p data/shard11

mkdir -p data/shard21

Server2:

su – monodb

cd /home/monodb

mkdir -p data/shard12

mkdir -p data/shard22

Server3:

su – monodb

cd /home/monodb

mkdir -p data/shard13

mkdir -p data/shard23

2.3.2 配置relica set

1. 配置shard1所用到的replica sets:

Server1:

cd /home/mongodb/mongodb-linux-x86_64-2.6.9/bin

./mongod –shardsvr –replSet shard1 –port 27017 –dbpath /home/mongodb/data/shard11 –oplogSize 100 –logpath /home/mongodb/data/shard11.log –logappend –fork

Server2:

cd /home/mongodb/mongodb-linux-x86_64-2.6.9/bin

./mongod –shardsvr –replSet shard1 –port 27017 –dbpath /home/mongodb/data/shard12 –oplogSize 100 –logpath /home/mongodb/data/shard12.log –logappend –fork

Server3:

cd /home/mongodb/mongodb-linux-x86_64-2.6.9/bin

./mongod –shardsvr –replSet shard1 –port 27017 –dbpath /home/mongodb/data/shard13 –oplogSize 100 –logpath /home/mongodb/data/shard13.log –logappend –fork

初始化replica set

mongo连接其中一个mongod,执行:

> config = {_id: shard1, members: [

                          {_id: 0, host: '192.168.0.121:27017'},

                          {_id: 1, host: '192.168.0.185:27017'},

                          {_id: 2, host: '192.168.0.192:27017'}]

           }

> rs.initiate(config);

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

server1:

cd /home/mongodb/mongodb-linux-x86_64-2.6.9/bin

./mongod –shardsvr –replSet shard2 –port 27018 –dbpath /home/mongodb/data/shard21 –oplogSize 100 –logpath /home/mongodb/data/shard21.log –logappend –fork

server2:

cd /home/mongodb/mongodb-linux-x86_64-2.6.9/bin

./mongod –shardsvr –replSet shard2 –port 27018 –dbpath /home/mongodb/data/shard22 –oplogSize 100 –logpath /home/mongodb/data/shard22.log –logappend –fork

server3:

cd /home/mongodb/mongodb-linux-x86_64-2.6.9/bin

./mongod –shardsvr –replSet shard2 –port 27018 –dbpath /home/mongodb/data/shard23 –oplogSize 100 –logpath /home/mongodb/data/shard23.log –logappend –fork

初始化replica set

mongo连接其中一个mongod,执行:

> config = {_id: shard2, members: [

                          {_id: 0, host: '192.168.0.121:27018'},

                          {_id: 1, host: '192.168.0.185:27018'},

                          {_id: 2, host: '192.168.0.192:27018'}]

           }

> rs.initiate(config);

到此就配置好了二个replica sets,也就是准备好了二个shards

2.3.3 配置三台config server

Server1:

mkdir -p /home/mongodb/data/config

./mongod configsvr dbpath /home/mongodb/data/config port 20000 logpath /home/mongodb/data/config.log logappend fork   #config server也需要dbpath

 

Server2:

mkdir -p /home/mongodb/data/config

./mongod –configsvr –dbpath /home/mongodb/data/config –port 20000 –logpath /home/mongodb/data/config.log –logappend –fork

Server3:

mkdir -p /home/mongodb/data/config

./mongod –configsvr –dbpath /home/mongodb/data/config –port 20000 –logpath /home/mongodb/data/config.log –logappend –fork

2.3.4 配置mongs

 

server1,server2,server3上分别执行:

./mongos –configdb 192.168.0.121:20000, 192.168.0.185:20000, 192.168.0.192:20000 –port 30000 –chunkSize 5 –logpath /home/mongodb/data/mongos.log –logappend –fork 

#mongs不需要dbpath

Configuring the Shard Cluster

 

连接到其中一个mongos进程,并切换到admin数据库做以下配置

1. 连接到mongs,并切换到admin

./mongo 192.168.0.121:30000/admin

>use admin

2. 加入shards

如 里shard是单台服务器,用>db.runCommand( { addshard : <serverhostname>[:<port>]” } )这样的命令加入,如果shardreplica sets,用replicaSetName/<serverhostname>[:port] [,serverhostname2[:port],]这样的格式表示,例如本例执行:

>db.runCommand( { addshard : “shard1/192.168.0.121:27017,192.168.0.185:27017,192.168.0.192:27017”,name:”s1”,maxsize:20480} );

>db.runCommand( { addshard : “shard2/192.168.0.121:27018,192.168.0.185:27018,192.168.0.192:27018”,name:”s2”,maxsize:20480} );

注意:在添加第二个shard时,出现error:test database 已经存在的错误,这里用mongo命令连接到第二个replica set,用db.dropDatabase()命令把test数据库给删除然后就可加入

3. 可选参数

Name:用于指定每个shard的名字,不指定的话系统将自动分配

maxSize:指定各个shard可使用的最大磁盘空间,单位megabytes

4. Listing shards

>db.runCommand( { listshards : 1 } )

如果列出了以上二个你加的shards,表示shards已经配置成功

5. 激活数据库分片

命令:

>use admin

> db.runCommand( { enablesharding : “<dbname>” } );

通 过执行以上命令,可以让数据库跨shard,如果不执行这步,数据库只会存放在一个shard,一旦激活数据库分片,数据库中不同的collection 将被存放在不同的shard上,但一个collection仍旧存放在同一个shard上,要使单个collection也分片,还需单独对 collection作些操作

Collecton分片

要使单个collection也分片存储,需要给collection指定一个分片key,通过以下命令操作:

>use admin

> db.runCommand( { shardcollection : “<namespace>”,key : <shardkeypatternobject> });

注:

 a. 分片的collection系统会自动创建一个索引(也可用户提前创建好)

 b. 分片的collection只能有一个在分片key上的唯一索引,其它唯一索引不被允许

One note: a sharded collection can have only one unique index, which must exist on the shard key. No other unique indexes can exist on the collection.

分片collection例子

>db.runCommand( { shardcollection : test.c1,key : {id: 1} } )

>for (var i = 1; i <= 200003; i++) db.c1.save({id:i,value1:1234567890,value2:1234567890,value3:1234567890,value4:1234567890});

> db.c1.stats()

{

        “sharded” : true,

        “ns” test.c1,

        “count” : 200003,

        “size” : 25600384,

        “avgObjSize” : 128,

        “storageSize” : 44509696,

        “nindexes” : 2,

        “nchunks” : 15,

        “shards” : {

                “s1″ : {

                        “ns” test.c1,

                        “count” : 141941,

                        “size” : 18168448,

                        “avgObjSize” : 128,

                        “storageSize” : 33327616,

                        “numExtents” : 8,

                        “nindexes” : 2,

                        “lastExtentSize” : 12079360,

                        “paddingFactor” : 1,

                        “flags” : 1,

                        “totalIndexSize” : 11157504,

                        “indexSizes” : {

                                “_id_” : 5898240,

                                “id_1″ : 5259264

                        },

                        “ok” : 1

                },

                “s2″ : {

                        “ns” test.c1,

                        “count” : 58062,

                        “size” : 7431936,

                        “avgObjSize” : 128,

                        “storageSize” : 11182080,

                        “numExtents” : 6,

                        “nindexes” : 2,

                        “lastExtentSize” : 8388608,

                        “paddingFactor” : 1,

                        “flags” : 1,

                        “totalIndexSize” : 4579328,

                        “indexSizes” : {

                                “_id_” : 2416640,

                                “id_1″ : 2162688

                        },

                        “ok” : 1

                }

        },

        “ok” : 1

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值