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(我们只有一个的说):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 连接先前配置的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
插入数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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
切换数据库
列出collection详情
db.printCollectionStats()
删除Collection
创建索引
db.doc.ensureIndex({id:1}, {unique:true, dropDups:true})
更多DB级别的可以参考:http://www.mongodb.org/display/DOCS/DBA+Operations+from+the+Shell