MongoDB系列-解決面試中可能遇到的MongoDB復(fù)制集(replica set)問(wèn)題

關(guān)注我,可以獲取最新知識(shí)、經(jīng)典面試題以及微服務(wù)技術(shù)分享

??MongoDB復(fù)制集(replica set):MongoDB復(fù)制集維護(hù)相同數(shù)據(jù)集的一組mongod進(jìn)程,復(fù)制集是生產(chǎn)部署的基礎(chǔ),具有數(shù)據(jù)冗余以及高可用性。

那為什么要設(shè)置復(fù)制集(replica set)呢?

  • 由于復(fù)制集是通過(guò)在不同服務(wù)器上保存來(lái)副本,可保證數(shù)據(jù)在生產(chǎn)部署的冗余和可靠性,不會(huì)因?yàn)閱吸c(diǎn)問(wèn)題而丟失數(shù)據(jù)。
  • 可以通過(guò)訪問(wèn)不同服務(wù)器副本數(shù)據(jù)來(lái)提高數(shù)據(jù)讀取能力,從而提高整個(gè)系統(tǒng)的負(fù)載能力。

1. 復(fù)制集架構(gòu)原理

????副本集包含多個(gè)數(shù)據(jù)節(jié)點(diǎn)可選的一個(gè)仲裁節(jié)點(diǎn)。 而在數(shù)據(jù)節(jié)點(diǎn)中:只有一個(gè)主節(jié)點(diǎn)(primary node),其他節(jié)點(diǎn)為為從節(jié)點(diǎn)(secondary nodes)。
??各個(gè)節(jié)點(diǎn)成員通過(guò)心跳機(jī)制進(jìn)行通信,當(dāng)主節(jié)點(diǎn)與從節(jié)點(diǎn)的通信的時(shí)間超過(guò)配置的electionTimeoutMillis期間(默認(rèn)為10秒)時(shí),符合條件的從節(jié)點(diǎn)要求選舉將自己指定為新主節(jié)點(diǎn),群集嘗試完成新主節(jié)點(diǎn)的選舉并恢復(fù)正常操作。

主節(jié)點(diǎn): 副本集只能有一個(gè)主節(jié)點(diǎn)能夠確認(rèn)寫入操作來(lái)接收所有寫操作,并記錄其操作日志中的數(shù)據(jù)集的所有更改(記錄在oplog中)。

oplog: 它保存了修改存儲(chǔ)在數(shù)據(jù)庫(kù)中的數(shù)據(jù)的所有操作的滾動(dòng)記錄,MongoDB在主節(jié)點(diǎn)服務(wù)器上應(yīng)用數(shù)據(jù)庫(kù)操作,然后在主節(jié)點(diǎn)服務(wù)器的oplog上記錄操作,然后從節(jié)點(diǎn)成員在異步過(guò)程中通過(guò)心跳機(jī)制從任何其他成員導(dǎo)入oplog并應(yīng)用這些操作,oplog中的每個(gè)操作都是冪等的。所有副本集成員都在local.oplog.rs集合中包含oplog的副本,這允許它們維護(hù)數(shù)據(jù)庫(kù)的當(dāng)前狀態(tài)。

從節(jié)點(diǎn): 復(fù)制主節(jié)點(diǎn)的oplog并將oplog記錄的操作應(yīng)用于其數(shù)據(jù)集,如果主節(jié)點(diǎn)宕機(jī)了,將從符合條件的從節(jié)點(diǎn)選舉選出新的主節(jié)點(diǎn),。 而且你可以通過(guò)配置實(shí)現(xiàn)特定的功能,比如:

  • 防止從節(jié)點(diǎn)成為選舉中的主節(jié)點(diǎn)Primary,指定節(jié)點(diǎn)優(yōu)先級(jí)。
  • 阻止應(yīng)用程序從節(jié)點(diǎn)讀取數(shù)據(jù),從而允許應(yīng)用程序運(yùn)行需要與正常流量分離的應(yīng)用程序,隱藏節(jié)點(diǎn)。
  • 保留正在運(yùn)行的“歷史”快照,以用于從某些錯(cuò)誤中恢復(fù),例如無(wú)意中刪除的數(shù)據(jù)庫(kù),延遲節(jié)點(diǎn)

