邏輯圖

復(fù)制集中主要有三類節(jié)點(diǎn):
Primary節(jié)點(diǎn):主節(jié)點(diǎn),寫操作只能在主節(jié)點(diǎn)上進(jìn)行,primary節(jié)點(diǎn)把操作記錄在primary節(jié)點(diǎn)的oplog中,從節(jié)點(diǎn)從oplog中同步數(shù)據(jù)。
The primary is the only member in the replica set that receives write operations. MongoDB applies write operations on the primary and then records the operations on the primary’s oplog. Secondary members replicate this log and apply the operations to their data sets.
Secondary節(jié)點(diǎn):從節(jié)點(diǎn),從節(jié)點(diǎn)從主節(jié)點(diǎn)的oplog中同步數(shù)據(jù)。
A secondary maintains a copy of the primary’s data set. To replicate data, a secondary applies operations from the primary’s oplog to its own data set in an asynchronous process. A replica set can have one or more secondaries.
Arbiter節(jié)點(diǎn):仲裁節(jié)點(diǎn),仲裁節(jié)點(diǎn)不存儲數(shù)據(jù)也不會成為主節(jié)點(diǎn),它只在選舉的時候投一票。當(dāng)復(fù)制集成員為偶數(shù)時,最好加入一個仲裁節(jié)點(diǎn),以提升復(fù)制集可用性。
An arbiter does not have a copy of data set and cannot become a primary. Replica sets may have arbiters to add a vote in elections for primary.
下面的操作是如何配置復(fù)制集
一個主節(jié)點(diǎn),一個從節(jié)點(diǎn),一個仲裁節(jié)點(diǎn)
2.1 配置mongod.conf
編輯mongodb的配置文件
sudo vim /etc/mongod.conf
在replication下添加(注意yml格式)
replication:
replSetName: GridSum
該操作是開啟復(fù)制集并為復(fù)制集設(shè)置名稱為GridSum
在所有要同步的mongodb節(jié)點(diǎn)上都執(zhí)行上面的配置,注意復(fù)制集的名稱一定要一致,也就是主節(jié)點(diǎn),從節(jié)點(diǎn)和仲裁節(jié)點(diǎn)都進(jìn)行相同的配置。
2.2 在主節(jié)點(diǎn)上執(zhí)行rs.initiate()
配置好復(fù)制集之后登錄到有數(shù)據(jù)的節(jié)點(diǎn),注意一定要在有數(shù)據(jù)的節(jié)點(diǎn)上配置,也就是主節(jié)點(diǎn)。
定義一個config配置,將需要同步的節(jié)點(diǎn)配置進(jìn)來(注意引號和括號都是英文狀態(tài)下的)
config={
_id:"GridSum",
members:[
{_id:0,host:"10.203.40.114:27017"},
{_id:1,host:"10.203.40.115:27017"},
{_id:3,host:"10.203.40.116:27017",arbiterOnly:true}
]
}
上面的配置是將10.203.40.114:27017,10.203.40.115:27017,10.203.40.116:27017,添加到復(fù)制集,并指定116節(jié)點(diǎn)為仲裁節(jié)點(diǎn)。
定義好config之后執(zhí)行
rs.initiate(config);
如果出現(xiàn)下面的結(jié)果說明配置成功
{ "ok" : 1 }
可以通過
rs.status();
查看復(fù)制集的狀態(tài)可以看出哪個是主節(jié)點(diǎn),哪個是從節(jié)點(diǎn),那個是仲裁節(jié)點(diǎn)
下面是一個rs.status()的示例
{
"set" : "GridSum",
"date" : ISODate("2017-10-14T09:03:00.713Z"),
"myState" : 7,
"term" : NumberLong(4),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1507971772, 1),
"t" : NumberLong(4)
},
"appliedOpTime" : {
"ts" : Timestamp(1507971772, 1),
"t" : NumberLong(4)
},
"durableOpTime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
}
},
"members" : [
{
"_id" : 3,
"name" : "10.203.40.114:27017",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 3981643,
"configVersion" : 6,
"self" : true
},
{
"_id" : 4,
"name" : "10.203.40.115:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 3901957,
"optime" : {
"ts" : Timestamp(1507971772, 1),
"t" : NumberLong(4)
},
"optimeDurable" : {
"ts" : Timestamp(1507971772, 1),
"t" : NumberLong(4)
},
"optimeDate" : ISODate("2017-10-14T09:02:52Z"),
"optimeDurableDate" : ISODate("2017-10-14T09:02:52Z"),
"lastHeartbeat" : ISODate("2017-10-14T09:02:57.244Z"),
"lastHeartbeatRecv" : ISODate("2017-10-14T09:03:00.618Z"),
"pingMs" : NumberLong(0),
"electionTime" : Timestamp(1505718572, 1),
"electionDate" : ISODate("2017-09-18T07:09:32Z"),
"configVersion" : 6
},
{
"_id" : 5,
"name" : "10.203.40.116:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 3901493,
"optime" : {
"ts" : Timestamp(1507971772, 1),
"t" : NumberLong(4)
},
"optimeDurable" : {
"ts" : Timestamp(1507971772, 1),
"t" : NumberLong(4)
},
"optimeDate" : ISODate("2017-10-14T09:02:52Z"),
"optimeDurableDate" : ISODate("2017-10-14T09:02:52Z"),
"lastHeartbeat" : ISODate("2017-10-14T09:02:57.243Z"),
"lastHeartbeatRecv" : ISODate("2017-10-14T09:03:00.483Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "10.203.40.115:27017",
"configVersion" : 6
}
],
"ok" : 1
}
示例中members是節(jié)點(diǎn)列表,節(jié)點(diǎn)的stateStr表示節(jié)點(diǎn)的類型,上面示例中10.203.40.114是仲裁節(jié)點(diǎn)(ARBITER),10.203.40.115是主節(jié)點(diǎn)(PRIMARY),10.203.40.116是從節(jié)點(diǎn)(SECONDARY)。
2.3 動態(tài)修改節(jié)點(diǎn)
在主節(jié)點(diǎn)上可以動態(tài)添加,移除節(jié)點(diǎn).
添加節(jié)點(diǎn)
rs.add('10.203.40.116:27017')
添加仲裁節(jié)點(diǎn)
rs.add('10.203.40.116:27017', true)
刪除節(jié)點(diǎn)
rs.remove('10.203.40.116:27017')
注意事項(xiàng)
如果rs.initiate(config)時如果出現(xiàn)
{
"ok" : 0,
"errmsg" : "'10.203.40.114:27017' has data already, cannot initiate set.",
"code" : 110,
"codeName" : "CannotInitializeNodeWithData"
}
網(wǎng)上大部分說法是在其他的mongodb上執(zhí)行db.dropDatabase(),我試了還是不行。
解決方法:停掉其他mongdb服務(wù)器,然后把停掉的mongodb data目錄里面的數(shù)據(jù)全部刪除
再啟動,然后重新配置就可以了。data目錄可以在配置文件查找
通過第一步安裝的mongodb配置文件在/etc/mongod.conf
配置文件中的storage.dbPath就是mongodb的data目錄。
storage:
dbPath: /var/lib/mongo
這里是data目錄是/var/lib/mongo目錄。
從節(jié)點(diǎn)是不能執(zhí)行任何操作的,
如果要從從節(jié)點(diǎn)上能查詢數(shù)據(jù)
在要查詢的從節(jié)點(diǎn)上執(zhí)行
rs.slaveOk();
就可以查詢數(shù)據(jù)了
參看文獻(xiàn)
https://docs.mongodb.com/manual/tutorial/deploy-replica-set/