1. 程式人生 > >MongoDB之複製集篇

MongoDB之複製集篇

MongoDB之複製集篇

  • A+

所屬分類:Database MongoDB

 

 

MongoDB複製集

MongoDB複製集簡介

一組Mongodb複製集,就是一組mongod程序,這些程序維護同一個資料集合。複製集提供了資料冗餘和高等級的可靠性,這是生產部署的基礎

複製集的目的

保證資料在生產部署時的冗餘和可靠性,通過在不同的機器上儲存副本來保證資料的不會因為單點損壞而丟失。能夠隨時應對資料丟失、機器損壞帶來的風險。
換一句話來說,還能提高讀取能力,使用者的讀取伺服器和寫入伺服器在不同的地方,而且,由不同的伺服器為不同的使用者提供服務,提高整個系統的負載。

複製集功能介紹

一組複製集就是一組mongod例項掌管同一個資料集,例項可以在不同的機器上面。例項中包含一個主導,接受客戶端所有的寫入操作,其他都是副本例項,從主伺服器上獲得資料並保持同步。
主伺服器很重要,包含了所有的改變操作(寫)的日誌。但是副本伺服器叢集包含有所有的主伺服器資料,因此當主伺服器掛掉了,就會在副本伺服器上重新選取一個成為主伺服器。
每個複製集還有一個仲裁者,仲裁者不儲存資料,只是負責通過心跳包來確認叢集中集合的數量,並在主伺服器選舉的時候作為仲裁決定結果。

副本集中資料同步

副本集中資料同步過程:Primary節點寫入資料,Secondary通過讀取Primary的oplog得到複製資訊,開始複製資料並且將複製資訊寫入到自己的oplog。如果某個操作失敗,則備份節點停止從當前資料來源複製資料。如果某個備份節點由於某些原因掛掉了,當重新啟動後,就會自動從oplog的最後一個操作開始同步,同步完成後,將資訊寫入自己的oplog,由於複製操作是先複製資料,複製完成後再寫入oplog,有可能相同的操作會同步兩份,不過MongoDB在設計之初就考慮到這個問題,將oplog的同一個操作執行多次,與執行一次的效果是一樣的。簡單的說就是:

當Primary節點完成資料操作後,Secondary會做出一系列的動作保證資料的同步:

  • 檢查自己local庫的oplog.rs集合找出最近的時間戳。

  • 檢查Primary節點local庫oplog.rs集合,找出大於此時間戳的記錄。

  • 將找到的記錄插入到自己的oplog.rs集合中,並執行這些操作。

副本集的同步和主從同步一樣,都是非同步同步的過程,不同的是副本集有個自動故障轉移的功能。其原理是:slave端從primary端獲取日誌,然後在自己身上完全順序的執行日誌所記錄的各種操作(該日誌是不記錄查詢操作的),這個日誌就是local資料 庫中的oplog.rs表,預設在64位機器上這個表是比較大的,佔磁碟大小的5%,oplog.rs的大小可以在啟動引數中設 定:–oplogSize 1000,單位是M。

注意:在副本集的環境中,要是所有的Secondary都宕機了,只剩下Primary。最後Primary會變成Secondary,不能提供服務。

複製的基本架構

 基本的架構由3臺伺服器組成,一共三成員的複製集,由三個有資料,或者兩個有資料,一個作為仲裁者

三個儲存資料的複製集

一個主庫;兩個從庫組成,主庫宕機時,這兩個從庫都可以被選為主庫

MongoDB之複製集篇
當主庫宕機後,兩個從庫都會進行競選,其中一個變為主庫,當原主庫恢復後,作為從庫加入當前的複製叢集即可

MongoDB之複製集篇

當存在arbiter節點

一個主庫, 一個從庫,可以在選舉中成為主庫,一個aribiter節點,在選舉中,只進行投票,不能成為主庫

MongoDB之複製集篇
由於arbiter節點沒有複製資料,因此這個架構中僅提供一個完整的資料副本。arbiter節點只需要更少的資源,代價是更有限的冗餘和容錯。
當主庫宕機時,將會選擇從庫成為主,主庫修復後,將其加入到現有的複製叢集中即可。
MongoDB之複製集篇

Primary選舉

複製集進行初始化,初始化後各個成員間開始傳送心跳訊息,併發起Priamry選舉操作獲得『大多數』成員投票支援的節點,會成為Primary,其餘節點成為Secondary。
設定節點正規化:N/2 + 1,通常建議將複製整合員數量設定為奇數

