一組Mongodb複製集,就是一組mongod進程,這些進程維護同一個數據集合。複製集提供了數據冗餘和高等級的可靠性,這是生產部署的基礎html
複製集的目的node
保證數據在生產部署時的冗餘和可靠性,經過在不一樣的機器上保存副原本保證數據的不會由於單點損壞而丟失。可以隨時應對數據丟失、機器損壞帶來的風險。
換一句話來講,還能提升讀取能力,用戶的讀取服務器和寫入服務器在不一樣的地方,並且,由不一樣的服務器爲不一樣的用戶提供服務,提升整個系統的負載。mongodb
複製集功能介紹vim
一組複製集就是一組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臺服務器組成,一共三成員的複製集,由三個有數據,或者兩個有數據,一個做爲仲裁者
三個存儲數據的複製集
一個主庫;兩個從庫組成,主庫宕機時,這兩個從庫均可以被選爲主庫
當主庫宕機後,兩個從庫都會進行競選,其中一個變爲主庫,當原主庫恢復後,做爲從庫加入當前的複製集羣便可
當存在arbiter節點
一個主庫, 一個從庫,能夠在選舉中成爲主庫,一個aribiter節點,在選舉中,只進行投票,不能成爲主庫
因爲arbiter節點沒有複製數據,所以這個架構中僅提供一個完整的數據副本。arbiter節點只須要更少的資源,代價是更有限的冗餘和容錯。
當主庫宕機時,將會選擇從庫成爲主,主庫修復後,將其加入到現有的複製集羣中便可。
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