MongoDB副本集

一、节点类型
standard:常规节点,它存储一份完整的数据副本,参与选举投票,有可能成为活跃节点。
passive:存储了完整的数据副本,参与投票,不能成为活跃节点。
arbiter:仲裁节点,只参与投票,不接收复制的数据,也不能成为活跃节点。

二、参数说明
--dbpath   数据文件路径
--logpath  日志文件路径


--port        端口号,默认是27017.我这里使用的也是这个端口号.
--replSet   复制集的名字,一个replica sets中的每个节点的这个参数都要用一个复制集名字,这里是test.
--replSet   这个后面跟的是其他standard节点的ip和端口
--maxConns   最大连接数
--fork       后台运行
--logappend   日志文件循环使用,如果日志文件已满,那么新日志覆盖最久日志。

三、创建副本集 
环境说明:

  1. ip:10.0.0.3  
  2. ip:10.0.0.4  
  3. ip:10.0.0.5  

启动第一个standard节点(ip:10.0.0.3)

  1. www.linuxidc.com @Ubuntu:~$ mkdir -p ~/mongo/db ~/mongo/log   
  2. www.linuxidc.com @Ubuntu:~$ mongod -dbpath ~/mongo/db -logpath ~/mongo/log/mongod.log -port 27037 -replSet test -maxConns=2000 -fork -logappend  

启动第一个standard节点(ip:10.0.0.4)

  1. www.linuxidc.com @Ubuntu:~$ mkdir -p ~/mongo/db ~/mongo/log   
  2. www.linuxidc.com @Ubuntu:~$ mongod -dbpath ~/mongo/db -logpath ~/mongo/log/mongod.log -port 27037 -replSet test -maxConns=2000 -fork -logappend  

启动arbiter节点,也就是仲裁节点 (ip:10.0.0.5)

  1. www.linuxidc.com @Ubuntu:~$ mkdir -p ~/mongo/db ~/mongo/log   
  2. www.linuxidc.com @Ubuntu:~$ mongod -dbpath ~/mongo/db -logpath ~/mongo/log/mongod.log -port 27037 -replSet test -maxConns=2000 -fork -logappend  

启动了以上服务器后,日志告诉你副本集没有初始化。因为还差最后一步:在shell中初始化副本集。

连接其中一台standard节点服务器。初始化命令只能执行一次 :

  1. www.linuxidc.com @Ubuntu:~$ mongo 10.0.0.3:27037/admin   
  2. MongoDB shell version: 2.0.1  
  3. connecting to: 10.0.0.3:27037/admin   
  4. > db.runCommand({"replSetInitiate" : {   
  5. ...     "_id" : "test",   
  6. ...     "members" : [   
  7. ...     {   
  8. ...     "_id" : ,   
  9. ...     "host" : "10.0.0.3:27037"  
  10. ...     },   
  11. ...     {   
  12. ...     "_id" : 1,   
  13. ...     "host" : "10.0.0.4:27037"  
  14. ...     }   
  15. ...     ]}})   
  16. {   
  17.         "info" : "Config now saved locally.  Should come online in about a minute.",   
  18.         "ok" : 1  
  19. }  
  20.   
  21.   
  22.   
  23.   
  24. >    

执行以下shell命令后,如果看见红色字体标记的内容,则表示初始化成功

shell命令:

  1. db.runCommand({"replSetInitiate" : {   
  2.     "_id" : "test",   
  3.     "members" : [   
  4.     {   
  5.     "_id" : ,   
  6.     "host" : "10.0.0.3:27037"  
  7.     },   
  8.     {   
  9.     "_id" : 1,   
  10.     "host" : "10.0.0.4:27037"  
  11.     }   
  12.     ]}})  

你也可以通过命令查看效果:

  1. > rs.status()   
  2. {   
  3.         "set" : "test",   
  4.         "date" : ISODate("2011-12-06T07:44:29Z"),   
  5.         "myState" : 1,   
  6.         "members" : [   
  7.                 {   
  8.                         "_id" : ,   
  9.                         "name" : "10.0.0.3:27037",   
  10.                         "health" : 1,   
  11.                         "state" : 1,   
  12.                         "stateStr" : "PRIMARY",   
  13.                         "optime" : {   
  14.                                 "t" : 1323157008000,   
  15.                                 "i" : 1  
  16.                         },   
  17.                         "optimeDate" : ISODate("2011-12-06T07:36:48Z"),   
  18.                         "self" : true  
  19.                 },   
  20.                 {   
  21.                         "_id" : 1,   
  22.                         "name" : "10.0.0.4:27037",   
  23.                         "health" : 1,   
  24.                         "state" : 2,   
  25.                         "stateStr" : "SECONDARY",   
  26.                         "uptime" : 455,   
  27.                         "optime" : {   
  28.                                 "t" : 1323157008000,   
  29.                                 "i" : 1  
  30.                         },   
  31.                         "optimeDate" : ISODate("2011-12-06T07:36:48Z"),   
  32.                         "lastHeartbeat" : ISODate("2011-12-06T07:44:28Z"),   
  33.                         "pingMs" : 2  
  34.                 }   
  35.         ],   
  36.         "ok" : 1  
  37. }  

