Mongod DB中有Sharding(分片)和Replication(副本)两个功能。
前者主要是将数据水平分割到各个结点上,达到负载均衡的目的。
后者用于故障恢复。即一般一个Sharding有若干个Replication。
本文只讨论Sharding的情况,因为我们的环境机器本来就不够,不会拿来做Replication的。
配置Sharding有如下三个要素:
1、1~1000个Sharding。
2、1~3个mongo config服务器。
3、1~n个mongo routing服务器。
下面讨论配置
环境,我们用两个机器A和B,配置两个Shards。
1、下载
wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.5.tgz tar -xzvf ./mongodb-linux-x86_64-2.0.5.tgz
2、执行mongod
在两个机器上分别启动mongod,如下:
#创建数据文件夹 mkdir data #启动, 后台服务模式, pid文件记录, 日志记录, 数据./data0 ./bin/mongod --fork --logpath=`pwd`/mongod.log --pidfilepath=`pwd`/mongod.pid --shardsvr --dbpath=`pwd`/data/ #杀死进程,要用信号2! kill -2 `cat ./mongod.pid`
至此,A、B机器上启动了两个mongod进程,端口为27018
3、启动一个mongod config server
测试环境可以只有一个config server,线上环境建议有3个。我们就用第一台机器吧。
# 创建config的数据目录 mkdir config_data # 启动mongod config进程 ./bin/mongod --fork --logpath=`pwd`/mongoc.log --pidfilepath=`pwd`/mongoc.pid --dbpath=`pwd`/config_data --configsvr
至此,A机器上启动了mongod(config)进程,端口27019
4、启动一个mongos Router
mongos的--configdb参数如下:
--configdb arg 1 or 3 comma separated config servers
要指定上面mongod(config)进程,由于我们只有1个,写一个就好。
#启动mongos ./bin/mongos --fork --pidfilepath=`pwd`/mongos.pid --logpath=`pwd`/mongos.log --configdb=172.22.0.12:27019 --port 11000
5、配置Shard
刚才我们只是将各自部分启动起来,现在需要在中央控制中,将Shards对应到具体的mongod。
首先连接任意一个mongos(我们只有一个的说):
# 连接先前配置的mongos ./bin/mongo AA.AA.AA.AA:11000/admin # 先选择admin数据库 MongoDB shell version: 2.0.5 connecting to: 172.22.0.12:11000/admin mongos> db admin mongos> # 将A B C的mongod进程分别添加一次Shard mongos> db.runCommand( { addshard : "A.A.A.A:13000]", name:"shard_A" } ); { "shardAdded" : "shard0000", "ok" : 1 } mongos> db.runCommand( { addshard : "B.B.B.B:13000]", name:"shard_B" } ); { "shardAdded" : "shard0000", "ok" : 1 } mongos> db.runCommand( { addshard : "C.C.C.C:13000]", name:"shard_C" } ); { "shardAdded" : "shard0000", "ok" : 1 } # 列出、验证Shards mongos> db.runCommand( { listshards : 1 } ); { "shards" : [ { "_id" : "shard0000", "host" : "172.22.0.12:13000" }, { "_id" : "shard0001", "host" : "172.22.0.16:13000" } ], "ok" : 1 }
6、启用Shards
必须在对应的DB/Coll上启用Shards,数据负载均衡才能生效!否则,只会存在一个Shards上!
注意在Colleciton启用Shards时候,还需要一个key做为划分依据。
关于划分key的选择:
1、最好是在插入中能包含的字段(否则会把插入发配到每个Shard上,速度很慢)。
2、尽量随机化。
# 给db启用Shards mongos> db.runCommand( { enablesharding : "test" } ); { "ok" : 1 } # 给Coll启用Shards, 注意需要一个key做为划分依据 mongos> db.runCommand({shardcollection:"test.people", key: {name:1}, unique : true }) { "collectionsharded" : "test.people", "ok" : 1 }
7、创建DB、Coll
我们创建db:db
再创建一个Coll: people
由于都是lazy-make,所以我们直接创建数据即可
# Create testdb ./bin/mongo 172.22.0.12:11000/db MongoDB shell version: 2.0.5 connecting to: 172.22.0.12:11000/db mongos> db db
插入数据
mongos> for (var i = 1; i <= 200000; i++) db.people.save({name:"fly_people",sex:"female",age:25}); mongos> for (var i = 1; i <= 20000000; i++) db.people.save({name:"houxuefeng",sex:"male",age:30}); mongos> db.people.stats() { "sharded" : true, "ns" : "test.people", "count" : 462008, "size" : 33264600, "avgObjSize" : 72.00005194715243, "storageSize" : 902522624, "nindexes" : 2, "nchunks" : 4, "shards" : { "shard0000" : { "ns" : "test.people", "count" : 402006, "size" : 28944448, "avgObjSize" : 72.00003980040098, "storageSize" : 891340544, "numExtents" : 22, "nindexes" : 2, "lastExtentSize" : 155079936, "paddingFactor" : 1, "flags" : 1, "totalIndexSize" : 58966016, "indexSizes" : { "_id_" : 18694144, "name_1" : 40271872 }, "ok" : 1 }, "shard0001" : { "ns" : "test.people", "count" : 60002, "size" : 4320152, "avgObjSize" : 72.00013332888904, "storageSize" : 11182080, "numExtents" : 6, "nindexes" : 2, "lastExtentSize" : 8388608, "paddingFactor" : 1, "flags" : 1, "totalIndexSize" : 5275648, "indexSizes" : { "_id_" : 2498560, "name_1" : 2777088 }, "ok" : 1 } }, "ok" : 1 }
备注:数据到达一定规模才会开始进行负载均衡!
参考文章1:《MongoDB auto shard配置说明》
参考文章2:《Configuring Sharding》
8、其他命令:
列出db
mongos> show dbs config 0.1875GB
列出collection
show collections
切换数据库
use dbname
列出collection详情
db.printCollectionStats()
删除Collection
db.foo.drop()
创建索引
db.doc.ensureIndex({id:1}, {unique:true, dropDups:true})
更多DB级别的可以参考:http://www.mongodb.org/display/DOCS/DBA+Operations+from+the+Shell
您好,您的文章里说mongodb数据库负载均衡,当数据量到一定规模才会进行负载均衡,请问这个数据量是多大啊?哪里有限制?在mongdb里怎么配置啊
谢谢