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
}
从上面我们可以知道整个复制集的状态