一、MongoDB复制集介绍

1、如下图所示有一个数据库集群,集群中有三台数据库服务器,一台活跃服务器和两台备份服务器。当活跃服务器A发生故障时,会根据权重算法从备份服务器B和C中选出B作为新的活跃服务器,而当A恢复时当成备份服务器,继续加入到整个数据库集群中工作,这就是MongoDB的副本集。

mongodb复制表结构 mongodb复制集_复制集

2、配置一个副本集

2.1 在npfdev1,npfdev2,npfdev3三台机器上的mongodb.conf增加配置:

replSet=kgpcReplSet, 指定了复制集的名称. 为了使用方便,我们暂时不要使用auth启动,去掉auth参数。

mongodb复制表结构 mongodb复制集_复制集_02

2.2 启动MongoDB,使用 service mongod start 命令.

mongodb复制表结构 mongodb复制集_复制集_03

2.3 然后就需要初始化复制集。进入到这三台数据库服务器中任何一个的admin数据库,执行如下图的操作来初始化复制集:这里没有设置这三台服务器的权重,MonggoDB推选活跃服务器的策略是随机的。

2.3.1 那么使用命令mongo npfdev1:27017/admin

mongodb复制表结构 mongodb复制集_服务器_04

2.3.2 初始化复制集, 运行如下命令:

db.runCommand({"replSetInitiate":{
    "_id":"kgpcReplSet",
    "members":[
        {"_id":1,"host":"npfdev1:27017"},
        {"_id":2,"host":"npfdev2:27017"},
        {"_id":3,"host":"npfdev3:27017"}
    ]
}}
);

 

mongodb复制表结构 mongodb复制集_mongodb复制表结构_05

2.3.4 分别进入到这三台服务器的shell界面.可以发现npfdev1的服务器被推选成了活跃服务器,而其它两台就是备份服务器.

mongodb复制表结构 mongodb复制集_mongodb复制表结构_06

2.3.5 在活跃服务器shell中可以使用“rs.status()”来查看副本集的状态。

kgpcReplSet:PRIMARY> rs.status();
{
    "set" : "kgpcReplSet",
    "date" : ISODate("2017-05-05T13:05:29.158Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "members" : [
        {
            "_id" : 1,
            "name" : "npfdev1:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 268,
            "optime" : {
                "ts" : Timestamp(1493989299, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2017-05-05T13:01:39Z"),
            "electionTime" : Timestamp(1493989298, 1),
            "electionDate" : ISODate("2017-05-05T13:01:38Z"),
            "configVersion" : 1,
            "self" : true
        },
        {
            "_id" : 2,
            "name" : "npfdev2:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 240,
            "optime" : {
                "ts" : Timestamp(1493989299, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2017-05-05T13:01:39Z"),
            "lastHeartbeat" : ISODate("2017-05-05T13:05:28.555Z"),
            "lastHeartbeatRecv" : ISODate("2017-05-05T13:05:28.549Z"),
            "pingMs" : NumberLong(1),
            "syncingTo" : "npfdev1:27017",
            "configVersion" : 1
        },
        {
            "_id" : 3,
            "name" : "npfdev3:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 240,
            "optime" : {
                "ts" : Timestamp(1493989299, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2017-05-05T13:01:39Z"),
            "lastHeartbeat" : ISODate("2017-05-05T13:05:28.557Z"),
            "lastHeartbeatRecv" : ISODate("2017-05-05T13:05:28.554Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "npfdev1:27017",
            "configVersion" : 1
        }
    ],
    "ok" : 1
}
kgpcReplSet:PRIMARY>

2.3.6 复制集如下图:

mongodb复制表结构 mongodb复制集_复制集_07

 

复制集使用的异步同步方式,复制集成员之间每隔2s发送一次hearbeat(pings).当主节点与其它成员通信超时10s后,一个secondary节点将会被选举为primary节点.在新的版本中,如果存在多个secondary节点,当第一个节点被选举为primary后,其它的secondary节点将从它开始复制数据.

2.3.7 读写分离操作,注意:默认情况下非活跃服务器(SECONDARY)是不能进行数据库读操作的。如下图:

mongodb复制表结构 mongodb复制集_复制集_08

如果要设置SECONDARY节点也可以进行读操作,那么可以设置slaveOk参数为true。但是此属性在shell中无法完成,这个特性是被写到MongoDB的高级驱动程序中的。

 

参考文献

1. MongoDB 学习笔记(七):主从复制与副本集

2. mongodb-创建复制集(replSet)