2016-08-04 37 views
0

假設我有一個Primary (A) &兩個secondary (B, C)。如果我正在使用write majority進行寫入。可有一個人請解釋一下我下面疑惑: -在Mongo上編寫多數和二級讀取偏好

  1. 比方說,寫,用majority完成,它在 A & B的數據更新,寫還不傳播到C。在如果 讀來使用secondarysecondary preferred 將查詢從它具有最新的數據或 蒙戈不能出示擔保這和讀可以從 C返回過時的數據B服務的同一數據這個時候。
  2. 讓我們假設寫一次是用大多數人再次完成的,假設 的寫入是在A上完成的,然後在 的第二個B之一中正在進行寫入。如果當時讀取將被阻止 或它會提供C陳舊的數據?
  3. 比方說,我已經拿出了第二個C,同樣的案例在 進展中,正如我們在上述案例中提到的那樣。從 次要B讀取將被阻止,直到寫入完成B或讀取 將不會被阻止和陳舊的數據將從B提供?

環境

  • 蒙戈版 - 3.0.9
  • 存儲引擎 - MMAPv1

回答

1

MongoDB的複製過程是異步二次。如果讀取的關注點設置爲「多數」,則可以讀取陳舊的數據。基本上,這意味着您已將讀取首選項設置爲最終一致性。

如果讀取的關注點設置爲「本地」,您將從主要獲取最新數據。

請注意,只能在WiredTiger存儲引擎中使用readConcern級別的「多數」級別。 WiredTiger存儲引擎只追加存儲引擎,並沒有使用適當的更新。沒有鎖並提供文檔級併發性。

閱讀關注=「多數」

查詢返回的實例最近證實 寫入到副本集大部分成員的數據副本。

要使用的「多數」讀的關注程度,你必須如果使用的是配置 文件中使用WiredTiger 存儲引擎,並開始與 --enableMajorityReadConcern命令行選項(或replication.enableMajorityReadConcern設定的mongod實例)。

問題1:蒙戈不保證讀取將從其中寫入數據的二次送達?

答案1: MongoDB不能保證這一點。次要選擇取決於以下內容: -

當您選擇非主要讀取首選項時,驅動程序將根據各種因素確定要指定哪個成員。請參閱此鏈接。 Read preference mechanics member selection

問題2:即使寫上相同的數據的進展讀數將永遠不會受阻?

答案2:閱讀不會被阻止。但是,您可能會閱讀一些陳舊的數據。

讀取可能會錯過在讀操作的過程中 更新相符的文件。

Concurrency locking what isolation guarantees does MongoDB provide

+0

即使我設置寫爲多數(寫入'Primary'&大部分'Secondary'的),如果我讀通過設置'讀preference'設定爲'secondary'或'次級優選的'。 mongo不保證讀取將從寫入數據的次要服務器中提供。即使在相同數據的寫入過程中,讀取也不會被阻止? – tuk

+0

我只是想知道這是否回答你的問題? – notionquest

+0

我在問我的理解是否正確 - *即使我將寫作設置爲多數(寫入小學和大多數中學),並且如果我通過將讀取首選項設置爲第二或第二首選來讀取。 mongo不保證讀取將從寫入數據的次要服務器中提供。即使正在寫入同一數據,讀數也不會被阻止?* – tuk