MongoDB 複製機制

来源:https://www.cnblogs.com/chenmh/archive/2018/03/23/8608984.html
-Advertisement-
Play Games

一、複製原理 MongoDB的複製功能是使用操作日誌oplog實現的,oplog包含主節點(Master)的每一次寫操作,oplog是local本地資料庫中的一個數據集合,其它非主節點(Secondary)通過讀取主節點的oplog集合中的記錄同步到對應的集合,然後再寫入到自身的local資料庫的o ...


一、複製原理

MongoDB的複製功能是使用操作日誌oplog實現的,oplog包含主節點(Master)的每一次寫操作,oplog是local本地資料庫中的一個數據集合,其它非主節點(Secondary)通過讀取主節點的oplog集合中的記錄同步到對應的集合,然後再寫入到自身的local資料庫的oplog集合中。每個節點都維護著自己的oplog,記錄著每一次從主節點複製數據的操作。這樣每個成員都可以作為同步源提供給其它成員使用。

註意:需要註意Secondary節點同步數據的順序是先同步數據,然後再寫入oplog;這點和mysql的機制不同。但是每個節點oplog中記錄的同步數據是完全一致的,所以也不擔心被執行多次。

 

二、oplog集合

1.insert操作

/* 1 */

{

    "ts" : Timestamp(1520580648, 1),
    "t" : NumberLong(20),
    "h" : NumberLong(-8701728013874689868),
    "v" : 2,
    "op" : "i",
    "ns" : "test.person",
    "ui" : UUID("782befd9-80ae-4a2c-86ae-33a147e7c948"),
    "wall" : ISODate("2018-03-09T07:30:48.120Z"),
    "o" : {
        "_id" : ObjectId("5aa2382f7239a98c7e679114"),
        "name" : "zhang"
    }
}

2.update操作

/* 1 */

{
    "ts" : Timestamp(1520584444, 2),
    "t" : NumberLong(20),
    "h" : NumberLong(7151217369265341585),
    "v" : 2,
    "op" : "u",
    "ns" : "test.person",
    "ui" : UUID("782befd9-80ae-4a2c-86ae-33a147e7c948"),
    "o2" : {
        "_id" : ObjectId("5aa2382f7239a98c7e679114")
    },
    "wall" : ISODate("2018-03-09T08:34:04.777Z"),
    "o" : {
        "$v" : 1,
        "$set" : {
            "name" : "wang"
        }
    }
}
  • ts: 操作時間,當前timestamp + 計數器,計數器每秒都被重置
  • h:操作的全局唯一標識
  • v:oplog版本信息
  • op:操作類型:
  1. i:插入操作
  2. u:更新操作
  3. d:刪除操作
  4. c:執行命令(如createDatabase,dropDatabase)
  5. n:空操作,特殊用途
  • ns:操作針對的集合
  • ui:
  • o:操作內容,如果是更新操作
  • o2:操作查詢條件,僅update操作包含該欄位
  • wall:記錄的時間戳。

3.查詢oplog集合

db.oplog.rs.find(

{"op":{$in:["i","u","d"]}}

)

.sort({"wall":-1});

三、初始化同步

1.選擇一個成員作為同步源,在local.me中創建標識符;刪除已存在的資料庫。

2.將同步源的所有數據複製到本地。所有的操作都被集合到oplog中。

3.將第一個oplog同步中的操作記錄下來。

4.創建相關索引,如果集合比較大該過程可能會花費很長的時間。

5.將創建索引過程中同步源增加的記錄同步過來。

6.同步完成,修改節點狀態為SECONDARY

四、心跳

每個成員每隔兩秒鐘就會向其它成員發送一個心跳請求,心跳的請求信息量非常的小,用於檢查每個成員的狀態。

心跳最主要的功能之一就是讓主節點知道自己是否滿足集合“大多數”的條件。如果主節點不再得到“大多數”伺服器的支持,它就會退位變成備份節點。

成員狀態

Number

Name

State Description

0

STARTUP

Not yet an active member of any set. All members start up in this state. The mongod parses the replica set configuration document while inSTARTUP.

1

PRIMARY

The member in state primary is the only member that can accept write operations. Eligible to vote.

2

SECONDARY

A member in state secondary is replicating the data store. Eligible to vote.

3

RECOVERING

Members either perform startup self-checks, or transition from completing a rollback or resync. Eligible to vote.

5

STARTUP2

The member has joined the set and is running an initial sync.

6

UNKNOWN

The member’s state, as seen from another member of the set, is not yet known.

7

ARBITER

Arbiters do not replicate data and exist solely to participate in elections.

8

DOWN

The member, as seen from another member of the set, is unreachable.

9

ROLLBACK

This member is actively performing a rollback. Data is not available for reads.

10

REMOVED

This member was once in a replica set but was subsequently removed.

五、選舉

當一個成員無法到達主節點時,它就會申請被選舉為主節點。希望被選舉為主節點的成員會向它能到達的所有成員發送通知。如果這個成員不符合候選人的要求,其它成員可能會知道相關原因:這個成員的數據落後於副本集,或者已經有一個運行中的主節點(希望被選舉為主節點的成員無法到達這個主節點)。在這些情況下,其它成員不會允許進行選舉。

