1. 程式人生 > >mongoDB的複製集2----同步機制(工作原理,oplog詳解,初始化同步的過程

mongoDB的複製集2----同步機制(工作原理,oplog詳解,初始化同步的過程

                      

一、複製集是怎麼工作的

1-1.複製集工作原理

    Mongodb複製集由一組Mongod例項(程序)組成,包含一個Primary節點和多個Secondary節點,Mongodb Driver(客戶端)的所有資料都寫入Primary,Secondary從Primary同步寫入的資料,以保持複製集內所有成員儲存相同的資料集,提供資料的高可用。
    下圖(圖片源於Mongodb官方文件)是一個典型的Mongdb複製集,包含一個Primary節點和2個Secondary節點。

    mongodb叢集:複製,複製集和分片。 強烈建議在生產環境中使用mongodb的複製功能。複製具有故障切換,讀擴充套件,熱備份和離線批處理操作。
預設情況下,主節點負責客戶端所有的讀寫請求,從節點不可讀不可寫。

工作原理


    1). mongodb的複製至少需要兩個例項。其中一個是主節點,負責處理客戶端請求,其餘的都是從節點,負責複製主節點上的資料。主節點記錄在其上的所有操作oplog,從節點定期輪詢主節點獲取這些操作,然後對自己的資料副本執行這些操作,從而保證從節點的資料與主節點一致。
    2). 主節點的操作記錄稱為oplog(operation log),儲存在local資料庫中(local資料庫不會被複制,用來存放複製狀態資訊的)。oplog中的每個文件代表著主節點上執行的操作。oplog只作為從節點與主節點保持資料同步的機制。
    3). oplog.rs是一個固定長度的capped collection。預設情況下,64位的例項將使用oplog 5%的可用空間,這個空間將在local資料庫中分配,並在伺服器啟動時預先分配。
    4). 如果從節點落後主節點很遠了,oplog日誌從節點還沒執行完,oplog可能已經輪滾一圈了,那麼從節點將會追趕不上主節點了,複製將會停止。從節點需要重新做完整的同步,可以用{resync:1}命令來手動執行重新同步或在啟動從節點時指定--autoresync選項讓其自動重新同步。重新同步的代價昂貴,應儘量避免,避免的方法就是配置足夠大的oplog。
檢視oplog資訊:db.oplog.rs.stats()

檢視oplog.rs內容:db.oplog.rs.find().limit(1).to

1-2.oplog是複製集的複製源

欄位說明:
ts:操作的時間戳(8位元組),用於跟蹤操作執行的時間。
h : 此操作的獨一無二的ID
v : oplog的版本
op:操作型別,i代表插入,u代表更新,d代表delete,cmd, null
ns:執行操作的集合名(名稱空間),以db_name,coll_name
o : 操作對應的文件
o2: 僅update操作時有更新操作的變更條件

changwen:PRIMARY> use changwen
switched to db changwen

changwen:PRIMARY> db.changwen2.insert({"name":"insert_oplog_test"})
WriteResult({ "nInserted" : 1 })