加入仲裁节点 
执行以下命令:

  1. PRIMARY> rs.addArb("10.0.0.5:27037");   
  2. "ok" : 1 }  

我们可以再次查看当前状态:

  1. PRIMARY> rs.status()   
  2. {   
  3.         "set" : "test",   
  4.         "date" : ISODate("2011-12-06T07:46:21Z"),   
  5.         "myState" : 1,   
  6.         "members" : [   
  7.                 {   
  8.                         "_id" : ,   
  9.                         "name" : "10.0.0.3:27037",   
  10.                         "health" : 1,   
  11.                         "state" : 1,   
  12.                         "stateStr" : "PRIMARY",   
  13.                         "optime" : {   
  14.                                 "t" : 1323157549000,   
  15.                                 "i" : 1  
  16.                         },   
  17.                         "optimeDate" : ISODate("2011-12-06T07:45:49Z"),   
  18.                         "self" : true  
  19.                 },   
  20.                 {   
  21.                         "_id" : 1,   
  22.                         "name" : "10.0.0.4:27037",   
  23.                         "health" : 1,   
  24.                         "state" : 2,   
  25.                         "stateStr" : "SECONDARY",   
  26.                         "uptime" : 567,   
  27.                         "optime" : {PRIMARY> db.isMaster();   
  28. {   
  29.         "setName" : "test",   
  30.         "ismaster" : true,   
  31.         "secondary" : false,   
  32.         "hosts" : [   
  33.                 "10.0.0.3:27037",   
  34.                 "10.0.0.4:27037"  
  35.         ],   
  36.         "arbiters" : [   
  37.                 "10.0.0.5:27037"  
  38.         ],   
  39.         "primary" : "10.0.0.3:27037",   
  40.         "me" : "10.0.0.3:27037",   
  41.         "maxBsonObjectSize" : 16777216,   
  42.         "ok" : 1  
  43. }   
  44.     
  45.                                 "t" : 1323157549000,   
  46.                                 "i" : 1  
  47.                         },   
  48.                         "optimeDate" : ISODate("2011-12-06T07:45:49Z"),   
  49.                         "lastHeartbeat" : ISODate("2011-12-06T07:46:20Z"),   
  50.                         "pingMs" :   
  51.                 },   
  52.                 {   
  53.                         "_id" : 2,   
  54.                         "name" : "10.0.0.5:27037",   
  55.                         "health" : 1,   
  56.                         "state" : 7,   
  57.                         "stateStr" : "ARBITER",   
  58.                         "uptime" : 22,   
  59.                         "optime" : {   
  60.                                 "t" : ,   
  61.                                 "i" :   
  62.                         },   
  63.                         "optimeDate" : ISODate("1970-01-01T00:00:00Z"),   
  64.                         "lastHeartbeat" : ISODate("2011-12-06T07:46:19Z"),   
  65.                         "pingMs" :   
  66.                 }   
  67.         ],   
  68.         "ok" : 1  
  69. }  

rs.status()通过这个命令,可以查看各个节点的ip、角色已经是否正常

我们看到已经成功配置。

查看活跃节点:

  1. PRIMARY> db.isMaster();   
  2. {   
  3.         "setName" : "test",   
  4.         "ismaster" : true,   
  5.         "secondary" : false,   
  6.         "hosts" : [   
  7.                 "10.0.0.3:27037",   
  8.                 "10.0.0.4:27037"  
  9.         ],   
  10.         "arbiters" : [   
  11.                 "10.0.0.5:27037"  
  12.         ],   
  13.         "primary" : "10.0.0.3:27037",   
  14.         "me" : "10.0.0.3:27037",   
  15.         "maxBsonObjectSize" : 16777216,   
  16.         "ok" : 1  
  17. }  

可以看到现在10.0.0.3:27037为活跃节点。

检测是否配置成功