仲裁節(jié)點(diǎn): 仲裁節(jié)點(diǎn)不維護(hù)數(shù)據(jù)集。 仲裁節(jié)點(diǎn)的目的是通過(guò)響應(yīng)其他副本集節(jié)點(diǎn)的心跳和選舉請(qǐng)求來(lái)維護(hù)副本集中的仲裁。 因?yàn)樗鼈儾淮鎯?chǔ)數(shù)據(jù)集,所以仲裁節(jié)點(diǎn)可以是提供副本集仲裁功能的好方法,其資源成本比具有數(shù)據(jù)集的全功能副本集成員更便宜。 如果您的副本集具有偶數(shù)個(gè)成員,請(qǐng)?zhí)砑又俨霉?jié)點(diǎn)以獲得主要選舉中的大多數(shù)投票。而且仲裁節(jié)點(diǎn)總是只有1次選舉投票,因此允許副本集具有不均勻的投票成員數(shù),而沒(méi)有復(fù)制數(shù)據(jù)的額外成員的開(kāi)銷。

心跳機(jī)制(Hearbeat): 復(fù)制集成員間默認(rèn)每2s會(huì)發(fā)送一次心跳信息,如果10s未收到某個(gè)節(jié)點(diǎn)的心跳,則認(rèn)為該節(jié)點(diǎn)已宕機(jī)不可以訪問(wèn);如果宕機(jī)的節(jié)點(diǎn)為Primary,Secondary(前提是可被選為Primary)會(huì)發(fā)起新的Primary選舉。仲裁員與其他集合成員之間的唯一溝通是:選舉期間的投票,心跳和配置數(shù)據(jù),而且這些交換未加密。

數(shù)據(jù)同步: 為了維護(hù)共享數(shù)據(jù)集的最新副本,副本的從節(jié)點(diǎn)設(shè)置同步或復(fù)制來(lái)自其他節(jié)點(diǎn)的數(shù)據(jù)。 MongoDB使用兩種形式的數(shù)據(jù)同步:初始化同步新節(jié)點(diǎn)同步完整的數(shù)據(jù)集,以及整個(gè)集群節(jié)點(diǎn)同步后續(xù)數(shù)據(jù)更改。

其中,初始化同步(Initial Sync)過(guò)程:

  • 克隆除本地?cái)?shù)據(jù)庫(kù)之外的所有數(shù)據(jù)庫(kù)。 要進(jìn)行克隆,mongod會(huì)掃描每個(gè)源數(shù)據(jù)庫(kù)中的每個(gè)集合,并將所有數(shù)據(jù)插入到這些集合的自己的副本中。
    初始同步會(huì)在為每個(gè)集合復(fù)制文檔時(shí)構(gòu)建所有集合索引。 在早期版本的MongoDB中,在此階段僅構(gòu)建_id索引。

  • 初始同步在數(shù)據(jù)復(fù)制期間提取新添加的oplog記錄。 確保目標(biāo)成員在本地?cái)?shù)據(jù)庫(kù)中有足夠的磁盤空間,以便在此數(shù)據(jù)復(fù)制階段的持續(xù)時(shí)間內(nèi)臨時(shí)存儲(chǔ)這些oplog記錄。

  • 將所有更改應(yīng)用于數(shù)據(jù)集。 使用來(lái)自源的oplog,mongod更新其數(shù)據(jù)集以反映副本集的當(dāng)前狀態(tài)。
    初始同步完成后,成員從STARTUP2轉(zhuǎn)換為SECONDARY。

2. 標(biāo)準(zhǔn)復(fù)制集架構(gòu)

??標(biāo)準(zhǔn)復(fù)制集架構(gòu)由三臺(tái)服務(wù)器,其中包括三個(gè)數(shù)據(jù)節(jié)點(diǎn)(一個(gè)主節(jié)點(diǎn)、兩個(gè)從節(jié)點(diǎn))或兩個(gè)數(shù)據(jù)節(jié)點(diǎn)(一個(gè)主節(jié)點(diǎn)、一個(gè)從節(jié)點(diǎn))和一個(gè)仲裁節(jié)點(diǎn)兩種情況。如下所示:

三個(gè)數(shù)據(jù)節(jié)點(diǎn):

  • 一個(gè)主節(jié)點(diǎn);
  • 兩個(gè)從節(jié)點(diǎn),主節(jié)點(diǎn)宕機(jī)后,有機(jī)會(huì)選舉成為主節(jié)點(diǎn)。

