搭建一主两从三节点副本集,版本使用3.4.14
步骤:
1.三个节点都安装并启动MongoDB
解压:
tar -zxvf mongodb-linux-x86_64-rhel62-3.4.14.tgz
设置安装路径:mv mongodb-linux-x86_64-rhel62-3.4.14 usr/local/mongodb
启动并设置副本集名称为rs0:
cd usr/local/mongodb/bin/
./mongod --dbpath=/data/db --logpath=/data/db/go.log --port=21007 --replSet=rs0 &
2.登陆任意一台节点添加副本集
> rs.slaveOk()
> show dbs
local 0.000GB
> use admin
switched to db admin
> rs.initiate() 初始化
{
"info2" : "no configuration specified. Using a default configuration for the set",
"me" : "daifu:27017",
"ok" : 1
}
rs0:OTHER> rs.conf() #查看配置信息,刚登陆时角色还是other
{
"_id" : "rs0",
"version" : 1, #目前只有自己一个节点信息
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "daifu:21007",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : 60000,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("5ae12ae28599baf861799d5d")
}
}
添加另外两个节点
rs0:PRIMARY> rs.add('test:21007')
{ "ok" : 1 }
rs0:PRIMARY> rs.add('qposbak:21007')
{ "ok" : 1 }
rs0:PRIMARY> rs.conf() #再次查看配置信息,可看到有三位成员
{
"_id" : "rs0",
"version" : 3,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0, #第一个节点信息
"host" : "daifu:21007",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1, #设置优先级
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1, #第二个节点信息
"host" : "test:21007",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2, #第三个节点信息
"host" : "qposbak:21007",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : 60000,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("5ae12ae28599baf861799d5d")
}
}
rs0:PRIMARY> rs.status() #查看成员副本集状态
{
"set" : "rs0", #副本集名字
"date" : ISODate("2018-04-26T01:29:32.322Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1524706158, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1524706170, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1524706170, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "daifu:21007",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 270,
"optime" : {
"ts" : Timestamp(1524706170, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-04-26T01:29:30Z"),
"electionTime" : Timestamp(1524706018, 2),
"electionDate" : ISODate("2018-04-26T01:26:58Z"),
"configVersion" : 3,
"self" : true
},
{
"_id" : 1,
"name" : "test:21007",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 73,
"optime" : {
"ts" : Timestamp(1524706158, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1524706158, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-04-26T01:29:18Z"),
"optimeDurableDate" : ISODate("2018-04-26T01:29:18Z"),
"lastHeartbeat" : ISODate("2018-04-26T01:29:32.214Z"),
"lastHeartbeatRecv" : ISODate("2018-04-26T01:29:28.199Z"),
"pingMs" : NumberLong(5),
"configVersion" : 3
},
{
"_id" : 2,
"name" : "qposbak:21007",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 14,
"optime" : {
"ts" : Timestamp(1524706158, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1524706158, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-04-26T01:29:18Z"),
"optimeDurableDate" : ISODate("2018-04-26T01:29:18Z"),
"lastHeartbeat" : ISODate("2018-04-26T01:29:32.128Z"),
"lastHeartbeatRecv" : ISODate("2018-04-26T01:29:28.247Z"),
"pingMs" : NumberLong(0),
"configVersion" : 3
}
],
"ok" : 1
}
3.移除从库节点(两步)
1>首先关闭从库
rs0:SECONDARY> use admin
switched to db admin
rs0:SECONDARY> db.shutdownServer()
2>然后在主库中删除从库节点信息
rs0:PRIMARY> rs.remove('test:21007')
{ "ok" : 1 }
4.副本集Failover测试
副本集默认2秒Ping一次,如果10秒没有回应认为对方不再存活。当存活的节点中优先级相同的情况下,MongoDB选择将Optime最高的从库选为主库。
测试:关闭主库
rs0:PRIMARY> use admin
switched to db admin
rs0:PRIMARY> db.shutdownServer()
从库查看是否提升为主库
rs0:PRIMARY> rs.status()
{
"set" : "rs0",
"date" : ISODate("2018-04-26T02:11:19.917Z"),
"myState" : 1,
"term" : NumberLong(2),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1524708674, 1),
"t" : NumberLong(2)
},
"appliedOpTime" : {
"ts" : Timestamp(1524708674, 1),
"t" : NumberLong(2)
},
"durableOpTime" : {
"ts" : Timestamp(1524708674, 1),
"t" : NumberLong(2)
}
},
"members" : [
{
"_id" : 0,
"name" : "daifu:21007",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDurable" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2018-04-26T02:11:19.648Z"),
"lastHeartbeatRecv" : ISODate("2018-04-26T02:09:44.187Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "Connection refused",
"configVersion" : -1
},
{
"_id" : 2,
"name" : "qposbak:21007",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY", #qposbak已经成为主
"uptime" : 2680,
"optime" : {
"ts" : Timestamp(1524708674, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-04-26T02:11:14Z"),
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1524708593, 1),
"electionDate" : ISODate("2018-04-26T02:09:53Z"),
"configVersion" : 5,
"self" : true
},
{
"_id" : 3,
"name" : "test:21007",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1289,
"optime" : {
"ts" : Timestamp(1524708674, 1),
"t" : NumberLong(2)
},
"optimeDurable" : {
"ts" : Timestamp(1524708674, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-04-26T02:11:14Z"),
"optimeDurableDate" : ISODate("2018-04-26T02:11:14Z"),
"lastHeartbeat" : ISODate("2018-04-26T02:11:19.817Z"),
"lastHeartbeatRecv" : ISODate("2018-04-26T02:11:19.816Z"),
"pingMs" : NumberLong(4),
"syncingTo" : "qposbak:27017",
"configVersion" : 5
}
],
"ok" : 1
}
如果将宕机的原主库重新启动后,查看会变成什么角色状态
rs0:SECONDARY> rs.status()
{
"set" : "rs0",
"date" : ISODate("2018-04-26T02:11:56.714Z"),
"myState" : 2,
"term" : NumberLong(2),
"syncingTo" : "qposbak:21007",
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1524708794, 1),
"t" : NumberLong(2)
},
"appliedOpTime" : {
"ts" : Timestamp(1524708794, 1),
"t" : NumberLong(2)
},
"durableOpTime" : {
"ts" : Timestamp(1524708794, 1),
"t" : NumberLong(2)
}
},
"members" : [
{
"_id" : 0,
"name" : "daifu:21007",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY", #可以发现,变成了secondary状态。当然我们可以通过更改优先级来实现原主库启动后重新变回主库。
"uptime" : 71,
"optime" : {
"ts" : Timestamp(1524708794, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-04-26T02:13:14Z"),
"syncingTo" : "qposbak:21007",
"configVersion" : 5,
"self" : true
},
{
"_id" : 2,
"name" : "qposbak:21007",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 70,
"optime" : {
"ts" : Timestamp(1524708794, 1),
"t" : NumberLong(2)
},
"optimeDurable" : {
"ts" : Timestamp(1524708794, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-04-26T02:13:14Z"),
"optimeDurableDate" : ISODate("2018-04-26T02:13:14Z"),
"lastHeartbeat" : ISODate("2018-04-26T02:11:56.173Z"),
"lastHeartbeatRecv" : ISODate("2018-04-26T02:11:56.572Z"),
"pingMs" : NumberLong(0),
"electionTime" : Timestamp(1524708593, 1),
"electionDate" : ISODate("2018-04-26T02:09:53Z"),
"configVersion" : 5
},
{
"_id" : 3,
"name" : "test:21007",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 70,
"optime" : {
"ts" : Timestamp(1524708794, 1),
"t" : NumberLong(2)
},
"optimeDurable" : {
"ts" : Timestamp(1524708794, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-04-26T02:13:14Z"),
"optimeDurableDate" : ISODate("2018-04-26T02:13:14Z"),
"lastHeartbeat" : ISODate("2018-04-26T02:11:56.591Z"),
"lastHeartbeatRecv" : ISODate("2018-04-26T02:11:55.953Z"),
"pingMs" : NumberLong(11),
"syncingTo" : "qposbak:21007",
"configVersion" : 5
}
],
"ok" : 1
}
MongoDB的成员中,除了Primary,Secondary和仲裁节点外,还有Hidden隐藏节点,Secondary-Only只作为从节点,Delayed延迟节点和Non-Voting备份节点。