changwen:PRIMARY> use local
switched to db local
changwen:PRIMARY> db.oplog.rs.find().sort({$natural:-1}).limit(1).pretty()
{
	"ts" : Timestamp(1472480366, 1),
	"t" : NumberLong(2),
	"h" : NumberLong("-560593709840393662"),
	"v" : 2,
	"op" : "i",
	"ns" : "changwen.changwen2",
	"o" : {
		"_id" : ObjectId("57c4446e0c13aa68781c47d5"),
		"name" : "insert_oplog_test"
	}
}
------------------------------------------------
changwen:PRIMARY> use changwen
switched to db changwen
changwen:PRIMARY> db.changwen2.update({"name":"insert_oplog_test"},{$set:{"name":"update_oplog_test"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
changwen:PRIMARY> use local
switched to db local
changwen:PRIMARY> db.oplog.rs.find().sort({$natural:-1}).limit(1).pretty()
{
	"ts" : Timestamp(1472481441, 1),
	"t" : NumberLong(2),
	"h" : NumberLong("6796117594516952707"),
	"v" : 2,
	"op" : "u",
	"ns" : "changwen.changwen2",
	"o2" : {
		"_id" : ObjectId("57c4446e0c13aa68781c47d5")
	},
	"o" : {
		"$set" : {
			"name" : "update_oplog_test"
		}
	}
}
-----------------------------------------------
changwen:PRIMARY> use changwen
switched to db changwen
changwen:PRIMARY> db.changwen2.remove({"name":"update_oplog_test"})
WriteResult({ "nRemoved" : 1 })
changwen:PRIMARY> use local
switched to db local
changwen:PRIMARY> db.oplog.rs.find().sort({$natural:-1}).limit(1).pretty()
{
	"ts" : Timestamp(1472481535, 1),
	"t" : NumberLong(2),
	"h" : NumberLong("-2737498259321252386"),
	"v" : 2,
	"op" : "d",
	"ns" : "changwen.changwen2",
	"o" : {
		"_id" : ObjectId("57c4446e0c13aa68781c47d5")
	}
}
--不要對資料進行物理刪除,要進行邏輯刪除,類似備份

2-3.oplog的資料結構

oplog:
  特點:封頂表Capped collection滾動覆蓋寫入,固定大小
  什麼是封頂表?
  建立封頂表命令
   db.createCollection("coll_name",
      {capped:true,size:1024*1024*1024*4,[max:5000]})
  --上面的大小為4G,[]為可選

  預設大小:64位Linux,windows作業系統為當前分割槽可用空間5%,體積不會超過50G
            --oplogSize 單位是mb

  複製時間視窗:
    按記錄條數封頂
    按檔案體積封頂)(設定大小可以為40G)

二、複製集初始化同步的過程

  初始前需要在配置檔案設定replSet。
  如下流程圖是已存在的複製集,往這個複製集新增新的節點的流程。(新增節點命令rs.add()或者rs.addArb())


三、複製集的管理維護

  1.眼光長遠
    即使(暫時)只有一臺伺服器,也要以單節點模式啟動複製集
    1).單機多例項啟動複製集
    2).單節點啟動複製集

3-1.單節點啟動複製集如下

# 建立兩個啟動和連線shell指令碼
[email protected]:~/shell$ cat start_mongoDB.sh 
#!/bin/bash
port=$1
sudo /usr/local/mongoDB/bin/mongod -f /usr/local/mongoDB/conf/$port.conf

[email protected]:~/shell$ cat link_mongoDB.sh 
#!/bin/bash
port=$1
sudo /usr/local/mongoDB/bin/mongo  192.168.23.129:$port

# 啟動資料庫
[email protected]:~/shell$ sh link_mongoDB.sh 28001
......
> config = { _id:"changwen", members:[ {_id:0, host:"192.168.23.129:28001"}]}
{
	"_id" : "changwen",
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.23.129:28001"
		}
	]
}
> rs.initiate(config)
{ "ok" : 1 }
changwen:OTHER> 
# 過大概一分鐘再按enter
changwen:PRIMARY> rs.status()
{
	"set" : "changwen",
	"date" : ISODate("2016-08-30T14:26:59.829Z"),
	"myState" : 1,
	"term" : NumberLong(1),
	"heartbeatIntervalMillis" : NumberLong(2000),
	"members" : [
		{
			"_id" : 0,
			"name" : "192.168.23.129:28001",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 1159,
			"optime" : {
				"ts" : Timestamp(1472567178, 1),
				"t" : NumberLong(1)
			},
			"optimeDate" : ISODate("2016-08-30T14:26:18Z"),
			"infoMessage" : "could not find member to sync from",
			"electionTime" : Timestamp(1472567177, 2),
			"electionDate" : ISODate("2016-08-30T14:26:17Z"),
			"configVersion" : 1,
			"self" : true
		}
	],
	"ok" : 1
}
changwen:PRIMARY> show dbs
local  0.000GB
changwen:PRIMARY> use changwenDB
switched to db changwenDB
changwen:PRIMARY> db
changwenDB
changwen:PRIMARY> db.test.save({"name":"relpSet_initiate"})
WriteResult({ "nInserted" : 1 })
changwen:PRIMARY> db.test.find()
{ "_id" : ObjectId("57c597e85d6786a802bee7c5"), "name" : "relpSet_initiate" }

