Mongodb集群架構之副本集

来源:https://www.cnblogs.com/coe2coe/archive/2018/10/01/9734596.html
-Advertisement-
Play Games

本文介紹了熱門的NoSQL資料庫MongoDB的副本集這種分散式架構的一些概念和操作。主要內容包括: MongoDB副本集相關概念 MongoDB副本集環境搭建 MongoDB副本集的讀寫分離 MongoDB副本集的故障轉移 MongoDB副本集的優點 MongoDB副本集的缺點 1.副本集相關概念 ...


 本文介紹了熱門的NoSQL資料庫MongoDB的副本集這種分散式架構的一些概念和操作。主要內容包括:

MongoDB副本集相關概念

MongoDB副本集環境搭建

MongoDB副本集的讀寫分離

MongoDB副本集的故障轉移

MongoDB副本集的優點

MongoDB副本集的缺點

 

1.副本集相關概念

主節點。

在一個副本集中,只有唯一一個主節點。主節點可以進行數據的寫操作和讀操作。副本集中各個節點的增傷改等配置必須在主節點進行。

 

從節點。

在一個副本集中,可以有一個或者多個從節點。從節點只允許讀操作,不允許寫操作。在主節點宕機後,會自動在從節點中產生一個新的主節點。

 

仲裁者。

在一個副本集中,仲裁者節點不保存數據,既不能讀數據,也不能寫數據。作用僅僅限於在從從節點選舉主節點時擔任仲裁作用。

 

副本集的工作原理。

(i)副本集中的主節點的oplog集合中記錄了主節點中所有引起數據變化的變更操作,包括更新和插入數據。副本集中的從節點從主節點的oplog集合中複製這些操作,從而在從節點上重現這些操作。這就是副本集的數據同步的基本原理。

(ii)在 oplog集合中的每個記錄都是有一個時間戳,從節點據此判斷需要更新哪些數據。主節點的local資料庫中的數據不會被覆制到從節點上。

(iii)對於主節點而言,這些複製操作時非同步進行的,相當於MySQL資料庫中的非同步複製模式,即主節點在寫入數據時無需等待任何從節點複製操作完成,即可進行其它數據的寫入操作。

(iv)從節點第1次同步時會做完整的數據同步,後續通常只做一部分最新數據的同步工作。當時當從節點複製延遲太大時會重新進行完整的數據同步。因為oplog集合是一個固定集合,即裡面的文檔數量的大小是有固定的限制的,不能超過某個大小。因此,當主節點上oplog集合寫滿了後,會清空這個oplog集合。如果在寫滿oplog之前,從節點沒有跟上這個速度,則無法再利用oplog進行增量複製工作,這就是需要完整的數據同步的原因。

 

(v)數據回滾。

在主節點宕機後自動產生了新的主節點,這時整個副本集認為這個新的主節點的數據是最新的有效數據。如果其他從節點中的數據複製進度超過了這個心的主節點的進度,那麼這些從節點將會自動回滾這些超過新主節點的數據。這個操作就是Mongodb中的數據回滾。

 

2.副本集環境搭建

現在通過在一臺機器(Centos7)上部署三個mongodb節點,從而搭建一個最簡單的mongodb副本集環境。

埠27017 主節點

埠27018  從節點

埠27019 仲裁節點

 

假定mongodb相關軟體包已經安裝完畢。

(1)首先建立如下圖的目錄結構,其中data和log都是空目錄。

圖1

 

建立如下所示的腳本文件,用於快速啟動這3個節點。

圖2

 

啟動3個節點。

圖3

 

配置副本集。

連接到主節點27017上,然後初始化副本集並且將另外的一個從節點27018和一個仲裁者節點27019加入到副本集中。

 

圖4

 

查看副本集狀態。

replset1:PRIMARY> rs.status();

