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、下载
1
2
|
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,如下:
1
2
3
4
5
6
7
8
|
#创建数据文件夹
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个。我们就用第一台机器吧。
1
2
3
4
5
|
# 创建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参数如下:
1
|
--
configdb
arg
1
or
3
comma
separated
config
servers
|
要指定上面mongod(config)进程,由于我们只有1个,写一个就好。
1
2
|
#启动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、尽量随机化。
1
2
3
4
5
6
7
|
# 给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,所以我们直接创建数据即可
1
2
3
4
5
6
|
# 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
1
2
|
mongos
>
show
dbs
config
0.1875GB
|
列出collection
1
|
show
collections
|
切换数据库
1
|
use
dbname
|
列出collection详情
1
|
db
.
printCollectionStats
(
)
|
删除Collection
1
|
db
.
foo
.
drop
(
)
|
创建索引
1
|
db
.
doc
.
ensureIndex
(
{
id
:
1
}
,
{
unique
:
true
,
dropDups
:
true
}
)
|
更多DB级别的可以参考:http://www.mongodb.org/display/DOCS/DBA+Operations+from+the+Shell