當(dāng)主庫(kù)宕機(jī)后,兩個(gè)從庫(kù)都會(huì)進(jìn)行競(jìng)選,其中一個(gè)變?yōu)橹鲙?kù),當(dāng)原主庫(kù)恢復(fù)后,作為從庫(kù)加入當(dāng)前的復(fù)制集群即可。

兩個(gè)數(shù)據(jù)節(jié)點(diǎn)以及一個(gè)仲裁節(jié)點(diǎn):

  • 一個(gè)主節(jié)點(diǎn);
  • 一個(gè)從節(jié)點(diǎn),有機(jī)會(huì)被選舉成為主節(jié)點(diǎn);
  • 一個(gè)仲裁節(jié)點(diǎn),只有投票權(quán)利。

當(dāng)主節(jié)點(diǎn)不可用時(shí),將會(huì)選擇從節(jié)點(diǎn)成為主Primary,主節(jié)點(diǎn)恢復(fù)后,將其作為從節(jié)點(diǎn)加入到現(xiàn)有的復(fù)制集群中即可。

3. 節(jié)點(diǎn)類型

優(yōu)先級(jí)0型(Priority 0)節(jié)點(diǎn)

??優(yōu)先級(jí)0型節(jié)點(diǎn)不可以成為成為主節(jié)點(diǎn),也不能觸發(fā)選舉。將從節(jié)點(diǎn)配置為優(yōu)先級(jí)為0以防止它成為主節(jié)點(diǎn),這在多數(shù)據(jù)中心部署中特別有用,在許多情況下,您無(wú)需將備用數(shù)據(jù)庫(kù)設(shè)置為優(yōu)先級(jí)0.但是,在具有不同硬件或地理分布的副本集中,優(yōu)先級(jí)為0的備用數(shù)據(jù)庫(kù)可確保僅某些成員成為主數(shù)據(jù)庫(kù),這樣可以根據(jù)實(shí)際網(wǎng)絡(luò)分區(qū)的網(wǎng)絡(luò)質(zhì)量等實(shí)際情況進(jìn)行配置。

例如,一個(gè)數(shù)據(jù)中心承載主數(shù)據(jù)中心和輔助數(shù)據(jù)中心:

將第二個(gè)數(shù)據(jù)中心節(jié)點(diǎn)優(yōu)先級(jí)為0只能為從節(jié)點(diǎn)數(shù)據(jù)庫(kù),而數(shù)據(jù)中心1中的節(jié)點(diǎn)才能成為主節(jié)點(diǎn)數(shù)據(jù)庫(kù)。(比如你跨機(jī)房A、B部署了一個(gè)復(fù)制集,并且想指定Primary必須在A機(jī)房,這時(shí)可以將B機(jī)房的復(fù)制集成員Priority設(shè)置為0,這樣Primary就一定會(huì)是A機(jī)房的成員),

隱藏型(Hidden)節(jié)點(diǎn)

隱藏型(Hidden)節(jié)點(diǎn):

  • 隱藏型從節(jié)點(diǎn)是維護(hù)主數(shù)據(jù)集的副本,但對(duì)客戶端應(yīng)用程序不可見(jiàn)。隱藏型從節(jié)點(diǎn)適用于具有與副本集中其他成員不同的使用模式。
  • 隱藏型從節(jié)點(diǎn)必須始終優(yōu)先為0型從節(jié)點(diǎn),因此不能成為主節(jié)點(diǎn)。 隱藏型從節(jié)點(diǎn)可能會(huì)在選舉中投票。
  • 隱藏型從節(jié)點(diǎn)將不會(huì)收到來(lái)自應(yīng)用程序的請(qǐng)求。我們可以將隱藏型從節(jié)點(diǎn)專用于報(bào)表節(jié)點(diǎn)或是備份節(jié)點(diǎn)。

延遲型(Delayed)節(jié)點(diǎn)

??由于延遲型從節(jié)點(diǎn)是數(shù)據(jù)集的“滾動(dòng)備份”或運(yùn)行“歷史”快照,因此它們可以幫助您從各種人為錯(cuò)誤中恢復(fù)。 例如,延遲節(jié)點(diǎn)可以從不成功的應(yīng)用程序升級(jí)和操作員錯(cuò)誤(包括丟棄的數(shù)據(jù)庫(kù)和集合)中恢復(fù)。而且延遲型從節(jié)點(diǎn)一定是優(yōu)先級(jí)為0的從節(jié)點(diǎn),也是隱藏型從節(jié)點(diǎn)。不能成主節(jié)點(diǎn),也不能給客戶端查詢。

