本节演示在1台服务器上部署3节点的Replica Sets,配置信息如下表所示。
配置信息 | SERVER-1 | SERVER-2 | SERVER-3 |
---|---|---|---|
数据文件存储路径 | /data/data/r0 | /data/data/r1 | /data/data/r2 |
日志文件存储路径 | /data/log/r0.log | /data/log/r1.log | /data/log/r2.log |
复制集key文件 | /data/key/r0 | /data/key/r1 | /data/key/r2 |
示例监听端口 | 28010 | 28011 | 28012 |
如下面的代码所示:
[root@localhost~]#mkdir-p/data/data/r0 [root@localhost~]#mkdir-p/data/data/r1 [root@localhost~]#mkdir-p/data/data/r2
以上代码创建3个目录,其中SERVER-1使用"/data/data/r0"目录存储数据文件,SERVER-2使用"/data/data/r1"目录存储数据文件,SERVER-3使用"/data/data/r2"目录存储数据文件,具体如表11-1中“数据文件存储路径”部分所示。
如下面的代码所示:
[root@localhost~]#mkdir-p/data/log
在本例中,创建"/data/log"目录用于存储3个节点的系统日志文件,具体如表11-1中“日志文件存储路径”部分所示。
key文件用于标识同一复制集的私钥,如果3个节点的key文件内容不一致,复制集将不能正常使用。如下面的代码所示:
[root@localhost~]#mkdir-p/data/key [root@localhost~]#echo"this is rs1 super secret key">/data/key/r0 [root@localhost~]#echo"this is rs1 super secret key">/data/key/r1 [root@localhost~]#echo"this is rs1 super secret key">/data/key/r2 [root@localhost~]#chmod 600/data/key/r*
以上代码创建3个文件用于存储复制集的key信息,其中SERVER-1使用"/data/key/r0" key文件,SERVER-2使用"/data/key/r1" key文件,SERVER-3使用"/data/key/r2" key文件,具体如表11-1中“复制集key文件”部分所示。
如下面的代码所示:
[root@localhost~]#/Apps/mongo/bin/mongod--replSet rs1--keyFile /data/key/r0--fork--port 28010--dbpath/data/data/r0-- logpath=/data/log/r0.log--logappend all output going to:/data/log/r0.log forked process:6573 [root@localhost~]#/Apps/mongo/bin/mongod--replSet rs1--keyFile /data/key/r1--fork--port 28011--dbpath/data/data/r1-- logpath=/data/log/r1.log--logappend all output going to:/data/log/r1.log forked process:6580 [root@localhost~]#/Apps/mongo/bin/mongod--replSet rs1--keyFile /data/key/r2--fork--port 28012--dbpath/data/data/r2-- logpath=/data/log/r2.log--logappend all output going to:/data/log/r2.log forked process:6585 [root@localhost~]#
在本例中,启动3个MongoDB实例来模拟3个节点,通过执行以下命令来启动MongoDB实例,模拟SERVER-1节点:
/Apps/mongo/bin/mongod--replSet rs1--keyFile/data/key/r0--fork--port 28010--dbpath/data/data/r0--logpath=/data/log/r0.log--logappend
另外两个节点的配置与SERVER-1类似。
如下面的代码所示:
[root@localhost bin]#/Apps/mongo/bin/mongo-port 28010 MongoDB shell version:1.8.1 connecting to:127.0.0.1:28010/test >config_rs1={_id:'rs1',members:[ ...{_id:0,host:'localhost:28010'}, ...{_id:1,host:'localhost:28011'}, ...{_id:2,host:'localhost:28012'}] ... } >rs.initiate(config_rs1); { "info":"Config now saved locally.Should come online in about a minute.", "ok":1 }
在本例中,首先通过执行"/Apps/mongo/bin/mongo-port 28010"命令连接到SERVER-1实例;然后通过执行"config_rs1={_id:'rs1',members:……}"命令来命名Replica Sets配置的名字,指定Replica Sets 3个节点的信息。其中,参数"id"指明Replica Sets的名字,本例的值是"rs1"。接下来通过执行"rs.initiate(config_rs1)"命令启动Replica Sets,其中参数"config_rs1"就是Replica Sets配置的名字。
配置Replica Sets时需要注意priority(优先级)的概念。当priority=0时,说明这个实例永远不可能被设置成primary。也就是说,它只能作为一个slave而存在,即使在主库当机的情况下,它也不能被选为主库。这种方式其实与最原始的Master-Slave方式是一致的。例如下面的配置中,将28010和28012这两个端口的实例优先级调成0,系统就只能选28011作为主库,如下面的代码所示(加粗部分):
config_rs1={_id:'rs1',members:[ {_id:0,host:'localhost:28010',priority:0}, {_id:1,host:'localhost:28011'}, {_id:2,host:'localhost:28012',priority:0}] }这样的设置在某些场景中还是非常有实际应用价值的。
复制集启动后,可以通过查看复制集状态,分析复制集的各项运行指标。如下面的代码所示:
>rs.status() { "set":"rs1", "date":ISODate("2012-05-31T09:49:57Z"), "myState":1, "members":[ { "_id":0, "name":"localhost:28010", "health":1, //1表明状态正常;0表明状态异常 "state":1, //1表明是primary;2表明是slave "stateStr":"PRIMARY",//表明此机器是主库 "optime":{ "t":1338457763000, "i":1 }, "optimeDate":ISODate("2012-05-31T09:49:23Z"), "self":true }, { "_id":1, "name":"localhost:28011", "health":1, "state":2, "stateStr":"SECONDARY", "uptime":23, "optime":{ "t":1338457763000, "i":1 }, "optimeDate":ISODate("2012-05-31T09:49:23Z"), "lastHeartbeat":ISODate("2012-05-31T09:49:56Z") }, { "_id":2, "name":"localhost:28012", "health":1, "state":2, "stateStr":"SECONDARY", "uptime":23, "optime":{ "t":1338457763000, "i":1 }, "optimeDate":ISODate("2012-05-31T09:49:23Z"), "lastHeartbeat":ISODate("2012-05-31T09:49:56Z") } ], "ok":1 } rs1:PRIMARY>
在本例中,通过执行"rs.status"命令可以查看复制集中各成员节点的状态。其中,字段"health"是实例正常与否的标记,“1”代表状态正常,“0”代表状态异常;字段"state"用于表明实例在复制集中充当的角色,“1”代表primary,“0”代表slave;字段"stateStr"进一步用文字描述了此实例在复制集中的角色,本例中的值是"PRIMARY"。
除了用"rs.status"命令可以查看复制集中各成员节点的状态之外,还可以用"isMaster"命令查看Replica Sets状态,如下面的代码所示:
rs1:PRIMARY>rs.isMaster() { "setName":"rs1", "ismaster":true, "secondary":false, "hosts":[ "localhost:28010", "localhost:28012", "localhost:28011" ], "maxBsonObjectSize":16777216, "ok":1 } rs1:PRIMARY>