您的位置:首页 > 数据库 > Mongodb

mongodb分布式集群部署,集群分片策略

2013-07-23 11:47 856 查看
由于项目需要,要部署一个副本集的分片集群,有三个服务器用来部署mongoDB,我们将数据分为2个副本集分片,并分别部署2个config server和2个mongos, 则具体分配如下:

Server 192.168.155.224:

10001 shard1

10002 shard2

20001 config1

Server 192.168.155.225:

10001 shard1

10002 shard2

20002 config2

Server 192.168.155.226:

30001 mongos1

30002 mongos2

1、启动Config server实例

配置数据库是存放集群元数据的mongod实例。使用--configsvr选项指定一个mongod为一个配置服务器。每个配置服务器保存集群一份全部的元数据。在生产环境下,你必须部署三个配置服务实例,每个运行在不同的服务器上,以确保良好的运行时间和数据安全。在测试环境下,你能在一台单独的服务器上运行三个配置服务。

配置服务实例接收相对较小的流量,并且占用系统资源较少。因此,可以在运行这个实例的系统上同时运行其它实例。

(1)为每个配置服务实例创建一个数据目录。默认的情况下,配置服务将数据文件存储在/data/config目录下。

(2)运行三个配置服务实例。使用下面命令:

mongod --configsvr --dbpath <path> --port <port> --logpath <logpath>

如端口为20001,数据存放目录为/mongo-data/config1,日志路径为/mongo-data/config1/log.log,并创建服务进程,命令如下:

mongod --fork --configsvr --port=20001 --dbpath=/data/config1/ --logpath=/data/config1/log.log

2、启动mongos实例

Mongos实例是轻量级的,并且不需要数据目录。你能在一个运行其它集群组件的系统上运行一个mongos实例,如一个应用服务或者一个mongod进程。Mongos的默认端口是27017。当你启动一个mongos实例时,在配置文件中或命令行中指定那2个config server的主机名。为了操作灵活,使用配置服务器的DNS名而不是IP地址。如果你没有使用可解析的主机名,在没有重启每个mongos和mongod实例时不能改变配置服务器名或IP地址。

启动一个mongos实例,命令行如下:

mongos --configdb <config server hostnames>

举个例子,启动一个mongos连接以下配置服务器:

192.168.155.224 mongodb1.example.net

192.168.155.225 mongodb2.example.net

192.168.155.226 mongodb3.example.net

将运行下面的命令:

mongos --configdb mongodb1.example.net:27019 mongodb2.example.net:27019 mongodb3.example.net:27019

3、向集群中添加分片

一个分片可以是一个单独的mongod或者是一个副本集。在生产环境中,每个分片应该是一个副本集。

(1)从mongo shell连接到mongos实例上。执行下面的命令:

mongo --host <hostname of machine running mongos> --port <port mongos listens on>

举个例子:

mongo --host mongos1.example.net --port 27017

(2)使用sh.addShard()命令将每个分片添加到集群中,如下面的例子所示。为每个分片单独的使用sh.addShard()命令。如果分片是一个副本集,则要指定副本集名并指定组的一个成员。

下面的例子使用了sh.addShard()命令添加一个分片:

通过一个运行在mongodb1.example.net上的27017端口的成员,将一个名为rs1的副本集分片添加到集群中,命令如下:

sh.addShard(“rs1/mongodb1.example.net:27017”)

版本2.0.3改变的。在这个版本之前,必须指定所有的副本集成员,如:

sh.addShard( "rs1/mongodb1.example.net:27017,mongodb2.example.net:27017,mongodb3.example.net:27017" )

添加一个运行在mongodb1.example.net服务器上的27017端口的,命令如下:

sh.addShard("mongodb1.example.net:27017")

4、开启一个数据库的分片功能

在对一个集合分片之前,你必须开启这个集合数据库的分片功能。开启这个功能并不会重新分配数据,但能使集合能够分片。

