Section 17.1: 作为副本集的 Mongodb

我们将创建一个拥有 3 个实例的副本集 mongodb。其中一个实例为主实例,另外两个实例为辅实例。

为了简单起见,我将在同一个服务器上运行 3 个 mongodb 实例的副本集,因此要实现这一点,所有三个 mongodb 实例都将运行在不同的端口号上。

在生产环境中,你有一个专用的 mongodb 实例运行在一台服务器上,你可以重复使用相同的端口号。

创建数据目录(文件中存储 mongodb 数据的路径)

- mkdir c:\data\server1 (datafile path for instance 1)
- mkdir c:\data\server2 (datafile path for instance 2)
- mkdir c:\data\server3 (datafile path for instance 3)

a. 启动第一个 mongod 实例 打开命令提示符并键入以下内容,按回车键。

mongod --replSet s0 --dbpath c:\data\server1 --port 37017 --smallfiles --oplogSize 100

上述命令将 mongodb 实例与名为 “s0 ”的副本集关联,并在 37017 端口启动第一个 mongodb 实例,oplogSize 为 100MB

b. 同样启动第二个 Mongodb 实例

mongod --replSet s0 --dbpath c:\data\server2 --port 37018 --smallfiles --oplogSize 100

上述命令将 mongodb 实例与名为 “s0 ”的副本集关联,并在 37018 端口启动第一个 mongodb 实例,oplogSize 为 100MB

c. 现在启动第三个 Mongodb 实例

mongod --replSet s0 --dbpath c:\data\server3 --port 37019 --smallfiles --oplogSize 100

上述命令将 mongodb 实例关联到名为 “s0 ”的副本集,并在 37019 端口启动第一个 mongodb 实例,oplogSize 为 100MB

启动了所有 3 个实例后,这 3 个实例目前是相互独立的。现在,我们需要将这些实例组合成一个副本集。我们可以借助配置对象来实现这一目的。

a 通过 mongo shell 连接到任何一个 mongod 服务器。为此,请打开命令提示符并键入

mongo --port 37017

连接到 mongo shell 后,创建一个配置对象

var config = {"_id":"s0", members[]};

该配置对象有 2 个属性

1 _id:复制集的名称("s0)

2 成员: [](members 是一个 mongod 实例数组,暂时保持空白,我们将通过 push 命令添加成员。

b 向配置对象中的成员数组推送(添加)mongod 实例。在 mongo shell 中键入

config.members.push({"_id":0,"host":"localhost:37017"});
config.members.push({"_id":1,"host":"localhost:37018"});
config.members.push({"_id":2,"host":"localhost:37019"});

我们为每个 mongod 实例分配一个 _id 和一个 host。_id 可以是任何唯一的数字,而 host 应该是运行该实例的服务器的主机名,然后是端口号。

在 mongo shell 中使用以下命令启动配置对象。

rs.initiate(config)

几秒钟后,服务器上就运行了由 3 个 mongod 实例组成的副本集。 命令来检查副本集的状态,并确定哪个是主副本,哪个是辅助副本。

rs.status();

Section 17.2: 检查 MongoDB 复制集状态

使用下面的命令检查副本集状态。 命令 : rs.status() 连接任意一个副本成员并执行此命令,它将给出副本集的完整状态 示例 :

{
    "set" : "ReplicaName",
    "date" : ISODate("2016-09-26T07:36:04.935Z"),
    "myState" : 1,
    "term" : NumberLong(-1),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "members" : [
        {
            "_id" : 0,
            "name" : "<IP>:<PORT>,
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 5953744,
            "optime" : Timestamp(1474875364, 36),
            "optimeDate" : ISODate("2016-09-26T07:36:04Z"),
            "electionTime" : Timestamp(1468921646, 1),
            "electionDate" : ISODate("2016-07-19T09:47:26Z"),
            "configVersion" : 6,
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "<IP>:<PORT>",
            "health" : 1,

            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 5953720,
            "optime" : Timestamp(1474875364, 13),
            "optimeDate" : ISODate("2016-09-26T07:36:04Z"),
            "lastHeartbeat" : ISODate("2016-09-26T07:36:04.244Z"),
            "lastHeartbeatRecv" : ISODate("2016-09-26T07:36:03.871Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "10.9.52.55:10050",
            "configVersion" : 6
        },
        {
            "_id" : 2,
            "name" : "<IP>:<PORT>",
            "health" : 1,
            "state" : 7,
            "stateStr" : "ARBITER",
            "uptime" : 5953696,
            "lastHeartbeat" : ISODate("2016-09-26T07:36:03.183Z"),
            "lastHeartbeatRecv" : ISODate("2016-09-26T07:36:03.715Z"),
            "pingMs" : NumberLong(0),
            "configVersion" : 6
        },
        {
            "_id" : 3,
            "name" : "<IP>:<PORT>",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 1984305,
            "optime" : Timestamp(1474875361, 16),
            "optimeDate" : ISODate("2016-09-26T07:36:01Z"),
            "lastHeartbeat" : ISODate("2016-09-26T07:36:02.921Z"),
            "lastHeartbeatRecv" : ISODate("2016-09-26T07:36:03.793Z"),
            "pingMs" : NumberLong(22),
            "lastHeartbeatMessage" : "syncing from: 10.9.52.56:10050",
            "syncingTo" : "10.9.52.56:10050",
            "configVersion" : 6
        }
    ],
    "ok" : 1
}

从上面我们可以知道整个复制集的状态