可以强制primary和standard节点角色互换,从而验证是否能够实现副本集功能

rs.stepDown()  

执行完成后:

  1. SECONDARY> db.isMaster();   
  2. {   
  3.         "setName" : "test",   
  4.         "ismaster" : false,   
  5.         "secondary" : true,   
  6.         "hosts" : [   
  7.                 "10.0.0.3:27037",   
  8.                 "10.0.0.4:27037"  
  9.         ],   
  10.         "arbiters" : [   
  11.                 "10.0.0.5:27037"  
  12.         ],   
  13.         "primary" : "10.0.0.4:27037",   
  14.         "me" : "10.0.0.3:27037",   
  15.         "maxBsonObjectSize" : 16777216,   
  16.         "ok" : 1  
  17. }  

可以看到现在主节点已经修改为10.0.0.4:27037了。

我们也可以动态扩展增加节点(ip:10.0.0.5:27047)

  1. www.linuxidc.com @Ubuntu:~$ mkdir -p ~/mongo1/db ~/mongo1/log   
  2. www.linuxidc.com @Ubuntu:~$ mongod -dbpath ~/mongo1/db -logpath ~/mongo1/log/mongod.log -port 27037 -replSet test -maxConns=2000 -fork -logappend  

进入活跃节点的服务器

  1. www.linuxidc.com @Ubuntu4:~$ mongo 10.0.0.4:27037/admin   
  2. MongoDB shell version: 2.0.1  
  3. connecting to: 10.0.0.4:27037/admin   
  4. PRIMARY> rs.add("10.0.0.5:27047");   
  5. "ok" : 1 }   
  6. PRIMARY>   

 

  1. PRIMARY> rs.status()   
  2. {   
  3.         "set" : "test",   
  4.         "date" : ISODate("2011-12-06T07:59:36Z"),   
  5.         "myState" : 1,   
  6.         "syncingTo" : "10.0.0.3:27037",   
  7.         "members" : [   
  8.                 {   
  9.                         "_id" : ,   
  10.                         "name" : "10.0.0.3:27037",   
  11.                         "health" : 1,   
  12.                         "state" : 2,   
  13.                         "stateStr" : "SECONDARY",   
  14.                         "uptime" : 1263,   
  15.                         "optime" : {   
  16.                                 "t" : 1323158245000,   
  17.                                 "i" : 1  
  18.                         },   
  19.                         "optimeDate" : ISODate("2011-12-06T07:57:25Z"),   
  20.                         "lastHeartbeat" : ISODate("2011-12-06T07:59:35Z"),   
  21.                         "pingMs" :   
  22.                 },   
  23.                 {   
  24.                         "_id" : 1,   
  25.                         "name" : "10.0.0.4:27037",   
  26.                         "health" : 1,   
  27.                         "state" : 1,   
  28.                         "stateStr" : "PRIMARY",   
  29.                         "optime" : {   
  30.                                 "t" : 1323158245000,   
  31.                                 "i" : 1  
  32.                         },   
  33.                         "optimeDate" : ISODate("2011-12-06T07:57:25Z"),   
  34.                         "self" : true  
  35.                 },   
  36.                 {   
  37.                         "_id" : 2,   
  38.                         "name" : "10.0.0.5:27037",   
  39.                         "health" : 1,   
  40.                         "state" : 7,   
  41.                         "stateStr" : "ARBITER",   
  42.                         "uptime" : 717,   
  43.                         "optime" : {   
  44.                                 "t" : ,   
  45.                                 "i" :   
  46.                         },   
  47.                         "optimeDate" : ISODate("1970-01-01T00:00:00Z"),   
  48.                         "lastHeartbeat" : ISODate("2011-12-06T07:59:35Z"),   
  49.                         "pingMs" :   
  50.                 },   
  51.                 {   
  52.                         "_id" : 3,   
  53.                         "name" : "10.0.0.5:27047",   
  54.                         "health" : 1,   
  55.                         "state" : 2,   
  56.                         "stateStr" : "SECONDARY",   
  57.                         "uptime" : 125,   
  58.                         "optime" : {   
  59.                                 "t" : 1323158245000,   
  60.                                 "i" : 1  
  61.                         },   
  62.                         "optimeDate" : ISODate("2011-12-06T07:57:25Z"),   
  63.                         "lastHeartbeat" : ISODate("2011-12-06T07:59:35Z"),   
  64.                         "pingMs" :   
  65.                 }   
  66.         ],   
  67.         "ok" : 1  
  68. }  

你可能感兴趣的:(MongoDB副本集)