在自己的本機(jī)創(chuàng)建有三個節(jié)點(diǎn)的副本集 (一個主節(jié)點(diǎn),兩個從節(jié)點(diǎn)),是基于MongoDB 3.6 版本
-
創(chuàng)建數(shù)據(jù)存儲路徑
mkdir r0 mkdir r1 mkdir r2 -
創(chuàng)建log存儲路徑
mkdir log -
啟動第一個節(jié)點(diǎn)
mongod --replSet rs0 --port 27017 --bind_ip 127.0.0.1 --dbpath .\r0\ --logpath log\r0.log --logappend -
啟動第二個節(jié)點(diǎn)
mongod --replSet rs0 --port 27018 --bind_ip 127.0.0.1 --dbpath .\r1\ --logpath log\r1.log --logappend -
啟動第三個節(jié)點(diǎn)
mongod --replSet rs0 --port 27017 --bind_ip 127.0.0.1 --dbpath .\r2\ --logpath log\r2.log --logappend -
連接到
mongod實(shí)例mongo --port 27017 在
mongoshell中,使用rs.initiate()初始化副本集
rsconf = {
_id: "rs0",
members: [
{
_id: 0,
host: "127.0.1:27017"
},
{
_id: 1,
host: "127.0.1:27018"
},
{
_id: 2,
host: "127.0.1:27019"
}
]
}
rs.initiate(rsconf)
初始化成功
{
"ok" : 1,
"operationTime" : Timestamp(1524728214, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1524728214, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
- 查看副本集的狀態(tài)
27017:是主節(jié)點(diǎn)
27018 27019是從節(jié)點(diǎn)rs.status() { "set" : "rs0", "date" : ISODate("2018-04-26T08:15:11.241Z"), "myState" : 1, ... "members" : [ { "_id" : 0, "name" : "127.0.0.1:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", ... }, { "_id" : 1, "name" : "127.0.0.1:27018", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", ... }, { "_id" : 2, "name" : "127.0.0.1:27019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", ... } ], "ok" : 1, ... } - 查看節(jié)點(diǎn)是否是主節(jié)點(diǎn)
rs.isMaster()
{
"hosts" : [
"127.0.0.1:27017",
"127.0.0.1:27018",
"127.0.0.1:27019"
],
"setName" : "rs0",
"setVersion" : 1,
"ismaster" : true,
"secondary" : false,
"primary" : "127.0.0.1:27017",
"me" : "127.0.0.1:27017",
"electionId" : ObjectId("7fffffff0000000000000003"),
...
}
-
讀寫操作
先在主節(jié)點(diǎn)創(chuàng)建一個數(shù)據(jù)庫并寫入數(shù)據(jù)use TestDB db.createCollection("TestModel") db.getCollection("TestModel").insert({"first_name":"Lorry","second_name":"kevin"})
使用從節(jié)點(diǎn)進(jìn)行查詢
mongo --port 27019
無法進(jìn)行查詢的操作 ,從節(jié)點(diǎn)無法進(jìn)行查詢操作
rs0:SECONDARY> show dbs
2018-04-26T16:20:35.769+0800 E QUERY [thread1] Error: listDatabases failed:{
"operationTime" : Timestamp(1524730833, 1),
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk",
...
} :
配置從節(jié)點(diǎn)可以進(jìn)行查詢
db.getMongo().setSlaveOk()
rs0:SECONDARY> show dbs
TestDB 0.000GB
admin 0.000GB
config 0.000GB
local 0.000GB
-
故障轉(zhuǎn)移
把主節(jié)點(diǎn)端口停掉,再查看對應(yīng)的副本集的狀態(tài)
rs.status()
27017 : "stateStr" : "(not reachable/healthy)"
27018 : "stateStr" : "PRIMARY",
27019 : "stateStr" : "SECONDARY",
27018 變成了主節(jié)點(diǎn)
{
"set" : "rs0",
"date" : ISODate("2018-04-26T08:24:24.740Z"),
"myState" : 2,
"term" : NumberLong(4),
...
"members" : [
{
"_id" : 0,
"name" : "127.0.0.1:27017",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
...
},
{
"_id" : 1,
"name" : "127.0.0.1:27018",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
...
},
{
"_id" : 2,
"name" : "127.0.0.1:27019",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
...
}
],
"ok" : 1,
...
}
-
增加節(jié)點(diǎn)
mkdir r3 -
啟動新節(jié)點(diǎn)
mongod --relpSet rs0 --port 27020 --bind_ip 127.0.0.1 --dbpath .\r3\增加節(jié)點(diǎn)
rs.add("127.0.0.1:27020") { "ok" : 1, "operationTime" : Timestamp(1524731467, 1), "$clusterTime" : { "clusterTime" : Timestamp(1524731467, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } } }
在查看副本集的狀態(tài),可以看到 27020的新節(jié)點(diǎn), 連接到新的節(jié)點(diǎn)查看,數(shù)據(jù)已經(jīng)同步了
- 刪除節(jié)點(diǎn)
rs.remove("127.0.0.1:27020")
{
"ok" : 1,
"operationTime" : Timestamp(1524731753, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1524731753, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
再查看一下當(dāng)前副本集的狀態(tài),可以看到 27020的節(jié)點(diǎn)已經(jīng)被刪除了