# 如果再增加例項,不要先配置檔案(這樣會有一小段時間的斷開),用add方法
changwen:PRIMARY> rs.add
rs.add(     rs.addArb(
changwen:PRIMARY> rs.add
以上就是部署好單節點 的複製集

3-2.暫停服務

# 在上面的基礎上操作
changwen:PRIMARY> rs.add({_id:1,host:"192.168.23.129:28002"})
{ "ok" : 1 }
changwen:PRIMARY> rs.add({_id:2,host:"192.168.23.129:28003"})
{ "ok" : 1 }

# 將發出這個命令的節點凍結
changwen:PRIMARY> rs.freeze(100)
{ "ok" : 1 }

# stepDown在多少秒的時間內讓出主節點
changwen:PRIMARY> rs.stepDown(100)
......

changwen:SECONDARY> 

# 然後就可以對28001進行其它操作了

3-3.修改複製整合員屬性

  大多數操作都要主節點操作,所以需要直接在主節點操作

#如果其中一臺伺服器效能好,我們需要每次啟動時都使用它,如下:

changwen:PRIMARY> config=rs.conf()
changwen:PRIMARY> config.members[0]
{
	"_id" : 0,
	"host" : "192.168.23.129:28001",
	"arbiterOnly" : false,
	"buildIndexes" : true,
	"hidden" : false,
	"priority" : 1,
	"tags" : {
		
	},
	"slaveDelay" : NumberLong(0),
	"votes" : 1
}
# 其中priority預設是1
changwen:PRIMARY> config.members[0].priority=5
5

# 讓配置檔案生效
changwen:PRIMARY> rs.reconfig(config)
{ "ok" : 1 }
changwen:PRIMARY> 
2016-08-30T08:07:19.265-0700 I NETWORK  [thread1] trying reconnect to 192.168.23.129:28002 (192.168.23.129) failed
2016-08-30T08:07:19.266-0700 I NETWORK  [thread1] reconnect 192.168.23.129:28002 (192.168.23.129) ok

# 過段時間就成了從節點 
changwen:SECONDARY> 

# 在連線28001服務就會成從節點變成主節點
人工干預選舉和建立索引
  1).將priority進行修改
  2).將主節點rs.freeze(),rs.stepDown()

3-4.調整oplog大小

  儘量變大,沒事別變小

相關推薦

mongoDB複製2----同步機制工作原理oplog初始同步過程

                       一、複製集是怎麼工作的 1-1.複製集工作原理     Mongodb複製集由一組Mongod例項(程序)組成,包含一個Primary節點和多個Secondary節點,Mongodb Driver(客戶端)的所有資料都寫入Pr

mongodb副本的內部機制借鑒lanceyan.com)

proc 導致 功能 來看 href 開始 既然 不想 for 針對mongodb的內部機制提出以下幾個引導性的問題: 副本集故障轉移,主節點是如何選舉的?能否手動幹涉下架某一臺主節點。 官方說副本集數量最好是奇數,為什麽? mongodb副本集是如何同步的?如果同步不及

SpringBoot 2.0 系列二):流程上)

寫在前面 本節將詳細介紹如何使用Spring Boot。它涵蓋了諸如專案管理及自動構建工具、自動配置以及如何執行應用程式等主題。我們還介紹了一些Spring Boot最佳實踐。Spring Boot沒有什麼特別之處(它只是另一個我們可以使用的庫),但是有一些約

tcp/iP協議族——IP工作原理及例項下)

 IP協議詳解 上一篇文章文章主要介紹了IP服務的特點,IPv4頭部結構IP分片,並用tcpdump抓取資料包,來觀察IP資料報傳送過程中IP的格式,以及分片的過程。本文主要介紹IP路由,IP轉發,重定向和IPv6頭部結構。 IP路由 IP協議的一個核心任務是資料

TCP/IP協議族——IP工作原理及例項上)

 IP協議詳解         本文主要介紹了IP服務特點,頭部結構,IP分片知識,並用tcpdump抓取資料包,來觀察IP資料報傳送過程中IP的格式,以及分片的過程。 IP頭部資訊:IP頭部資訊出現在每個IP資料報中,用於指定IP通訊的源端IP地址、目的端IP地址

最完整的Mybatis Generator簡稱MBG)的最完整配置文件再也不用去看EN的User Guide了;

tor 開始 設置 gen false dsc user ren led <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//myba