在選擇延遲量時(shí),請(qǐng)考慮延遲量:

  • 必須等于或大于預(yù)期的維護(hù)窗口持續(xù)時(shí)間。
  • 必須小于oplog的容量。

投票型(Vote)節(jié)點(diǎn)以及不可投票節(jié)點(diǎn)

??復(fù)制集節(jié)點(diǎn)可以通過(guò)配置members[n].votes來(lái)決定該節(jié)點(diǎn)是否具有投票權(quán)利!members[n].votes值為1具有投票權(quán)利為投票型節(jié)點(diǎn),為0則不可以投票即為不可投票節(jié)點(diǎn)。無(wú)表決權(quán)的節(jié)點(diǎn)必須優(yōu)先級(jí)為0,也是優(yōu)先級(jí)大于0的成員不能為0值。雖然無(wú)表決權(quán)的成員不在選舉中投票,但這些成員持有副本集數(shù)據(jù)的副本,并且可以接受來(lái)自客戶端應(yīng)用程序的讀取操作。

另外在副本集最多可包含50個(gè)成員,但只有7個(gè)投票成員,因此非投票成員允許副本集具有7個(gè)以上的成員。并投票成員只有具備以下?tīng)顟B(tài)可以進(jìn)行投票:

  • PRIMARY
  • SECONDARY
  • STARTUP2
  • RECOVERING
  • ARBITER
  • ROLLBACK

配置:

{
   "_id" : <num>,
   "host" : <hostname:port>,
   "arbiterOnly" : false,
   "buildIndexes" : true,
   "hidden" : false,
   "priority" : 0,
   "tags" : {
},
   "slaveDelay" : NumberLong(0),
   "votes" : 0
}

4. 部署結(jié)構(gòu):

最大投票成員為數(shù)量
??副本集最多可包含50個(gè)成員,但只有7個(gè)投票成員。 如果副本集已有7個(gè)投票成員,則其他成員必須是非投票成員。

部署奇數(shù)個(gè)成員
??副本集應(yīng)該確保具有奇數(shù)個(gè)投票成員,如果您擁有偶數(shù)個(gè)投票成員,請(qǐng)部署仲裁節(jié)點(diǎn),以便該集合具有奇數(shù)個(gè)投票成員。仲裁節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù)的副本并且需要更少的資源。 因此,您可以在應(yīng)用程序服務(wù)器或其他共享進(jìn)程上運(yùn)行仲裁程序。
容錯(cuò)能力
??副本集的容錯(cuò)是當(dāng)變?yōu)椴豢捎玫某蓡T數(shù),并且仍然在副本集中留下足夠的節(jié)點(diǎn)成員來(lái)選擇主節(jié)點(diǎn)成員。容錯(cuò)是副本集大小的影響, 見(jiàn)下表:

Number of Members Majority Required to Elect a New Primary Fault Tolerance
3 2 1
4 3 1
5 3 2
6 4 2

因此可以得出,將成員添加為偶數(shù)個(gè)到副本集并不總是會(huì)增加容錯(cuò)能力。但是,在這些情況下,其中將其中一個(gè)節(jié)點(diǎn)設(shè)置成隱藏型和延遲型從節(jié)點(diǎn)可以為專用功能提供支持,例如備份或報(bào)告。

提高讀負(fù)載能力
??在具有非常高讀取流量的部署中,您可以通過(guò)將讀取分發(fā)給從節(jié)點(diǎn)來(lái)提高讀取吞吐量。 隨著部署的增長(zhǎng),將節(jié)點(diǎn)添加或移動(dòng)到備用數(shù)據(jù)中心以提高冗余和可用性。

副本集分布在兩個(gè)或更多數(shù)據(jù)中心
副本集分布在兩個(gè)或更多數(shù)據(jù)中心的優(yōu)勢(shì):

  • 如果其中一個(gè)數(shù)據(jù)中心發(fā)生故障,數(shù)據(jù)仍可用于讀取。
  • 如果具有少數(shù)成員的數(shù)據(jù)中心發(fā)生故障,則副本集仍可以提供寫操作以及讀操作。但是,如果具有大多數(shù)成員的數(shù)據(jù)中心發(fā)生故障,則副本集將變?yōu)橹蛔x。

