一、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(); #删除索引