- 求職 : Linux運(yùn)維
- 論壇徽章:
- 203
|
MongoDB支持客戶(hù)端靈活配置寫(xiě)入策略(writeConcern),以滿(mǎn)足不同場(chǎng)景的需求。
db.collection.insert({x: 1}, {writeConcern: {w: 1}})
writeConcern選項(xiàng)
MongoDB支持的WriteConncern選項(xiàng)如下
w: 數(shù)據(jù)寫(xiě)入到number個(gè)節(jié)點(diǎn)才向用客戶(hù)端確認(rèn)
{w: 0} 對(duì)客戶(hù)端的寫(xiě)入不需要發(fā)送任何確認(rèn),適用于性能要求高,但不關(guān)注正確性的場(chǎng)景
{w: 1} 默認(rèn)的writeConcern,數(shù)據(jù)寫(xiě)入到Primary就向客戶(hù)端發(fā)送確認(rèn)
{w: “majority”} 數(shù)據(jù)寫(xiě)入到副本集大多數(shù)成員后向客戶(hù)端發(fā)送確認(rèn),適用于對(duì)數(shù)據(jù)安全性要求比較高的場(chǎng)景,該選項(xiàng)會(huì)降低寫(xiě)入性能
j: 寫(xiě)入操作的journal持久化后才向客戶(hù)端確認(rèn)
默認(rèn)為”{j: false},如果要求Primary寫(xiě)入持久化了才向客戶(hù)端確認(rèn),則指定該選項(xiàng)為true
wtimeout: 寫(xiě)入超時(shí)時(shí)間,僅w的值大于1時(shí)有效。
當(dāng)指定{w: }時(shí),數(shù)據(jù)需要成功寫(xiě)入number個(gè)節(jié)點(diǎn)才算成功,如果寫(xiě)入過(guò)程中有節(jié)點(diǎn)故障,可能導(dǎo)致這個(gè)條件一直不能滿(mǎn)足,從而一直不能向客戶(hù)端發(fā)送確認(rèn)結(jié)果,針對(duì)這種情況,客戶(hù)端可設(shè)置wtimeout選項(xiàng)來(lái)指定超時(shí)時(shí)間,當(dāng)寫(xiě)入過(guò)程持續(xù)超過(guò)該時(shí)間仍未結(jié)束,則認(rèn)為寫(xiě)入失敗。
{w: “majority”}解析
{w: 1}、{j: true}等writeConcern選項(xiàng)很好理解,Primary等待條件滿(mǎn)足發(fā)送確認(rèn);但{w: “majority”}則相對(duì)復(fù)雜些,需要確認(rèn)數(shù)據(jù)成功寫(xiě)入到大多數(shù)節(jié)點(diǎn)才算成功,而MongoDB的復(fù)制是通過(guò)Secondary不斷拉取oplog并重放來(lái)實(shí)現(xiàn)的,并不是Primary主動(dòng)將寫(xiě)入同步給Secondary,那么Primary是如何確認(rèn)數(shù)據(jù)已成功寫(xiě)入到大多數(shù)節(jié)點(diǎn)的?
http://77g6ez.com1.z0.glb.clouddn.com/majority.png
333.jpg (27.17 KB, 下載次數(shù): 39)
下載附件
2016-06-14 10:48 上傳
Client向Primary發(fā)起請(qǐng)求,指定writeConcern為{w: “majority”},Primary收到請(qǐng)求,本地寫(xiě)入并記錄寫(xiě)請(qǐng)求到oplog,然后等待大多數(shù)節(jié)點(diǎn)都同步了這條/批oplog(Secondary應(yīng)用完oplog會(huì)向主報(bào)告最新進(jìn)度)。
Secondary拉取到Primary上新寫(xiě)入的oplog,本地重放并記錄oplog。為了讓Secondary能在第一時(shí)間內(nèi)拉取到主上的oplog,find命令支持一個(gè)awaitData的選項(xiàng),當(dāng)find沒(méi)有任何符合條件的文檔時(shí),并不立即返回,而是等待最多maxTimeMS(默認(rèn)為2s)時(shí)間看是否有新的符合條件的數(shù)據(jù),如果有就返回;所以當(dāng)新寫(xiě)入oplog時(shí),備立馬能獲取到新的oplog。
Secondary上有單獨(dú)的線(xiàn)程,當(dāng)oplog的最新時(shí)間戳發(fā)生更新時(shí),就會(huì)向Primary發(fā)送replSetUpdatePosition命令更新自己的oplog時(shí)間戳。
當(dāng)Primary發(fā)現(xiàn)有足夠多的節(jié)點(diǎn)oplog時(shí)間戳已經(jīng)滿(mǎn)足條件了,向客戶(hù)端發(fā)送確認(rèn)。 |
|