原理
复制集 = 主从复制 + 自动切换
架构
一主两从

一主一从一裁判

集群搭建
mkdir ./primary ./secondary ./arbiter
mongod --replSet demo --dbpath ./primary --port 40000
mongod --replSet demo --dbpath ./secondary --port 40001
mongod --replSet demo --dbpath ./arbiter --port 40002
查询状态
mongo --port 40000
> use admin
> rs.status()
{
"operationTime" : Timestamp(0, 0),
"ok" : 0,
"errmsg" : "no replset config has been received",
"code" : 94,
"codeName" : "NotYetInitialized",
"$clusterTime" : {
"clusterTime" : Timestamp(0, 0),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
集群配置
config = {
"_id": "demo",
"members": [
{"_id": 0, "host": "127.0.0.1:40000"},
{"_id": 1, "host": "127.0.0.1:40001"},
{"_id": 2, "host": "127.0.0.1:40002", arbiterOnly: true}
]
}
rs.initiate(config)
查看状态
{
"set" : "demo",
"date" : ISODate("2018-11-01T07:55:22.492Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1541058909, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1541058909, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1541058909, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1541058909, 1),
"t" : NumberLong(1)
}
},
"lastStableCheckpointTimestamp" : Timestamp(1541058907, 1),
"members" : [
{
"_id" : 0,
"name" : "127.0.0.1:40000",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 581,
"optime" : {
"ts" : Timestamp(1541058909, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-11-01T07:55:09Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1541058906, 1),
"electionDate" : ISODate("2018-11-01T07:55:06Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "127.0.0.1:40001",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 27,
"optime" : {
"ts" : Timestamp(1541058909, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1541058909, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-11-01T07:55:09Z"),
"optimeDurableDate" : ISODate("2018-11-01T07:55:09Z"),
"lastHeartbeat" : ISODate("2018-11-01T07:55:22.212Z"),
"lastHeartbeatRecv" : ISODate("2018-11-01T07:55:20.813Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "127.0.0.1:40000",
"syncSourceHost" : "127.0.0.1:40000",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "127.0.0.1:40002",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 27,
"lastHeartbeat" : ISODate("2018-11-01T07:55:22.212Z"),
"lastHeartbeatRecv" : ISODate("2018-11-01T07:55:21.154Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1541058909, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1541058909, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
验证
mongo --port 40000
demo:PRIMARY> use test_db
switched to db test_db
demo:PRIMARY> db.user.insert({'name': 'xiaowang'})
WriteResult({ "nInserted" : 1 })
mongo --port 40001
demo:SECONDARY> use test_db
switched to db test_db
demo:SECONDARY> rs.secondaryOk()
demo:SECONDARY> db.user.find({})
{ "_id" : ObjectId("60927a5e92840a57d0e214da"), "name" : "xiaowang" }
网友评论