非旋 treap 結構體數組版無指針)有圖有真相

ati sin closed 基準 隨機函數 例題 偽隨機 作用 拆分 非旋 $treap$ (FHQ treap)的簡單入門 前置技能 建議在掌握普通 treap 以及 左偏堆(也就是可並堆)食用本blog 原理 以隨機數維護平衡,使樹高期望為logn級別

ansible工作原理以及使用

內容:1、ansible的作用以及工作結構2、ansible的安裝以及使用3、ansible的playbook使用 一、ansible的作用以及工作結構        1、ansible簡介:    

晶振工作原理及引數

晶振工作原理及引數詳解(最透徹) 晶振是石英晶體諧振器(quartz crystal oscillator)的簡稱,也稱有源晶振,它能夠產生中央處理器(CPU)執行指令所必須的時鐘頻率訊號,CPU一切指令的執行都是建立在這個基礎上的,時鐘訊號頻率越高,通常CPU的執行速度也就越快。 只要是包

python標準庫常用模組三)-----------------------------OS模組呼叫系統的命令

OS模組是呼叫系統命令的模組,和執行cmd的命令相似。 1.獲取當前的工作目錄:getcwd() 2.改變當前指令碼的工作目錄:chdir(path) 3.返回當前目錄:curdir() 4.獲取當前目錄的父目錄:pardir() 5.若目錄為空,則刪除,遞迴到上一

Node Js 基本工作原理及流程

1,專案前期準備: 以express 框架為例 npm i express-generator -g //全域性安裝express框架 express -e //生成express應用骨架 npm i //安裝依賴 npm start //在3000埠監聽 拓展

最完整的Mybatis Generator簡稱MBG)的最完整配置檔案

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0

CSS進階11)—— overflow屬性利用CSS實現錨點定位

  本章延續上一章BFC的內容深入探索BFC的最佳結界——overflow在其本職工作上的表現。   1.overflow的裁剪界線——border-box   overflow屬性用於指定塊容器元素的內容溢位時的表現方式——滾動,裁剪,自適應。“BFC

本地Mysql5.7主從Master/Slave)安裝my.ini檔案配置

找到Master mysql的位置 C:\Program Files\MySQL\MySQL Server 5.7 複製資料夾到你所需要的目錄,我是在D:\Mysql separation\MySQL

Hibernate 初相識一)Hibernate API 配置檔案對映檔案

導航{ } Hibernate 在三層框架中的位置。 一,第一個Hibernate 專案。  地址:https://github.com/gengzi/Hibernate 【1】匯入jar包 解

我的android多執行緒程式設計之路1)之經驗原始碼分析

寫在伊始 android開發這麼久了,對於多執行緒這塊一直處於似懂非懂的神奇狀態,今天總結出來,分享一下,希望大家多多指正。共同交流,懇望得到您的建議。 本文簡介 本文會基於自己在開發中對於執行緒這塊的實際使用,大概從執行緒程序的概念,執行緒的建立(T

部署MongoDB複製副本

環境 作業系統:Ubuntu 18.04 MongoDB: 4.0.3 伺服器 首先部署3臺伺服器,1臺主節點 + 2臺從節點 3臺伺服器的內容ip分別是: 10.140.0.5 (主節點)

Ubuntu 18.04下部署MongoDB複製副本

環境 作業系統: 18.04 MongoDB: 4.0.3   伺服器 首先部署3臺伺服器,1臺主節點 + 2臺從節點 3臺伺服器的內容ip分別是: 10.140.0.5 (主節點) 10.140.0.6 (從節點01)

MongoDB複製搭建Window10系統下)

一、獲取mongodb安裝包         本示例mongo版本:mongodb-win32-x86_64-3.4.17.zip 二 、安裝mongo (1)解壓 mongodb-win32-x86_64-3.4.17.zip,解壓之後檔名可自定義。Mongo

mongodb複製內部機制(mongodb bully演算法)

帶著副本集的問題來看吧! 副本集故障轉移,主節點是如何選舉的?能否手動干涉下架某一臺主節點。 官方說副本集數量最好是奇數,為什麼? mongodb副本集是如何同步的?如果同步不及時會出現什麼情況?會不會出現不一致性? mongodb的故障轉移會不會無故