一、MongoDB Replica Sets(副本集)简单的说就是有自动故障恢复功能的主从集群,主从集群和副本集的最为明显的区别是副本集没有固定的"主节点":整个集群会选举出来一个"主节点"当其不能正常工作时则变更到其他的节点,提高了系统的稳定性。

MongoDB Replica Sets的架构如图所示:

如上图所示,MongoDB Replica Sets的结构类似于以集群,完全可以把他当成一个集群,因为他确实与集群实现的作用是一样的:如果其中一个节点出现故障,其他的节点会马上将业务接管过来。而无需停机操作

二、MongoDB Replica Sets的配置步骤:

1:首先要做是启动三个节点

介绍一下涉及到的参数

--oplogSize 日志操作文件的大

--dbpath   数据文件路径

--logpath  日志文件路径

--port        端口号,默认是27017.我这里使用的也是这个端口号.

--replSet   复制集的名字,一个replica sets中的每个节点的这个参数都要用一个复制集名字,这里是test.

--replSet test/  这个后面跟的是其他standard节点的ip和端口

--maxConns   最大连接数

--fork       后台运行

--logappend   日志文件循环使用,如果日志文件已满,那么新日志覆盖最久日志。

--keyFile       标识同一集群的认证私钥

其中在启动节点时一定要加上oplogSize 的参数 为其设置大小,不然在64位操作系统上的mongodb,oplogs都相当大-可能是5%的磁盘空间,要根据情况设置个合理的值。

2:启动三个节点

启动第一个节点:/usr/local/mongodb/bin/mongod --port 28010 --oplogSize 10 --dbpath=/sdb1/liujijun/data/data/r0/ --logpath=/sdb1/liujijun/data/log/r0.log --replSet rs1/127.0.0.1:28011,127.0.0.1:28012 --maxConns 800 --fork --logappend
启动第二个节点: /usr/local/mongodb/bin/mongod --port 28012 --oplogSize 10 --dbpath=/sdb1/liujijun/data/data/r2/ --logpath=/sdb1/liujijun/data/log/r2.log --replSet rs1/127.0.0.1:28010,127.0.0.1:28011 --maxConns 800 --fork --logappend
启动第三个节点:/usr/local/mongodb/bin/mongod --port 28011 --oplogSize 10 --dbpath=/sdb1/liujijun/data/data/r1/ --logpath=/sdb1/liujijun/data/log/r1.log --replSet rs1/127.0.0.1:28010,127.0.0.1:28012 --maxConns 800 --fork --logappend

3:链接任选一个节点

# /usr/local/mongodb/bin/mongo --port 28010
> config={_id : 'rs1',members : [{_id : 0, host : 'localhost:28010'},{_id : 1, host : 'localhost:28011'},{_id : 2, host : 'localhost:28012'}]}//配置节点信息
 {
         "_id" : "rs1",
         "members" : [
                 {
                         "_id" : 0,
                         "host" : "localhost:28010"
                 },
                 {
                         "_id" : 1,
                         "host" : "localhost:28011"
                 },
                 {
                         "_id" : 2,
                         "host" : "localhost:28012"
                 }
         ]
 }


> rs.initiate(config)//这个过程可能要等个一到两分钟的时间。

{
         "info" : "Config now saved locally.  Should come online in about a minute.",
         "ok" : 1
 }
 > rs.status()
 {
         "set" : "rs1",
         "date" : ISODate("2012-02-19T06:01:34Z"),
         "myState" : 1,
         "members" : [
                 {
                         "_id" : 0,
                         "name" : "localhost:28010",
                         "health" : 1,
                         "state" : 1,
                         "stateStr" : "PRIMARY",
                         "optime" : {
                                 "t" : 1329630925000,
                                 "i" : 1
                         },
                         "optimeDate" : ISODate("2012-02-19T05:55:25Z"),
                         "self" : true
                 },
                 {
                         "_id" : 1,
                         "name" : "localhost:28011",
                         "health" : 1,
                         "state" : 2,
                         "stateStr" : "SECONDARY",
                         "uptime" : 367,
                         "optime" : {
                                 "t" : 1329630925000,
                                 "i" : 1
                         },
                         "optimeDate" : ISODate("2012-02-19T05:55:25Z"),
                         "lastHeartbeat" : ISODate("2012-02-19T06:01:33Z"),
                         "pingMs" : 0
                 },
                 {
                         "_id" : 2,
                         "name" : "localhost:28012",
                         "health" : 1,
                         "state" : 2,
                         "stateStr" : "SECONDARY",
                         "uptime" : 367,
                         "optime" : {
                                 "t" : 1329630925000,
                                 "i" : 1
                         },
                         "optimeDate" : ISODate("2012-02-19T05:55:25Z"),
                         "lastHeartbeat" : ISODate("2012-02-19T06:01:33Z"),
                         "pingMs" : 0
                 }
         ],
         "ok" : 1
 }
 PRIMARY>



配置到此结束。


备注:

如果要读写分离的话:db.getMongo().setSlaveOk()命令实现从库的可以查询的目的。在利用副本集时最好不要设置用户名和密码,因为这样会影响效率的,权限系统,非常耗资源,需要大量的运算。