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的故障轉移會不會無故