一旦你开启了一个数据库的分片功能,MongoDB会分配一个主片,使MongoDB在分片之前将所有的数据保存在这个数据库上。

在mongo shell中连接一个mongos实例,使用以下命令语法:

mongo --host <hostname of machine running mongos> --port <port mongos listens on>

执行sh.enableSharding()方法,指定想要开启分片功能的数据库的名字。使用下面的语法:

sh.enableSharding("<database>")

也可以使用enableSharding命令,语法如下:

db.runCommand( { enableSharding : <database> } )

开启一个collection的分片功能:

(1)决定使用什么作为片键。片键的选择会影响分片的性能。

(2)如果一个collection已经包含数据,则必须在片键的字段上使用ensureIndex()命令建立一个索引。如果collection是空的,则MongoDB将在sh.shardCollection()阶段建立一个索引。

(3)通过在mongo shell中执行sh.shardCollection()方法开启一个collection的分片功能。这个方法的使用语法如下:

db.shardCollection(“<database>.<collection>”, shard-key-pattern)

用你的数据库命名空间,由数据库名,一个点和collection的名字组成,替换<database>.<collection>字符串。Shard-key-pattern代表你的片键,你可以使用与一个索引相同的模式。

例子:

sh.shardCollection("records.people", { "zipcode": 1, "name": 1 } )

sh.shardCollection("people.addresses", { "state": 1, "_id": 1 } )

sh.shardCollection("assets.chairs", { "type": 1, "_id": 1 } )

db.alerts.ensureIndex( { _id : "hashed" } )

sh.shardCollection("events.alerts", { "_id": "hashed" } )

这些分片操作按顺序依次表示为:

数据库records 中的People集合使用了片键{ “zipcode” : 1, “name” : 1 }

这个片键通过字段zipcode的值进行数据分配。如果这个有大量相同的值,则会根据name字段的值对块进行分裂。

数据库people的addresses集合使用了片键{ “state” : 1, “_id” : 1 }

这个片键通过字段state的值进行数据分配。如果这个有大量相同的值,则会根据_id字段的值对块进行分裂。

数据库assets的chairs集合使用了片键{ “type” : 1, “_id” : 1 }

这个片键通过字段type的值进行数据分配。如果这个有大量相同的值,则会根据_id字段的值对块进行分裂。

数据库events的alerts集合使用了片键{ “_id” : “hashed” }

在版本2.4中最新出现的。

这个片键通过字段_id的散列值进行数据分配。MongoDB计算_id字段的散列值作为散列索引,它将提供集群中文档的均匀分布。

5、分片部署;

1. 启动mongod;

Server 192.168.155.224:

/App/mongo/bin/mongod --fork --shardsvr --port=10001 --dbpath=/data/shard1/ --logpath=/data/shard1/log.log --replSet shard1 --rest

/App/mongo/bin/mongod --fork --shardsvr --port=10002 --dbpath=/data/shard2/ --logpath=/data/shard2/log.log --replSet shard2 --rest

/App/mongo/bin/mongod --fork --shardsvr --port=10003 --dbpath=/data/shard3/ --logpath=/data/shard3/log.log --replSet shard3 --rest

Server 192.168.155.225:

/App/mongo/bin/mongod --fork --shardsvr --port=10001 --dbpath=/data/shard1/ --logpath=/data/shard1/log.log --replSet shard1 --rest

/App/mongo/bin/mongod --fork --shardsvr --port=10002 --dbpath=/data/shard2/ --logpath=/data/shard2/log.log --replSet shard2 --rest

/App/mongo/bin/mongod --fork --shardsvr --port=10003 --dbpath=/data/shard3/ --logpath=/data/shard3/log.log --replSet shard3 --rest

Server 192.168.155.223:

/App/mongo/bin/mongod --fork --shardsvr --port=10001 --dbpath=/data/shard1/ --logpath=/data/shard1/log.log --replSet shard1 --rest