{

"set" : "replset1",

"date" : ISODate("2018-10-01T04:14:17.567Z"),

"myState" : 1,

"term" : NumberLong(1),

"syncingTo" : "",

"syncSourceHost" : "",

"syncSourceId" : -1,

"heartbeatIntervalMillis" : NumberLong(2000),

"optimes" : {

"lastCommittedOpTime" : {

"ts" : Timestamp(1538367253, 1),

"t" : NumberLong(1)

},

"readConcernMajorityOpTime" : {

"ts" : Timestamp(1538367253, 1),

"t" : NumberLong(1)

},

"appliedOpTime" : {

"ts" : Timestamp(1538367253, 1),

"t" : NumberLong(1)

},

"durableOpTime" : {

"ts" : Timestamp(1538367253, 1),

"t" : NumberLong(1)

}

},

"lastStableCheckpointTimestamp" : Timestamp(1538367228, 4),

"members" : [

{

"_id" : 0,

"name" : "11.1.1.11:27017",

"health" : 1,

"state" : 1,

"stateStr" : "PRIMARY",

"uptime" : 260,

"optime" : {

"ts" : Timestamp(1538367253, 1),

"t" : NumberLong(1)

},

"optimeDate" : ISODate("2018-10-01T04:14:13Z"),

"syncingTo" : "",

"syncSourceHost" : "",

"syncSourceId" : -1,

"infoMessage" : "could not find member to sync from",

"electionTime" : Timestamp(1538367226, 2),

"electionDate" : ISODate("2018-10-01T04:13:46Z"),

"configVersion" : 3,

"self" : true,

"lastHeartbeatMessage" : ""

},

{

"_id" : 1,

"name" : "11.1.1.11:27018",

"health" : 1,

"state" : 2,

"stateStr" : "SECONDARY",

"uptime" : 14,

"optime" : {

"ts" : Timestamp(1538367253, 1),

"t" : NumberLong(1)

},

"optimeDurable" : {

"ts" : Timestamp(1538367253, 1),

"t" : NumberLong(1)

},

"optimeDate" : ISODate("2018-10-01T04:14:13Z"),

"optimeDurableDate" : ISODate("2018-10-01T04:14:13Z"),

"lastHeartbeat" : ISODate("2018-10-01T04:14:17.405Z"),

"lastHeartbeatRecv" : ISODate("2018-10-01T04:14:16.418Z"),

"pingMs" : NumberLong(0),

"lastHeartbeatMessage" : "",

"syncingTo" : "11.1.1.11:27017",

"syncSourceHost" : "11.1.1.11:27017",

"syncSourceId" : 0,

"infoMessage" : "",

"configVersion" : 3

},

{

"_id" : 2,

"name" : "11.1.1.11:27019",

"health" : 1,

"state" : 7,

"stateStr" : "ARBITER",

"uptime" : 4,

"lastHeartbeat" : ISODate("2018-10-01T04:14:17.405Z"),

"lastHeartbeatRecv" : ISODate("2018-10-01T04:14:17.424Z"),

"pingMs" : NumberLong(0),

"lastHeartbeatMessage" : "",

"syncingTo" : "",

"syncSourceHost" : "",

"syncSourceId" : -1,

"infoMessage" : "",

"configVersion" : 3

}

],

"ok" : 1,

"operationTime" : Timestamp(1538367253, 1),

"$clusterTime" : {

"clusterTime" : Timestamp(1538367253, 1),

"signature" : {

"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),

"keyId" : NumberLong(0)

}

}

}

副本集中三個節點的狀態應該是:

 

節點

狀態

 

27017

主節點

1,PRIMARY

 

27018

從節點

2,SECONDARY

 

27019

仲裁節點

7,ARBITER

 

3.副本集的讀寫分離

在Mongodb副本集中,主節點負責數據的全部寫入操作,也可以讀取數據。從節點只能讀取數據,而仲裁節點不能讀和寫數據。

因此,在主節點27017上可以進行數據的讀取和寫入操作。

 

圖5

 

 

但是這個時候從節點上並沒有真正的成為這個副本集的正式成員。在從節點執行任何有關數據的操作將會產生一個錯誤:

圖6

 

只需要在從節點上執行一下這個而操作即可解決問題:

 

圖7

 

圖8

 

在仲裁者節點上同樣需要執行類似的操作,但是仲裁者節點是不保存副本集中的數據的。

圖9

 

在從節點或者仲裁者節點上寫入數據將會失敗。

圖10

 

4.副本集的故障轉移

現在通過將副本集中的主節點27017節點停止運行來演示mongodb副本集的故障轉移功能。

(1)停止主節點27017。

圖1

圖11

查看節點狀態。

此時原來的主節點27017處於不可用狀態,而原來的從節點27018節點成為了新的主節點。