在不同地域部署數(shù)據(jù)節(jié)點(diǎn)(具有備用的數(shù)據(jù)中心)
??要在數(shù)據(jù)中心發(fā)生故障時(shí)保護(hù)您的數(shù)據(jù),請(qǐng)?jiān)趥溆脭?shù)據(jù)中心至少保留一個(gè)成員。 如果可能,使用奇數(shù)個(gè)數(shù)據(jù)中心,并選擇一個(gè)成員分布,以最大限度地提高即使丟失數(shù)據(jù)中心的可能性,剩余的副本集成員可以形成可以形成“大多數(shù)”選取出主節(jié)點(diǎn),并有提供數(shù)據(jù)的副本的能力。為確保主數(shù)據(jù)中心的節(jié)點(diǎn)在備用數(shù)據(jù)中心的成員之前被選為主要成員,請(qǐng)將備用數(shù)據(jù)中心中節(jié)點(diǎn)members[n].priority 設(shè)置為低于主數(shù)據(jù)中節(jié)點(diǎn),如下所示:

根據(jù)部署結(jié)構(gòu)部署復(fù)制集示例
三個(gè)節(jié)點(diǎn)成員的副本集,成員合理分布以及解析如下

  • 兩個(gè)數(shù)據(jù)中心:數(shù)據(jù)中心1的兩個(gè)成員和數(shù)據(jù)中心2的一個(gè)成員。如果副本集的其中一個(gè)成員是仲裁者,則將仲裁者分配給具有數(shù)據(jù)承載成員的數(shù)據(jù)中心1。
  • 如果數(shù)據(jù)中心1關(guān)閉,則副本集將變?yōu)橹蛔x。
  • 如果數(shù)據(jù)中心2關(guān)閉,則副本集仍然可寫,因?yàn)閿?shù)據(jù)中心1中的成員可以進(jìn)行選舉。
  • 三個(gè)數(shù)據(jù)中心:一個(gè)成員到數(shù)據(jù)中心1,一個(gè)成員到數(shù)據(jù)中心2,一個(gè)成員到數(shù)據(jù)中心3。
  • 如果任何數(shù)據(jù)中心發(fā)生故障,副本集仍然可寫,因?yàn)槠溆喑蓡T可以舉行選舉。

五副節(jié)點(diǎn)成員的副本集,成員合理分布以及解析如下:

  • 兩個(gè)數(shù)據(jù)中心:數(shù)據(jù)中心1的三個(gè)成員和數(shù)據(jù)中心2的兩個(gè)成員。
  • 如果數(shù)據(jù)中心1關(guān)閉,則副本集將變?yōu)橹蛔x。
  • 如果數(shù)據(jù)中心2關(guān)閉,則副本集仍然可寫,因?yàn)閿?shù)據(jù)中心1中的成員可以創(chuàng)建多數(shù)。
  • 三個(gè)數(shù)據(jù)中心:數(shù)據(jù)中心1的兩個(gè)成員,數(shù)據(jù)中心2的兩個(gè)成員和數(shù)據(jù)中心3的一個(gè)成員。
  • 如果任何數(shù)據(jù)中心發(fā)生故障,副本集仍然可寫,因?yàn)槠溆喑蓡T可以舉行選舉。

