mongodb分布式集群部署,集群分片策略
由于项目需要,要部署一个副本集的分片集群,有三个服务器用来部署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 --port --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
举个例子,启动一个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 --port
举个例子:
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 --port
执行sh.enableSharding()方法,指定想要开启分片功能的数据库的名字。使用下面的语法:
sh.enableSharding("")
也可以使用enableSharding命令,语法如下:
db.runCommand( { enableSharding : } )
开启一个collection的分片功能:
(1)决定使用什么作为片键。片键的选择会影响分片的性能。
(2)如果一个collection已经包含数据,则必须在片键的字段上使用ensureIndex()命令建立一个索引。如果collection是空的,则MongoDB将在sh.shardCollection()阶段建立一个索引。
(3)通过在mongo shell中执行sh.shardCollection()方法开启一个collection的分片功能。这个方法的使用语法如下:
db.shardCollection(“.”, shard-key-pattern)
用你的数据库命名空间,由数据库名,一个点和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" }