複製集中成員說明

成員 說明
Secondary 正常情況下,複製集的Seconary會參與Primary選舉(自身也可能會被選為Primary),並從Primary同步最新寫入的資料,以保證與Primary儲存相同的資料。Secondary可以提供讀服務,增加Secondary節點可以提供複製集的讀服務能力,同時提升複製集的可用性。另外,Mongodb支援對複製集的Secondary節點進行靈活的配置,以適應多種場景的需求。
Arbiter Arbiter節點只參與投票,不能被選為Primary,並且不從Primary同步資料。比如你部署了一個2個節點的複製集,1個Primary,1個Secondary,任意節點宕機,複製集將不能提供服務了(無法選出Primary),這時可以給複製集新增一個Arbiter節點,即使有節點宕機,仍能選出Primary。Arbiter本身不儲存資料,是非常輕量級的服務,當複製整合員為偶數時,最好加入一個Arbiter節點,以提升複製集可用性。
Priority0 Priority0節點的選舉優先順序為0,不會被選舉為Primary,比如你跨機房A、B部署了一個複製集,並且想指定Primary必須在A機房,這時可以將B機房的複製整合員Priority設定為0,這樣Primary就一定會是A機房的成員。(注意:如果這樣部署,最好將『大多數』節點部署在A機房,否則網路分割槽時可能無法選出Primary)
Vote0 Mongodb 3.0裡,複製整合員最多50個,參與Primary選舉投票的成員最多7個,其他成員(Vote0)的vote屬性必須設定為0,即不參與投票。
Hidden Hidden節點不能被選為主(Priority為0),並且對Driver不可見。因Hidden節點不會接受Driver的請求,可使用Hidden節點做一些資料備份、離線計算的任務,不會影響複製集的服務。
Delayed Delayed節點必須是Hidden節點,並且其資料落後與Primary一段時間(可配置,比如1個小時)。因Delayed節點的資料比Primary落後一段時間,當錯誤或者無效的資料寫入Primary時,可通過Delayed節點的資料來恢復到之前的時間點。

複製集中成員說明

系統環境說明

三臺虛擬機器,環境同mongodb基礎篇中的環境一致
ip:172.16.2.136,172.16.2.137,172.16.2.138

建立副本集

修改配置檔案增加如下配置 # 三臺mongodb都需要操作

 

1.[root@master ~]# vim /etc/mongod.conf

2.replication:

3. replSetName: testrs0 設定副本集名稱

登入mongodb執行初始化操作

 

1.config = {_id: 'testrs0', members: [

2. {_id: 0, host: '172.16.2.136:27017'},

3. {_id: 1, host: '172.16.2.137:27017'}]

4.}

5.rs.initiate(config)

檢視副本集狀態

 

1.rs.status()

此處主上操作

  • 新增從副本集

    • testrs0:PRIMARY> rs.add(“172.16.2.138:27017”) # 新增一個節點

  • 插入一個文件

    • testrs0:PRIMARY> use testdb

    • testrs0:PRIMARY> db.testcoll.insert({Nmme:”roy”,Age:22,Gender:”F”})
      此處從上操作

  • 提升從節點,並可讀

    • estrs0:SECONDARY> rs.slaveOk()

    • testrs0:SECONDARY> use testdb

    • testrs0:SECONDARY> db.testcoll.find()
      停掉主節點,實現故障轉移

  • 主節點操作

    • [root@node1 ~]# systemctl stop mongod

  • 從節點檢視狀態

    • testrs0:SECONDARY> rs.status() # 主切換到138

修改節點的優先順序

檢視現有的配置資訊

 

1.testrs0:PRIMARY> rs.conf()

修改優先順序

 

1.testrs0:PRIMARY> config = rs.config()

2.testrs0:PRIMARY> config.members[0].priority = 2

3.testrs0:PRIMARY> rs.reconfig(config)

副本集其他操作

檢視當前是否是主節點

 

1.rs.isMaster();

新增刪除節點

 

1.rs.add("ip:port"); # 新增從節點

2.rs.addArb("ip:port"); # 新增仲裁節點

3.rs.remove("ip:port"); # 刪除一個節點

4.新增特殊節點時:

5. 可以在搭建過程中設定特殊節點

6. 可以通過修改配置的方式將普通從節點設定為特殊節點

參考文獻

https://www.cnblogs.com/zhoujinyi/p/3554010.html
https://www.cnblogs.com/clsn/p/8214345.html