您好,登錄后才能下訂單哦!
復制是在多臺服務器之間同步數據的過程。
復制在為數據提供了冗余同時,也提高了數據的可用性。由于在不同的數據庫服務器上擁有多個數據鏡像,復制可以有效的防止由于單臺服務器故障而導致的數據丟失。復制還能夠幫助我們從硬件故障或是服務中斷中恢復數據。我們也可以通過增加復制節點來將其用于災難恢復、報表或是備份。
在某些情況中,我們可以通過復制的方式來提高讀的性能。客戶端可以將讀與寫請求分別發送到不同的服務器上。我們還能夠通過在其他數據中心建立分布式復制節點的方式來做異地冗災,以進一步提高可用性。
復制集是由一組擁有相同數據集的 mongod 實例組成的。其中的一個節點為主節點(Primary),所有的寫請求都是在它上面完成的。而其他的節點都是從節點(secondary),從節點接收從主節點上傳來的操作并應用,并以此來保證其與主節點的數據集一致。
主節點 接收所有來自客戶端的寫操作。一個復制集只能有一個主節點。由于在一個復制集中只有一個成員能夠接收寫操作,復制集為所有來自主節點的讀提供了 嚴格的一致性校驗 。主節點通過將所有數據集的變動記錄到 oplog 中以支持復制的實現。
從節點 將主節點上的oplog復制過來并應用這些操作來修改其自己的數據集以確保從節點的數據集與主節點的數據集一致。一旦主節點不可用了,復制集就會將一個從節點選舉成為新的主節點。客戶端默認是從主節點進行讀操作,但是客戶端也可以通過指定 復制集讀選項 來將讀操作發送給從節點。需要注意的是,在從節點上進行讀操作時,所獲得的數據可能不是此時主節點上的值
我們也可以為復制集新增一個額外的 mongod 實例作為 投票節點 。投票節點中并不包含數據集,投票節點的作用僅僅是在選舉過程中參與投票。當復制集的成員個數為偶數時,添加一個投票節點可以防止平局的出現,通過多數選票來選舉出新的主節點。由于投票節點僅提供投票功能,故無需一個專用的物理機。
投票節點 將只做投票使用。當 主節點 降職變為 從節點 的時候,其他的一個 從節點 將在選舉中被推選為主節點。
從節點從主節點上應用操作的過程是異步的。由于從節點是在主節點之后應用操作的,所以復制集在缺少某些成員的時候仍能繼續運行。然而在這種情況下,從節點返回給客戶端的數據可能并不是最新的數據。
當主節點無法與復制集中其他成員進行溝通超過10秒時,復制集將嘗試推舉另一位成員成為新的主節點。這時,第一個獲得多數投票的從節點將升職為主節點。
復制集提供了一些選項來支持實際應用時的需求。例如,將一個復制集分布在多個數據中心 ,又或是通過設置 priority 來控制選舉的結果。復制集同時也支持將成員用于報表、災難恢復或是備份。
MongoDB的 復制集 是由一組 mongod 實例所組成的,并提供了數據冗余與高可用性。復制集中的成員有以下幾種:
Primary.
主節點 接收所有的寫操作請求。
Secondaries.
從節點通過應用主節點傳來的數據變動操作來保持其數據集與主節點的一致。從節點也可以通過增加額外的參數配置來對應特殊的需求。例如,從節點可以是 non-voting 或是 priority 0 。
我們也可以為復制集設置一個 投票節點 。投票節點其本身并不包含數據集。但是,一旦當前的主節點不可用時,投票節點就會參與到新的主節點選舉的投票中。
一個復制集最多可以擁有12個成員。 [1] 但是同時最多只有其中的7個可以進行投票。
一個復制集至少需要這幾個成員:一個 主節點 ,一個 從節點 ,和一個 投票節點 。但是在大多數情況下,我們會保持3個擁有數據集的節點:一個 主節點 和兩個 從節點 。
在復制集中,主節點是唯一能夠接收寫請求的節點。MongoDB在 主節點 上進行寫操作,并會將這些操作記錄到主節點的 oplog 中。 從節點 會將oplog復制到其本機并將這些操作應用到其自己的數據集上。
在擁有下述三個成員的復制集中,主節點將接收所有的寫請求,而從節點會將oplog復制到本機并在其自己的數據集上應用這些操作。
復制集中任何成員都可以接收讀請求。但是默認情況下,應用程序會直接連接到在主節點上進行讀操作。
復制集最多只能擁有一個主節點。一旦當前的主節點不可用了,復制集就會選舉出新的主節點。
在擁有下述三個成員的復制集中,一旦當前主節點不可用了,就會觸發選舉機制,并將在剩下的從節點中選舉出一個新的主節點。
從節點的數據集與 主節點 中的一致。從節點將主節點上的 oplog 復制到本機,并異步的將這些操作記錄應用在其自己的數據集上。每個復制集可以擁有多個從節點。
下述由三個成員組成的復制集擁有兩個從節點。這些從節點將主節點上的oplog復制過來并應用在其自己的數據集上。
客戶端雖然無法在從節點上進行寫操作,但卻可以進行讀操作。
從節點是可以升職為主節點的。一旦現有的主節點不可用了,那么復制集將會發起 election 來選擇將哪個從節點提升為新的主節點。
在擁有下述三個成員的復制集中,一旦當前主節點不可用了,就會觸發選舉機制,并將在剩下的從節點中選舉出一個新的主節點。
我們可以通過修改參數的方式來將從節點用于特殊的需求。例如:
我們可以通過禁止從節點升職為主節點的方式來將該節點永駐為從節點或是用于冷備。
我們可以通過禁止應用在該從節點上進行讀操作的方式,來讓一些需要進行流量隔離的應用在其上進行讀。
我們可以通過設置 “延時備份節點” 的方式來防止諸如誤刪除等的誤操作或是錯誤。
一旦將優先級設置為0,那么該從節點將 不能 升職為 主節點 。 優先級為0 的成員不會 觸發 選舉 。除此之外該節點與其他從節點沒有區別,優先級為0 的從節點擁有與主節點一致的數據集,能接受讀請求,同時也能參與投票。通過將從節點的 優先級設置為0 來防止其升職為主節點可以在分布式數據中心的結構中起到很好的作用。
在下述這樣的擁有三個成員的復制集中,一個主節點和一個從節點坐落在某一個數據中心中,另一個不能升職為主節點的 優先級為0 的從節點則在另一個數據中心。
將優先級為0的成員作為備用節點
在很多情況下,我們可能不需要準備一個 優先級為0 的備用節點。然而在一些硬件環境或是架構的 地理分布 較為多變的情境中,一個 優先級為0 的備用節點可以很好的保證符合條件的成員升職為主節點。
一個擁有特殊硬件配置或是系統優化配置的 優先級為0 的備用節點也可以有效的為特殊需求提供服務。比如可以將 優先級設置為0 來讓其不能升職為主節點。
如果我們的復制集中已經有了七個參與投票的節點,那么請將其他節點設置為 不參與投票 。
當配置一個 優先級為0 的節點時,我們需要考慮到可能出現的故障切換情況,比如網絡故障等。需要注意的時,我們要確保在主數據中心中擁有足夠多可以參與投票和選舉的節點,并確保其擁有可以順利成為主節點的成員。
隱藏節點擁有與 主節點 一致的數據集,但是它對于應用程序來說是 不可見 的。隱藏節點可以很好的與 復制集 中的其他節點隔離,并應對特殊的需求。隱藏節點也應該是一個 不能升職為主節點 的 優先級為0的節點 。函數 db.isMaster() 將不會列出隱藏節點。隱藏節點在 選舉 中是 可以進行投票 的。
在下述這樣擁有五個節點的復制集中,四個從節點都擁有與主節點一致的數據集,但其中的一個從節點是隱藏節點。
客戶端將不會把讀請求分發到隱藏節點上,即使我們設定了 復制集讀選項 。這些隱藏節點將不會收到來自應用程序的請求。我們可以將隱藏節點專用于報表節點或是備份節點。 延時節點 也應該是一個隱藏節點。
在分片集群中, mongos 將不與隱藏節點進行交流。
在復制集的選舉中,隱藏節點是會 參加 投票的。當關閉一個隱藏節點的時候,請確認復制集中的可用節點個數足夠進行選舉,以防 主節點 降職導致復制集對外不可用。
將隱藏節點用于備份,可以防止我們在備份過程中使用 db.fsyncLock() 和 db.fsyncUnlock() 操作來對 mongod 實例加或解除寫鎖的過程中應用程序的不可用。
延時節點也將從 復制集 中主節點復制數據,然而延時節點中的數據集將會比復制集中主節點的數據延后。舉個例子,現在是09:52,如果延時節點延后了1小時,那么延時節點的數據集中將不會有08:52之后的操作。
由于延時節點的數據集是延時的,因此它可以幫助我們在人為誤操作或是其他意外情況下恢復數據。舉個例子,當應用升級失敗,或是誤操作刪除了表和數據庫時,我們可以通過延時節點進行數據恢復。
延時節點通過延時應用 oplog 中的操作來實現其延時的效果。當我們選擇延時時常的時候,需要考慮到以下內容:
必須大于或者等于你的維護視窗。
必須 小于 oplog的存儲能力
在分片集群中,當 平衡器 平衡器打開的時候延時節點效果有限。因為延時節點延時的復制數據段,而若在延時的時間段內進行過數據段遷移的話,復制集中的延時節點就無法為還原分片集群提供有效的幫助
在下述這樣擁有五個成員的復制集中,主節點與所有從節點都擁有數據集的副本。其中一個從節點延時3600秒(1小時)應用oplog中的操作。這個延時節點同時也是 隱藏節點 和 優先級為0 的節點。
延時節點需要將 priority 設置為0,還需要將 hidden 設置為 true ,同時還需要將 slaveDelay 設置為想要延遲的時間(單位為秒):
{ "_id" : <num>, "host" : <hostname:port>, "priority" : 0, "slaveDelay" : <seconds>, "hidden" : true}
投票節點 并不含有 復制集中的數據集副本,且也 無法 升職為主節點。復制集中可能會有多個投票節點來為 選舉出新的主節點 進行投票。投票節點的存在使得復制集可以以偶數個節點存在,而無需為復制集再新增節點。
注意
不要將投票節點運行在復制集的主節點或者從節點機器上。
僅僅在復制集成員為偶數個的時候加入投票節點。如果在擁有奇數個復制集成員的復制集中新增了一個投票節點,復制集可能會遇到 選舉 僵局。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。