======Overview======
Like any other DB, Mongo rises the quesion, what happens if the primary dies :)
Well, like many other DBs again, failover occurs. In this case, the next database (elected or not) will become primary as follows:
====Force shutdown Primary====
testset:PRIMARY> db.shutdownServer()
2018-03-24T23:31:32.017+0100 DBClientCursor::init call() failed
server should be down...
2018-03-24T23:31:32.018+0100 trying reconnect to 127.0.0.1:9005 (127.0.0.1) failed
2018-03-24T23:31:32.018+0100 reconnect 127.0.0.1:9005 (127.0.0.1) ok
2018-03-24T23:31:32.020+0100 Socket recv() errno:104 Connection reset by peer 127.0.0.1:9005
2018-03-24T23:31:32.020+0100 SocketException: remote: 127.0.0.1:9005 error: 9001 socket exception [RECV_ERROR] server [127.0.0.1:9005]
2018-03-24T23:31:32.020+0100 DBClientCursor::init call() failed
2018-03-24T23:31:32.022+0100 trying reconnect to 127.0.0.1:9005 (127.0.0.1) failed
2018-03-24T23:31:32.023+0100 warning: Failed to connect to 127.0.0.1:9005, reason: errno:111 Connection refused
2018-03-24T23:31:32.023+0100 reconnect 127.0.0.1:9005 (127.0.0.1) failed failed couldn't connect to server 127.0.0.1:9005 (127.0.0.1), connection attempt failed
>
After I shutdown the primary, the primary role when to the other possible database, in order case: lparbmongo:
====Failover====
testset:SECONDARY> rs.status()
{
"set" : "testset",
"date" : ISODate("2018-03-24T22:32:09Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "lparamongo:9005",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : Timestamp(1521930007, 1),
"optimeDate" : ISODate("2018-03-24T22:20:07Z"),
"lastHeartbeat" : ISODate("2018-03-24T22:32:08Z"),
"lastHeartbeatRecv" : ISODate("2018-03-24T22:31:45Z"),
"pingMs" : 0
},
{
"_id" : 1,
"name" : "lparbmongo:9005",
"health" : 1,
"state" : 1,
"stateStr" : "**PRIMARY**",
"uptime" : 3432,
"optime" : Timestamp(1521930007, 1),
"optimeDate" : ISODate("2018-03-24T22:20:07Z"),
"electionTime" : Timestamp(1521930710, 1),
"electionDate" : ISODate("2018-03-24T22:31:50Z"),
"self" : true
},
{
"_id" : 2,
"name" : "lparcmongo:9005",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 708,
"optime" : Timestamp(1521930007, 1),
"optimeDate" : ISODate("2018-03-24T22:20:07Z"),
"lastHeartbeat" : ISODate("2018-03-24T22:32:07Z"),
"lastHeartbeatRecv" : ISODate("2018-03-24T22:32:09Z"),
"pingMs" : 0,
"lastHeartbeatMessage" : "syncing to: lparbmongo:9005",
"syncingTo" : "lparbmongo:9005"
}
],
"ok" : 1
}
In case the old primary is started again, it will re-join the replica set as SECONDARY (e.g. WAY EASIER THAN ORACLE :D )
====Reinstate the old-primary====
testset:SECONDARY> rs.status()
{
"set" : "testset",
"date" : ISODate("2018-03-24T22:37:09Z"),
"myState" : 2,
"syncingTo" : "lparbmongo:9005",
"members" : [
{
"_id" : 0,
"name" : "lparamongo:9005",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 13,
"optime" : Timestamp(1521930007, 1),
"optimeDate" : ISODate("2018-03-24T22:20:07Z"),
"infoMessage" : "syncing to: lparbmongo:9005",
"self" : true
},
{
"_id" : 1,
"name" : "lparbmongo:9005",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 12,
"optime" : Timestamp(1521930007, 1),
"optimeDate" : ISODate("2018-03-24T22:20:07Z"),
"lastHeartbeat" : ISODate("2018-03-24T22:37:09Z"),
"lastHeartbeatRecv" : ISODate("2018-03-24T22:37:09Z"),
"pingMs" : 0,
"electionTime" : Timestamp(1521930710, 1),
"electionDate" : ISODate("2018-03-24T22:31:50Z")
},
{
"_id" : 2,
"name" : "lparcmongo:9005",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 12,
"optime" : Timestamp(1521930007, 1),
"optimeDate" : ISODate("2018-03-24T22:20:07Z"),
"lastHeartbeat" : ISODate("2018-03-24T22:37:09Z"),
"lastHeartbeatRecv" : ISODate("2018-03-24T22:37:09Z"),
"pingMs" : 0,
"syncingTo" : "lparbmongo:9005"
}
],
"ok" : 1
}