一分钟搭建mongodb架构Replica Set&Sharding—ttlsa教程系列之mongodb(七)

在测试试验阶段,我们需要有一个模拟的测试环境来测试应用程序和系统架构各个方面的功能,是否符合需求。在我公司,我常常使用下面的方法来为开发人员搭建mongodb的复制集和分片架构进行测试。我也常用这个方法来模拟线上架构,测试相关内容。
开启一个MongoDB shell,不连接任何mongod

?
1
# ./mongo --nodb

创建复制集,一个primary两个secondary

?
1
> replicaSet = new ReplSetTest({ "nodes" : 3 })

启动三个mongod实例

?
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
55
56
57
58
59
60
61
62
63
64
> replicaS et.startSet()
ReplSetTest Starting Set
ReplSetTest n is : 0
ReplSetTest n: 0 ports: [ 31000 , 31001 , 31002 ] 31000 number
{
"useHostName" : true ,
"oplogSize" : 40 ,
"keyFile" : undefined ,
"port" : 31000 ,
"noprealloc" : "" ,
"smallfiles" : "" ,
"rest" : "" ,
"replSet" : "testReplSet" ,
"dbpath" : "$set-$node" ,
"restart" : undefined ,
"pathOpts" : {
"node" : 0 ,
"set" : "testReplSet"
}
}
ReplSetTest Starting....
Resetting db path '/data/db/testReplSet-0'
ReplSetTest n is : 1
ReplSetTest n: 1 ports: [ 31000 , 31001 , 31002 ] 31001 number
{
"useHostName" : true ,
"oplogSize" : 40 ,
"keyFile" : undefined ,
"port" : 31001 ,
"noprealloc" : "" ,
"smallfiles" : "" ,
"rest" : "" ,
"replSet" : "testReplSet" ,
"dbpath" : "$set-$node" ,
"restart" : undefined ,
"pathOpts" : {
"node" : 1 ,
"set" : "testReplSet"
}
}
ReplSetTest Starting....
Resetting db path '/data/db/testReplSet-1'
ReplSetTest n is : 2
ReplSetTest n: 2 ports: [ 31000 , 31001 , 31002 ] 31002 number
{
"useHostName" : true ,
"oplogSize" : 40 ,
"keyFile" : undefined ,
"port" : 31002 ,
"noprealloc" : "" ,
"smallfiles" : "" ,
"rest" : "" ,
"replSet" : "testReplSet" ,
"dbpath" : "$set-$node" ,
"restart" : undefined ,
"pathOpts" : {
"node" : 2 ,
"set" : "testReplSet"
}
}
ReplSetTest Starting....
Resetting db path '/data/db/testReplSet-2'

复制集初始化

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
> replicaSet.initiate()
{
"replSetInitiate" : {
"_id" : "testReplSet" ,
"members" : [
{
"_id" : 0 ,
"host" : "nd0302012029:31000"
},
{
"_id" : 1 ,
"host" : "nd0302012029:31001"
},
{
"_id" : 2 ,
"host" : "nd0302012029:31002"
}
]
}
}

启动了三个实例,分别监听在31000,31001,31002端口上

当前MongoDB shell窗口会有大量的日志信息输出,影响操作,另开启一个MongoDB shell

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# ./mongo --nodb
> conn1 = new Mongo( "localhost:31000" )
> primaryDB = conn1.getDB( "test" )   //testReplSet是默认的复制集测试名
test
> primaryDB.isMaster()
{
"setName" : "testReplSet" ,
"ismaster" : true ,
"secondary" : false ,
"hosts" : [
"nd0302012029:31000" ,
"nd0302012029:31002" ,
"nd0302012029:31001"
],
"primary" : "nd0302012029:31000" ,
"me" : "nd0302012029:31000" ,
"maxBsonObjectSize" : 16777216 ,
"maxMessageSizeBytes" : 48000000 ,
"localTime" : ISODate( "2013-07-28T04:23:49.866Z" ),
"ok" : 1
}

插入1000条文档

?
1
2
3
> for (i= 0 ; i<<>1000; i++) { primaryDB.coll.insert({count: i}) }
> primaryDB.coll.count()
1000

创建第二个连接,连接到secondary

?
1
2
3
4
5
6
> conn2 = new Mongo( "localhost:31001" )
connection to localhost: 31001
> secondaryDB = conn2.getDB( "test" )
test
> secondaryDB.coll.find()   //默认情况下secondary不可读不可写
error: { "$err" : "not master and slaveOk=false" , "code" : 13435 }

允许secondary可读

?

尝试想secondary写数据

?
1
2
3
4
5
6
7
8
9
10
> secondaryDB.coll.insert({ "count" : 1001 })
> secondaryDB.runCommand({ "getLastError" : 1 })
{
"err" : "not master" ,
"code" : 10058 ,
"n" : 0 ,
"lastOp" : Timestamp( 0 , 0 ),
"connectionId" : 75 ,
"ok" : 1
}

可看到secondary不接收客户端写操作

测试复制集的automatic failover功能:
shutdown 31000实例


查看哪个实例变成primary


可见31002实例变成新的master


关闭replica set


sharding简易搭建方法参见: http://www.ttlsa.com/html/1787.html

转载请注明出处:一分钟搭建mongodb架构Replica Set&Sharding