高可用
集群具有自主選舉能力,影響選取的因子和條件有以下:

  • 選取協(xié)議
  • 心跳機(jī)制:復(fù)制集成員間默認(rèn)每2s會(huì)發(fā)送一次心跳信息,如果10s未收到某個(gè)節(jié)點(diǎn)的心跳,則認(rèn)為該節(jié)點(diǎn)已宕機(jī)不可以訪問(wèn);如果宕機(jī)的節(jié)點(diǎn)為Primary,Secondary(前提是可被選為Primary)會(huì)發(fā)起新的Primary選舉。
  • 節(jié)點(diǎn)優(yōu)先權(quán):每個(gè)節(jié)點(diǎn)都會(huì)傾向于投票給優(yōu)先級(jí)最高的節(jié)點(diǎn),優(yōu)先級(jí)為0的節(jié)點(diǎn)不能成為主節(jié)點(diǎn)Primary,也不會(huì)主動(dòng)發(fā)起Primary選舉。當(dāng)Primary發(fā)現(xiàn)有優(yōu)先級(jí)更高Secondary,并且該Secondary的數(shù)據(jù)落后在10s內(nèi),則Primary會(huì)主動(dòng)降級(jí),讓優(yōu)先級(jí)更高的Secondary有成為Primary的機(jī)會(huì)。
  • 丟失數(shù)據(jù)中心:使用分布式副本集,數(shù)據(jù)中心的丟失可能會(huì)影響其他數(shù)據(jù)中心或數(shù)據(jù)中心中其余成員選擇主數(shù)據(jù)庫(kù)的能力。如果可能,在數(shù)據(jù)中心之間分發(fā)副本集成員,以最大限度地提高即使丟失數(shù)據(jù)中心的可能性,其余一個(gè)副本集成員也可以成為新的主要成員。
  • 網(wǎng)絡(luò)分區(qū):只有跟大多數(shù)投票節(jié)點(diǎn)間能保持網(wǎng)絡(luò)暢通,才有機(jī)會(huì)被選主節(jié)點(diǎn)Primary;如果Primary與大多數(shù)的節(jié)點(diǎn)失去聯(lián)系,Primary會(huì)主動(dòng)降級(jí)為Secondary。當(dāng)發(fā)生網(wǎng)絡(luò)分區(qū)時(shí),可能在短時(shí)間內(nèi)出現(xiàn)多個(gè)Primary,故Driver在寫入時(shí),最好設(shè)置『大多數(shù)成功』的策略,這樣即使出現(xiàn)多個(gè)Primary,也只有一個(gè)Primary能成功寫入大多數(shù)。

5. Write concern和Read Preference

5.1 Write concern

??Write concern描述了在操作返回成功之前必須確認(rèn)寫操作的數(shù)據(jù)承載成員(即主節(jié)點(diǎn)成員和從節(jié)點(diǎn)成員,但不是仲裁者)的數(shù)量。成員只能在收到并成功應(yīng)用寫入后才能確認(rèn)寫入操作。
對(duì)于副本集,默認(rèn)的w:1的Write concern 要求在返回Write concern確認(rèn)之前,只有Primary主節(jié)點(diǎn)確認(rèn)寫入。您可以指定一個(gè)大于1的整數(shù)值,以要求來(lái)自主節(jié)點(diǎn)的確認(rèn)以及滿足指定值所需的多個(gè)從節(jié)點(diǎn),最多為副本集中數(shù)據(jù)承載成員的總數(shù)。

??Client 發(fā)出帶有需要寫入請(qǐng)求的寫入操作Write concern將等待直到主節(jié)點(diǎn)接收來(lái)自指定需要寫入詢問(wèn)所有數(shù)量的成員的確認(rèn)。對(duì)于大于1或w:“majority ”的寫入咨詢 Write concern,主節(jié)點(diǎn)接收到所需的從節(jié)點(diǎn)數(shù)量在返回確認(rèn)可寫入答復(fù)通知client確認(rèn)寫入。對(duì)于w:1的寫入咨詢Write Concern,主要可以在本地應(yīng)用(單機(jī)模式)寫入時(shí)立即返回可寫入答復(fù),因?yàn)樗匈Y格對(duì)所請(qǐng)求的Write Concern做出判決。

??指定超時(shí)等待寫入咨詢Write concern的寫操作僅表示所需數(shù)量的副本集成員未在wtimeout時(shí)間段內(nèi)確認(rèn)寫操作。它不一定表示主節(jié)點(diǎn)Primary未能應(yīng)用寫入。

檢驗(yàn)寫操作
在insert()方法中增加write Concern選項(xiàng),并指定“大多數(shù)”寫入關(guān)注和5秒超時(shí),以便操作不會(huì)無(wú)限期地阻塞,如下:

db.products.insert(
{ item: "envelopes", qty : 100, type: "Clasp" },
{ writeConcern: { w: "majority" , wtimeout: 5000 } }
)

