MongoDB集群配置

一、mongodb分布式应用原理

MongoDB集群包括一定数量的mongod(分片存储数据)、mongos(路由处理)、config server(配置节点)、clients(客户端)、arbiter(仲裁节点:为了选举某个分片存储数据节点那台为主节点)。


1、shards:一个shard为一组mongod,通常一组为两台,主从或互为主从,这一组mongod中的数据时相同的,具体可见《mongodb分布式之数据复制》。数据分割按有序分割方式,每个分片上的数据为某一范围的数据块,故可支持指定分片的范围查询,这同google的BigTable 类似。数据块有指定的最大容量,一旦某个数据块的容量增长到最大容量时,这个数据块会切分成为两块;当分片的数据过多时,数据块将被迁移到系统的其他分片中。另外,新的分片加入时,数据块也会迁移。 

2、mongos:可以有多个,相当于一个控制中心,负责路由和协调操作,使得集群像一个整体的系统。mongos可以运行在任何一台服务器上,有些选择放在shards服务器上,也有放在client 服务器上的。mongos启动时需要从config servers上获取基本信息,然后接受client端的请求,路由到shards服务器上,然后整理返回的结果发回给client服务器。

3、config server:存储集群的信息,包括分片和块数据信息。主要存储块数据信息,每个config server上都有一份所有块数据信息的拷贝,以保证每台config server上的数据的一致性。

4、shard key:为了分割数据集,需要制定分片key的格式,类似于用于索引的key格式,通常由一个或多个字段组成以分发数据,比如: 

{ name : 1 } 

{ _id : 1 } 

{ lastname : 1, firstname : 1 } 

{ tag : 1, timestamp : -1 }  

mongoDB的分片为有序存储(1为升序,-1为降序),shard key相邻的数据通常会存在同一台服务(数据块)上。 

二、mongodb集群配置步骤

我配置的集群是测试用的,没有复制。只是简单的分片存储数据进行测试。配置完成后的结构图如下:

用到了两个节点sg201 和sg202,两台都为64位的。

sg201上配置了shard11和config

sg202上配置了shard21和mongos

1.软件下载:从官网上下载http://www.mongodb.org/

2.在两台节点上分别配置shard11和sard21

在sg201上执行:

mkdir -p /data/shard11
mkdir -p /data/logs
bin/mongod -shardsvr -port 27017 -dbpath=/data/shard11/  -logpath=/data/logs/shard11.log --fork

在sg202上执行:

mkdir -p /data/shard21
mkdir -p /data/logs
bin/mongod -shardsvr -port 27017 -dbpath=/data/shard21/ -logpath=/data/logs/shard21.log --fork

3.在sg201上配置conf

[root@sg201 mongodb]# bin/mongod -configsvr -dbpath=/data/config -port 20000 -logpath=/data/logs/config.log --fork
about to fork child process, waiting until server is ready for connections.
forked process: 8563
all output going to: /data/logs/config.log
child process started successfully, parent exiting

4.在sg202上配置mongos

[root@sg202 mongodb]# bin/mongos -configdb 172.16.48.201:20000 -port 30000 -chunkSize 512 -logpath=/data/logs/mongos.log --fork
Wed Mar 27 09:13:14.174 warning: running with 1 config server should be done only for testing purposes and is not recommended for production
about to fork child process, waiting until server is ready for connections.
forked process: 5464
all output going to: /data/logs/mongos.log
child process started successfully, parent exiting

注:这里的172.16.48.201:2000  为你启动conf那台机器的ip和port

5.把分片加入集群,让mongos进程知道哪些机器是需要加入分片的

[root@sg201 mongodb]# bin/mongo 172.16.48.202:30000/admin
MongoDB shell version: 2.4.1
connecting to: 172.16.48.202:30000/admin
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
	http://docs.mongodb.org/
Questions? Try the support group
	http://groups.google.com/group/mongodb-user
mongos> db.runCommand({"addshard":"172.16.48.201:27017"})
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> db.runCommand({"addshard":"172.16.48.202:27017"})
{ "shardAdded" : "shard0001", "ok" : 1 }

6.制定分片规则

mongos> db.runCommand({"shardcollection":"dbname.tablename","key":{"primaryKey":1}})
{ "ok" : 0, "errmsg" : "sharding not enabled for db" }


7.激活分片设置

mongos> db.runCommand({"enablesharding":"ndmongo"})
{ "ok" : 1 }

OK到这里已经成功配置了分片。
8.测试集群

mongos> db.printShardingStatus()
--- Sharding Status --- 
  sharding version: {
	"_id" : 1,
	"version" : 3,
	"minCompatibleVersion" : 3,
	"currentVersion" : 4,
	"clusterId" : ObjectId("515247aa0fda6a76801fc33b")
}
  shards:
	{  "_id" : "shard0000",  "host" : "172.16.48.201:27017" }
	{  "_id" : "shard0001",  "host" : "172.16.48.202:27017" }
  databases:
	{  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
	{  "_id" : "dbname",  "partitioned" : false,  "primary" : "shard0000" }
	{  "_id" : "ndmongo",  "partitioned" : true,  "primary" : "shard0000" }
db.runCommand({enablesharding:'test'}) 
printShardingStatus() 
db.runCommand({shardcollection:'test.auto_increment_id', key:{_id:1}, unique : true}) 
db.runCommand({shardcollection:'test.c1', key:{_id:1}, unique : true}) 
for (var i = 1; i <= 100; i++)db.c1.save({id:i,value1:"1234567890",value2:"1234567890",value3:"1234567890",value4:"1234567890"}) 
db.c1.stats() 
db.createCollection("cap_coll", {capped:true, size:100000, max:100}); 
db.mycoll.validate(); 

9.管理

show dbs
use admin
show collections
db.serverStatus()
db.shutdownServer()
exit;


10.索引

db.product_data.ensureIndex({data_id: 1}, {unique: true,dropDups: true}); #创建索引
db.product_data.dropIndexes();  #删除索引


 

你可能感兴趣的:(MongoDB集群配置)