如果沒有其它成員反對,其他成員就會對這個成員進行選舉投票,如果滿足副本集中“大多數”贊成票,它就被選舉成功,轉換成為主節點。否則選舉失敗仍然處於備份節點狀態,之後還可以再次申請被選舉為主節點。而主節點會一直主節點狀態,除非它由於不再滿足“大多數”的要求或者宕機而退位,另外副本集被重新配置也會導致主節點退位。

在網路良好的情況下,同時投票伺服器也正常運行那麼選舉過程會很快,由於節點之間的互ping是每隔2S,所以如果有主節點不可用那麼2S之內就會有成員發現,然後就會立即開始選舉,整個過程正常只會花費幾毫秒。如果存在網路問題或者伺服器過載響應緩慢都有可能觸發選舉。在這種情況下,心跳會在最多10S之後超時。如果選舉打成平局,每個成員都需要等待30S才能開始下一次選舉,所以如果發生太多錯誤的情況下選舉可能會花費幾分鐘的時間。

六、回滾

 

一般情況下跨數據中心複製要比同數據中心複製慢。

上圖的兩個數據中心之間出現網路故障,DC1最後的操作是126,DC2最後的操作是125;DC1的126操作還沒有被覆制到DC2;由於採取的是多數節點的投票機制,DC2數據中心的副本滿足“大多數”節點的要求(一共5台伺服器,3台伺服器即可超過半數投票)。因此其中一臺伺服器會被選舉成為新的主節點,這個主節點會繼續後續的寫操作。假設在DC1的網路恢復之前DC2已經操作到了130。

DC1

123

124

125

126

DC2

123

124

125

126''

127''

128''

129''

130''

 

在DC1網路恢復之後,DC1就會從DC2同步126之後的操作,但是會發現這個操作是無法操作的,這時候DC1和DC2就會進入回滾過程,DC1和DC2會查找到二者共同的操作點125,DC1和DC2都會回滾到125,然後二者才會繼續後面的同步操作

註意:如果回滾的數據量比較大需要很長的時間,這時可能會導致回滾失敗,對於回滾失敗的節點,必須要重新進行同步。一般造成這種情況的主要原因是備份節點遠遠落後於主節點,而這時主節點掛了。

 

 

 

 

 

 

 

 

備註:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明鏈接,否則保留追究責任的權利。

《歡迎交流討論》

 


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

-Advertisement-
Play Games
更多相關文章
  • Linux遠程連接可以使用SecureCRT工具完成 SecureCRT下載地址 修改虛擬機中的網路適配器 改為橋接模式 一,配置:在Linux終端上獲取IP地址 ifconfig 二,同時需要關閉防火牆 centos 7 systemctl stop firewalld 三,使用SecureCRT ...
  • ssh 免密碼登錄 說明: ssh 無密碼登錄要使用公鑰與私鑰。 linux或者mac系統下可以用用ssh-keygen生成公鑰/私鑰對。 1.在本機生成密鑰(~/.ssh目錄下生成id_rsa和id_rsa.pub。 2.發送公鑰到遠程主機 ~/ 目錄下 3.登錄遠程主機把公鑰追加到授權key中 ...
  • CentOS 7安裝指南(U盤版) 一、準備階段 1、下載CentOS7鏡像文件(ISO文件)到自己電腦,官網下載路徑: http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1708.iso 如下圖 圖1-1 ...
  • 1、概述 Nginx是一款開源的,高性能的Http和反向代理伺服器,同時也是一個IMAP、POP3、SMTP代理伺服器;Nginx可以作為一個HTTP伺服器進行網站的發佈處理,也可以作為反向代理進行負載均衡的實現。 2、反向代理和正向代理 所謂代理其實可以理解為一個代表或者一個渠道,如房產中介,他被 ...
  • 實現目標:一年12個月,每個月插入一條數據,score為1 5的隨機數 迴圈語句: WHILE …… DO …… END WHILE 迴圈語句: LOOP……END LOOP DELIMITER ; CREATE PROCEDURE test_insert() BEGIN DECLARE y TIN ...
  • 1.shell腳本的方式 index_re.sh sqlplus / as sysdba <<EOFspool /tmp/i.sql repselect 'alter index '||owner||'."'||index_name||'" rebuild;' from dba_indexes wh ...
  • 這幾天有業務部門需要使用一個SAP B1老系統 中的報表,但是由於此報表沒有加時間條件,導致一旦開始查詢 就會導致B1系統異常退出。由於報表對應的SQL 是存在資料庫中,所以想通過查找到這個報表的SQL,然後給SQL加時間條件的方式來處理(多年前的一個報表,不知道內部邏輯,很難重寫)。 但是苦於不清 ...
  • 經過開發和測試環境部署 現在到了我們動手的時候了,萬事開頭難,首先我們實現個小功能 今天我們準備實現這樣一個功能:數據永遠也不會被DELETE掉 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...