圖12

 

三個節點的新狀態如下所示:

節點

狀態

 

27017

主節點

8,(not reachable/healthy)

 

27018

從節點

1,PRIMARY

 

27019

仲裁節點

7,ARBITER

 

因為27018節點成為了新的主節點,因此可以進行寫數據的操作了。

圖13

 

在重新啟動27017節點後發現這個原來的主節點成為了從節點。

圖14

至此,Mongodb的副本集方式的集群部署成功。

 

4.副本集的優點

(1)部署簡單。

Mongodb的副本集方式的集群,相對於MySQL的MHA或者MM方式的集群而言,部署方面簡單,僅僅使用Mongodb官方軟體的內置功能進行安裝部署,不需要第三方的腳本或者軟體即可完成部署。

 

(2)故障轉移後,主節點的IP地址發生變化。因此需要客戶端程式來處理這種IP變化。Mongodb的java客戶端 SDK正好提供了這種功能,因此只需要將一個副本集中的主節點和全部從節點都加入到連接地址中即可自動完成這種讀寫分離和故障轉移的功能,即不需要程式員自己寫代碼來檢測和判斷副本集中節點的狀態。

Mongodb的副本集的Java SDK和Redis Cluster的Java SDK對於故障轉移的自動化處理方式,都相當的人性化。

 

5.副本集的缺點

Mongodb的副本集方式的集群架構有如下的缺點:

(1)整個集群中只有一個主節點。因此寫操作集中於某一個節點上,無法進行對寫操作的負載均衡。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • • 用戶切換 su 切換到root用戶並不切換環境 su - root 切換到root用戶並切換環境 su redhat 切換到redhat不切換環境 • cd切換目錄 cd ~ 家目錄 ~ USERNAME(root用戶有許可權) 直接切換到指定用戶的家目錄 - 在上一個目錄和當前目錄來回切換 . ...
  • 工作需要,所以研究了一下。 1. 打開: 等個一小會,勾選如下圖紅色方框內的選項。 2. 開始 -> 搜索: IIS 打開,如下: 3. 左側,右鍵:添加FTP站點,設置好了,下一步 4. 配置如下(IP地址我選的本機IP,下拉列表中就有): 5. 身份驗證和授權信息: 6. 接下來就可以在瀏覽器中 ...
  • 一、下載git clone clone https://github.com/coreos/prometheus-operator.git或:wget https://github.com/coreos/prometheus-operator/archive/v0.23.0.tar.gz並解壓 (我 ...
  • 【原創,轉載請註明出處】 應屆生小祖參加了個需求分析會回來後跟我說被產品懟了一句: "不就是寫SQL嗎,要那麼久嗎" 我去,欺負我小弟,這我肯定不能忍呀,於是我寫了一篇文章發在了公司的wiki 貼出來給大家看看,省略了一些敏感的內容。當然內部版言辭也會溫和一點,嘻嘻 在哪裡寫SQL? 這個問題高級點 ...
  • 用PowerDesigner比較直觀, 方便管理,修改資料庫,分享 Oracle的逆向工程,和模型圖的顯示設置 Oracle 為32位的,64位的Oracle PowerDesigner新版本支持,但是搞不到破解碼... https://blog.csdn.net/u011781521/articl ...
  • oracle10g以上支持正則表達式的函數主要有下麵四個:1、REGEXP_LIKE :與LIKE的功能相似2、REGEXP_INSTR :與INSTR的功能相似3、REGEXP_SUBSTR :與SUBSTR的功能相似4、REGEXP_REPLACE :與REPLACE的功能相似POSIX 正則表 ...
  • 一. xtrabackup 選項說明 在操作xtrabackup備份與恢復之前,先看下該工具的選項,下麵記錄了xtrabackup二進位文件的部分命令行選項,後期把常用的選項在補上。點擊查看xtrabackup Option 指南 選項名 說明 --apply-log-only 僅在準備備份時,執行 ...
  • like 用法介紹: 1、“_”:匹配單個任意字元 select * from bqh3 where name like '_崔'; 2、“%”:匹配0個或多個任意字元。但有三種情況如下: like %關鍵字:以關鍵字開頭的記錄 like 關鍵字%:以關鍵字結尾的記錄 like %關鍵字% :包含以 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...