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 <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 sh