/App/mongo/bin/mongod --fork --shardsvr --port=10002 --dbpath=/data/shard2/ --logpath=/data/shard2/log.log --replSet shard2 --rest

/App/mongo/bin/mongod --fork --shardsvr --port=10003 --dbpath=/data/shard3/ --logpath=/data/shard3/log.log --replSet shard3 --rest

Server 192.168.155.226:

2. 启动config Server

Server 192.168.155.224:

/App/mongo/bin/mongod --fork --configsvr --port=20001 --dbpath=/data/config1/ --logpath=/data/config1/log.log --rest

Server 192.168.155.225:

/App/mongo/bin/mongod --fork --configsvr --port=20002 --dbpath=/data/config1/ --logpath=/data/config1/log.log --rest

Server 192.168.155.223:

/App/mongo/bin/mongod --fork --configsvr --port=20003 --dbpath=/data/config1/ --logpath=/data/config1/log.log --rest

3. 启动mongos

这里为了方便的看到分片过程,将chunkSize设置为1,也就是每个块大小为1MB;

192.168.155.226:

/App/mongo/bin/mongos --fork --port=30001 --logpath=/data/route1/log.log --chunkSize=1 --configdb=192.168.155.224:20001,192.168.155.225:20002,192.168.155.223:20003

/App/mongo/bin/mongos --fork --port=30002 --logpath=/data/route2/log.log --chunkSize=1 --configdb=192.168.155.224:20001,192.168.155.225:20002,192.168.155.223:20003

/App/mongo/bin/mongos --fork --port=30003 --logpath=/data/route3/log.log --chunkSize=1 --configdb=192.168.155.224:20001,192.168.155.225:20002,192.168.155.223:20003

4. 在mongod上配置副本集

先连接到某个副本集的成员上,然后初始化副本集配置:

连接到192.168.155.224:10001上初始化副本集shard1:

#/App/mongo/bin/mongo 192.168.155.224:10001/admin

>config={_id:'shard1', members:[{_id:0, host:'192.168.155.224:10001'},{_id:1, host:'192.168.155.225:10001'},{_id:0, host:'192.168.155.223:10001'}]}

>rs.initiate(config)

连接到192.168.155.225:10002上初始化副本集shard2:

#/App/mongo/bin/mongo 192.168.155.225:10002/admin

>config={_id:'shard2', members:[{_id:0, host:'192.168.155.224:10002'}, {_id:1, host:'192.168.155.225:10002'},{_id:0, host:'192.168.155.223:10002'}, ]}

>rs.initiate(config)

连接到192.168.155.223:10002上初始化副本集shard3:

#/App/mongo/bin/mongo 192.168.155.225:10003/admin

>config={_id:'shard3', members:[{_id:0, host:'192.168.155.224:10003'}, {_id:1, host:'192.168.155.225:10003'},{_id:0, host:'192.168.155.223:10003'}, ]}

>rs.initiate(config)

可以通过rs.status()命令查看副本集配置结果;

5. 向集群添加副本集分片

先通过mongo shell连接到mongos实例:

# /App/mongo/bin/mongo 192.168.155.226:30001/admin

> db.runCommand({addshard:"shard1/192.168.155.224:10001", name:"ShardSet1"})

> db.runCommand({addshard:"shard2/192.168.155.225:10002", name:"ShardSet2"})

> db.runCommand({addshard:"shard3/192.168.155.223:10003", name:"ShardSet3"})

通过db.runCommand({listshards: 1})查看分片集群的信息:

6. 开启数据库的分片功能

> sh.enableSharding("page_db")

7. 开启数据库中users集合的分片功能,并指定_id的散列值组作为片键

sh.shardCollection("page_db.users", {_id : "hashed"})

七、 总结

副本集大量应用在生产环节下,可以给MongoDB提供冗余,虽然能够自动故障切换,但从应用角度上来说还是需要额外的逻辑的。

分片功能在少数据量时没有必要,只是增加了架构的复杂性。但如果数据量大,访问量大的情况下,分片还是很有必要的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: