MongoDB部署Replica Sets

本节演示在1台服务器上部署3节点的副本集,配置信息如下表所示。

本节演示在1台服务器上部署3节点的Replica Sets,配置信息如下表所示。

配置信息SERVER-1SERVER-2SERVER-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
示例监听端口280102801128012

分别创建3个节点各自的数据文件存储路径。

如下面的代码所示:

 
  1. [root@localhost~]#mkdir-p/data/data/r0
  2. [root@localhost~]#mkdir-p/data/data/r1
  3. [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中“数据文件存储路径”部分所示。


创建日志文件存储路径。

如下面的代码所示:

 
  1. [root@localhost~]#mkdir-p/data/log

在本例中,创建"/data/log"目录用于存储3个节点的系统日志文件,具体如表11-1中“日志文件存储路径”部分所示。


创建复制集key文件存储路径。

key文件用于标识同一复制集的私钥,如果3个节点的key文件内容不一致,复制集将不能正常使用。如下面的代码所示:

 
  1. [root@localhost~]#mkdir-p/data/key
  2. [root@localhost~]#echo"this is rs1 super secret key">/data/key/r0
  3. [root@localhost~]#echo"this is rs1 super secret key">/data/key/r1
  4. [root@localhost~]#echo"this is rs1 super secret key">/data/key/r2
  5. [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文件”部分所示。


启动3个MongoDB实例来模拟3个节点。

如下面的代码所示:

 
  1. [root@localhost~]#/Apps/mongo/bin/mongod--replSet rs1--keyFile
  2. /data/key/r0--fork--port 28010--dbpath/data/data/r0--
  3. logpath=/data/log/r0.log--logappend
  4. all output going to:/data/log/r0.log
  5. forked process:6573
  6. [root@localhost~]#/Apps/mongo/bin/mongod--replSet rs1--keyFile
  7. /data/key/r1--fork--port 28011--dbpath/data/data/r1--
  8. logpath=/data/log/r1.log--logappend
  9. all output going to:/data/log/r1.log
  10. forked process:6580
  11. [root@localhost~]#/Apps/mongo/bin/mongod--replSet rs1--keyFile
  12. /data/key/r2--fork--port 28012--dbpath/data/data/r2--
  13. logpath=/data/log/r2.log--logappend
  14. all output going to:/data/log/r2.log
  15. forked process:6585
  16. [root@localhost~]#

在本例中,启动3个MongoDB实例来模拟3个节点,通过执行以下命令来启动MongoDB实例,模拟SERVER-1节点:

 
  1. /Apps/mongo/bin/mongod--replSet rs1--keyFile/data/key/r0--fork--port
  2. 28010--dbpath/data/data/r0--logpath=/data/log/r0.log--logappend
参数说明:
  • replSet:指明复制集的名称。本例的取值是"rs1",其他的节点也必须起这个名字才能保证3个节点间的连通性。
  • keyFile:复制集key文件的路径,对于本例它的取值是"/data/key/r0",其他的节点也必须起这个名字才能保证3个节点间的连通性。
  • fork:将命令放在后台执行。
  • port:MongoDB的监听端口,用于接收客户端请求。
  • dbpath:数据文件存储路径。
  • logpath:系统日志文件存放的位置。
  • logappend:明确指明日志的写入模式是追加,而非覆盖方式。

另外两个节点的配置与SERVER-1类似。


配置节点信息,并初始化Replica Sets环境。

如下面的代码所示:

 
  1. [root@localhost bin]#/Apps/mongo/bin/mongo-port 28010
  2. MongoDB shell version:1.8.1
  3. connecting to:127.0.0.1:28010/test
  4. >config_rs1={_id:'rs1',members:[
  5. ...{_id:0,host:'localhost:28010'},
  6. ...{_id:1,host:'localhost:28011'},
  7. ...{_id:2,host:'localhost:28012'}]
  8. ...
  9. }
  10. >rs.initiate(config_rs1);
  11. {
  12. "info":"Config now saved locally.Should come online in about a minute.",
  13. "ok":1
  14. }

在本例中,首先通过执行"/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作为主库,如下面的代码所示(加粗部分):

 
  1. config_rs1={_id:'rs1',members:[
  2. {_id:0,host:'localhost:28010',priority:0},
  3. {_id:1,host:'localhost:28011'},
  4. {_id:2,host:'localhost:28012',priority:0}]
  5. }

这样的设置在某些场景中还是非常有实际应用价值的。


启动复制集

复制集启动后,可以通过查看复制集状态,分析复制集的各项运行指标。如下面的代码所示:

 
  1. >rs.status()
  2. {
  3. "set":"rs1",
  4. "date":ISODate("2012-05-31T09:49:57Z"),
  5. "myState":1,
  6. "members":[
  7. {
  8. "_id":0,
  9. "name":"localhost:28010",
  10. "health":1,
  11. //1表明状态正常;0表明状态异常
  12. "state":1,
  13. //1表明是primary;2表明是slave
  14. "stateStr":"PRIMARY",//表明此机器是主库
  15. "optime":{
  16. "t":1338457763000,
  17. "i":1
  18. },
  19. "optimeDate":ISODate("2012-05-31T09:49:23Z"),
  20. "self":true
  21. },
  22. {
  23. "_id":1,
  24. "name":"localhost:28011",
  25. "health":1,
  26. "state":2,
  27. "stateStr":"SECONDARY",
  28. "uptime":23,
  29. "optime":{
  30. "t":1338457763000,
  31. "i":1
  32. },
  33. "optimeDate":ISODate("2012-05-31T09:49:23Z"),
  34. "lastHeartbeat":ISODate("2012-05-31T09:49:56Z")
  35. },
  36. {
  37. "_id":2,
  38. "name":"localhost:28012",
  39. "health":1,
  40. "state":2,
  41. "stateStr":"SECONDARY",
  42. "uptime":23,
  43. "optime":{
  44. "t":1338457763000,
  45. "i":1
  46. },
  47. "optimeDate":ISODate("2012-05-31T09:49:23Z"),
  48. "lastHeartbeat":ISODate("2012-05-31T09:49:56Z")
  49. }
  50. ],
  51. "ok":1
  52. }
  53. rs1:PRIMARY>

在本例中,通过执行"rs.status"命令可以查看复制集中各成员节点的状态。其中,字段"health"是实例正常与否的标记,“1”代表状态正常,“0”代表状态异常;字段"state"用于表明实例在复制集中充当的角色,“1”代表primary,“0”代表slave;字段"stateStr"进一步用文字描述了此实例在复制集中的角色,本例中的值是"PRIMARY"。

除了用"rs.status"命令可以查看复制集中各成员节点的状态之外,还可以用"isMaster"命令查看Replica Sets状态,如下面的代码所示:

 
  1. rs1:PRIMARY>rs.isMaster()
  2. {
  3. "setName":"rs1",
  4. "ismaster":true,
  5. "secondary":false,
  6. "hosts":[
  7. "localhost:28010",
  8. "localhost:28012",
  9. "localhost:28011"
  10. ],
  11. "maxBsonObjectSize":16777216,
  12. "ok":1
  13. }
  14. rs1:PRIMARY>
字段说明:
setName:指明复制集的名称,本例中的取值是"rs1"。ismaster:指明当前连接的实例是否是primary角色。它是一个布尔类型:"true"说明此实例是primary角色,"false"说明此实例不是primary角色。secondary:指明当前连接的实例是否是slave角色。它是一个布尔类型:"true"说明此实例是slave角色,"false"说明此实例不是slave角色。hosts:指明Replica Sets各成员IP及端口信息。ok:表明复制集的状态。“1”说明状态正常,“0”说明状态异常。

setName:指明复制集的名称,本例中的取值是"rs1"。ismaster:指明当前连接的实例是否是primary角色。它是一个布尔类型:"true"说明此实例是primary角色,"false"说明此实例不是primary角色。secondary:指明当前连接的实例是否是slave角色。它是一个布尔类型:"true"说明此实例是slave角色,"false"说明此实例不是slave角色。hosts:指明Replica Sets各成员IP及端口信息。ok:表明复制集的状态。“1”说明状态正常,“0”说明状态异常。

本文选自mongodb官网:http://www.mongodb.org.cn/tutorial/54.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值