??例如,在3個(gè)節(jié)點(diǎn)成員的副本集中,操作將需要來(lái)自3個(gè)成員中的2個(gè)的確認(rèn)。如果稍后縮放副本集以包括兩個(gè)額外的投票節(jié)點(diǎn),則相同的操作將需要來(lái)自5個(gè)副本集成員中的3個(gè)的確認(rèn)。如果主節(jié)點(diǎn)服務(wù)器未在wtimeout限制內(nèi)返回寫入咨詢 Write concern確認(rèn),則寫入操作將失敗并出現(xiàn)寫入問(wèn)題錯(cuò)誤。

修改默認(rèn)Write Concern
??可以通過(guò)在副本集配置中設(shè)置settings.getLastErrorDefaults設(shè)置來(lái)修改副本集的默認(rèn)寫入問(wèn)題。配置在返回之前等待寫操作(在大多數(shù)投票成員上確認(rèn)后)操作命令:

cfg = rs.conf()
cfg.settings.getLastErrorDefaults = { w: "majority", wtimeout: 5000 }
rs.reconfig(cfg)

5.2 Read Preference

??Read Preference是mongodb如何將讀操作分配到節(jié)點(diǎn)中,默認(rèn)情況下,應(yīng)用程序?qū)⑵渥x取操作定向到副本集中的主要成員(即讀取首選項(xiàng)模式“primary”)。 但是,客戶端可以指定讀取首選項(xiàng)以將讀取操作發(fā)送到輔助節(jié)點(diǎn)。Read Preference 模式如下:

  • primary: 默認(rèn)規(guī)則,所有讀請(qǐng)求發(fā)到Primary
  • primaryPreferred: Primary優(yōu)先,如果Primary不可達(dá),請(qǐng)求Secondary
  • secondary: 所有的讀請(qǐng)求都發(fā)到secondary
  • secondaryPreferred:Secondary優(yōu)先,當(dāng)所有Secondary不可達(dá)時(shí),請(qǐng)求Primary
  • nearest:讀請(qǐng)求發(fā)送到最近的可達(dá)節(jié)點(diǎn)上(通過(guò)ping探測(cè)得出最近的節(jié)點(diǎn))

以下是使用讀取首選項(xiàng)模式的常見(jiàn)用例:

  • 為地理分布的應(yīng)用程序提供本地讀取。
  • 如果您在多個(gè)數(shù)據(jù)中心中安裝了應(yīng)用程序服務(wù)器,則可以考慮使用地理位置分散的副本集并使用非主要或最近的讀取首選項(xiàng)。 這允許客戶端從最低延遲成員讀取,而不是始終從主要成員讀取。
  • 在故障轉(zhuǎn)移期間維護(hù)可用性。
  • 如果希望應(yīng)用程序在正常情況下從主數(shù)據(jù)庫(kù)讀取,則允許使用primaryPreferred,但在主數(shù)據(jù)庫(kù)不可用時(shí)允許從輔助服務(wù)器讀取過(guò)時(shí)的數(shù)據(jù)。 這為故障轉(zhuǎn)移期間的應(yīng)用程序提供了“只讀模式”。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 副本集概述 某些情況下,副本可以提供更高的讀取容量,就像客戶端可以發(fā)送讀操作到不同的服務(wù)器。在不同數(shù)據(jù)中心維...
    LLLeon閱讀 10,633評(píng)論 2 7
  • Replica Set功能 1, Replica Set是指一組服務(wù)器的集群,其中有一個(gè)主服務(wù)器,用于處理用戶的請(qǐng)...
    持續(xù)進(jìn)步者閱讀 4,003評(píng)論 2 10
  • MongoDB的集群模式有三種: 主從(Master-Slaver),MongoDB 3.6徹底廢棄 副本集(Re...
    AaronSimon閱讀 5,166評(píng)論 0 4
  • 主從復(fù)制:主節(jié)點(diǎn)寫入數(shù)據(jù),從通過(guò)讀取主的oplog得到復(fù)制信息,開(kāi)始復(fù)制數(shù)據(jù)并且將復(fù)制信息寫入到自己的oplog。...
    米刀靈閱讀 3,341評(píng)論 1 1
  • 復(fù)制集 mongodb在集群環(huán)境中,通過(guò)復(fù)制的形式對(duì)數(shù)據(jù)進(jìn)行冗余。mongodb復(fù)制集有Primary、Secon...
    奕_然閱讀 2,106評(píng)論 0 2

友情鏈接更多精彩內(nèi)容