MongoDB學習筆記——Replica Set副本集

来源:http://www.cnblogs.com/AlvinLee/archive/2016/11/24/6096620.html
-Advertisement-
Play Games

副本集 可以將MongoDB中的副本集看作一組伺服器集群由一個主節點和多個副本節點等組成,相對於之前講到的主從複製提供了故障自動轉移的功能 副本集實現數據同步的方式依賴於local資料庫中的oplog數據 oplog是存在與主節點或副本節點上的local資料庫中的一個固定集合,記錄了每一次主節點的寫... ...


副本集

可以將MongoDB中的副本集看作一組伺服器集群由一個主節點和多個副本節點等組成,相對於之前講到的主從複製提供了故障自動轉移的功能

副本集實現數據同步的方式依賴於local資料庫中的oplog數據

  • oplog是存在與主節點或副本節點上的local資料庫中的一個固定集合,記錄了每一次主節點的寫操作,或副本節點每一次從主節點複製數據的操作
  • 備份節點通過定時從主節點獲取oplog數據,併在本機執行這些操作來實現主從複製的功能,同樣的每個副本節點也可以作為數據源給其他成員使用
  • 備份節點在本機上執行完從主節點獲取到的oplog數據後,會在自己的local資料庫中記錄這些的操作
  • 如果某個副本節點由於某些原因宕機了,當重啟後會從oplog中最後一個操作開始進行同步,由於複製過程是先進行複製再寫入本機oplog的,所以副本節點可能會在已經同步過的數據上再次執行複製操作,不過oplog中的統一操作執行多次與執行一次效果是一樣的

oplog欄位說明

  • ts:執行某個操作的時間戳
  • op:操作類型(i-insert;d-delete;u-update
  • ns:操作的集合的名稱
  • o:document的內容

副本集中的各種角色

  • 主節點——有且只有一個,預設處理了所有的客戶端請求(讀和寫)
  • 副本節點——可以有多個,保存主節點的副本數據,當主節點出問題時可以通過投票升級為主節點,可以處理客戶端的只讀請求
  • 仲裁節點——不進行數據複製存儲,也不為客戶端提供服務,唯一的作用是進行故障轉移時的投票,選舉出新的主節點 仲裁節點一旦被設置則永遠不能成為非仲裁節點,反之一樣 一個副本集集群中最多只能有一個仲裁節點,如果節點總數為基數時就不需要配置仲裁節點了,因為仲裁節點的作用就是在節點總數為偶數時,如果一半投票給A,一半頭片給B這時仲裁節點就持有關鍵性的一票 如果有可能儘量使用奇數的集群節點,不要使用仲裁節點
  • 隱藏節點——不為客戶端提供服務,永遠不會成為主節點但是會參與投票,進行數據的複製存儲,一般用作數據備份 如果要設置一個節點為隱藏設置其hidden屬性為true即可 只有優先順序priority=0的節點才能被設置為隱藏
  • 延遲同步節點——一般會人為設置一個延遲時間(單位秒)來從主節點同步數據,主要就是用於數據的備份,當資料庫發生毀滅性災難時進行數據恢復 延遲同步節點的優先順序priority=0並且是隱藏節點,避免讀請求被路由到延遲同步節點上 通過屬性slaveDelay(單位秒)來設置一個節點的延遲同步時間
  • Secondary-Only——通常將性能不高的節點設置為此類型,防止其成為主節點,優先順序priority=0
  • Non-Voting——沒有投票權的副本節點,純粹用於數據備份,一般只有當節點總數超過12個時才會被使用,通過votes=0設置其為Non-Voting節點

部署副本集

創建主從key文件,用於表示集群私鑰的完整路徑,如果各個實例的密鑰不一致則程式不能正常使用

openssl rand -base64 100 > key

創建資料庫目錄及日誌目錄並修改其配置文件

//replica set 0

systemLog:

path: D:\mongodb\replicaSet\rs0\logs\mongodb.log

logAppend: true

destination: file

storage:

dbPath: D:\mongodb\replicaSet\rs0\data

net:

port: 27017

bindIp: 127.0.0.1

security:

keyFile: D:\mongodb\replicaSet\rs0\key

replication:

replSetName: replcaSetTest

secondaryIndexPrefetch: all

//relica set 1

systemLog:

path: D:\mongodb\replicaSet\rs1\logs\mongodb.log

logAppend: true

destination: file

storage:

dbPath: D:\mongodb\replicaSet\rs1\data

net:

port: 27018

bindIp: 127.0.0.1

security:

keyFile: D:\mongodb\replicaSet\rs1\key

replication:

replSetName: replcaSetTest

secondaryIndexPrefetch: all

//relica set 2

systemLog:

path: D:\mongodb\replicaSet\rs2\logs\mongodb.log

logAppend: true

destination: file

storage:

dbPath: D:\mongodb\replicaSet\rs2\data

net:

port: 27019

bindIp: 127.0.0.1

security:

keyFile: D:\mongodb\replicaSet\rs2\key

replication:

replSetName: replcaSetTest

secondaryIndexPrefetch: all

啟動以上三個實例

mongod -config D:\mongodb\replicaSet\rs0\mongodb.conf

mongod -config D:\mongodb\replicaSet\rs1\mongodb.conf

mongod -config D:\mongodb\replicaSet\rs2\mongodb.conf

配置及初始化副本集

rsConfig = {

_id: "replcaSetTest",

members: [{ _id: 0, host: "127.0.0.1:27017" },

{ _id: 1, host: "127.0.0.1:27018" },

{ _id: 2, host: "127.0.0.1:27019" }

]

};

rs.initiate(rsConfig);

_id就是啟動MongoDB實例時設置的副本集名稱,一定要保障兩處副本集名稱一致 members副本集成員數組,一個唯一的數值類型的_id,一個主機名 rs.initiate()函數用來初始化副本集

輸入rs.config()查詢配置修改是否成功,竟然提示沒有許可權

rs.config()

2016-11-23T17:18:00.689+0800 E QUERY [thread1] Error: Could not retrieve replica set config: {

"ok" : 0,

"errmsg" : "not authorized on admin to execute command { replSetGetConfig: 1.0 }",

"code" : 13

}

執行以下名稱創建創建管理員賬戶,並授予許可權,創建成功後執行db.auth() 命令進行登錄授權

db.createUser({

user: 'admin',

pwd: 'mongodb_123',

roles: [{ "role": "clusterAdmin", "db": "admin" },

{ "role": "userAdminAnyDatabase", "db": "admin" },

{ "role": "dbAdminAnyDatabase", "db": "admin" },

{ role: "root", db: "admin" }

]

})

db.auth("admin","mongodb_123")

再次執行rs.config()得到以下信息

rs.config()

{

"_id" : "replcaSetTest",

"version" : 1,

"protocolVersion" : NumberLong(1),

"members" : [

{

"_id" : 0,

"host" : "127.0.0.1:27017",

"arbiterOnly" : false,

"buildIndexes" : true,

"hidden" : false,

"priority" : 1,

"tags" : {

},

"slaveDelay" : NumberLong(0),

"votes" : 1

},

{

"_id" : 1,

"host" : "127.0.0.1:27018",

"arbiterOnly" : false,

"buildIndexes" : true,

"hidden" : false,

"priority" : 1,

"tags" : {

},

"slaveDelay" : NumberLong(0),

"votes" : 1

},

{

"_id" : 2,

"host" : "127.0.0.1:27019",

"arbiterOnly" : false,

"buildIndexes" : true,

"hidden" : false,

"priority" : 1,

"tags" : {

},

"slaveDelay" : NumberLong(0),

"votes" : 1

}

],

"settings" : {

"chainingAllowed" : true,

"heartbeatIntervalMillis" : 2000,

"heartbeatTimeoutSecs" : 10,

"electionTimeoutMillis" : 10000,

"getLastErrorModes" : {

},

"getLastErrorDefaults" : {

"w" : 1,

"wtimeout" : 0

},

"replicaSetId" : ObjectId("5835597e61b9c2f7c562b9b0")

}

}

version 在每次修改副本集配置時都會遞增,初始值為rs.starus()rs.isMaster() 指令可以查詢當前副本集的狀態

local資料庫中不僅有oplog日誌集合,還有一個用於記錄主從配置信息的集——system.replset 通過這個集合可以查看副本集的配置信息當然在每個實例上執行rs.config()rs.conf()也能達到同樣的效果

db.system.replset.find()

在主節點上創建測試數據

use myReplSetTest

for (i = 5000; i < 100000; i++) {

db.users.insert({

"i": i,

"userName": "user" + i,

"age": Math.floor(Math.random() * 120),

"created": new Date(),

total: Math.floor(Math.random() * 100) * i

})

}

db.users.find()

在主節點上執行查詢OK,但是當在副本節點進行執行是則報錯,提示不是主節點並且slaveOk=false不能執行查詢操作

QUERY [thread1] Error: listCollections failed: { "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 }

在副本節點中執行名稱db.setSlaveOk()讓副本節點可以讀取數據,分單主庫壓力達到讀寫分離的效果,再次執行db.users.find()就正常了

副本集管理

rs.add()可以添加節點 添加節點的方式有兩種: 1.通過oplog直接添加,這種方式添加節點過程中不需要過多的人工干預就可以完成,但是如果頻繁的插入修改等操作會導致oplog數據較大,在進行複製時會使源節點的壓力較大 並且oplog是固定集合,因為他的特性可能會導致複製的數據不一致 2.通過資料庫快照(--fastsync)獲取某一個副本節點的物理文件來做初始化數據,剩餘的部分通過oplog日誌進行追加可以解決上述的問題,

通過方式1來新增節點,方式同創建mongodb副本集(創建對應的數據文件夾,修改配置文件,啟動mongodb實例)

systemLog:

path: D:\mongodb\replicaSet\rs3\logs\mongodb.log

logAppend: true

destination: file

storage:

dbPath: D:\mongodb\replicaSet\rs3\data

net:

port: 27020

bindIp: 127.0.0.1

security:

keyFile: D:\mongodb\replicaSet\rs3\key

replication:

replSetName: replcaSetTest

secondaryIndexPrefetch: all

 

 

mongod -config D:\mongodb\replicaSet\rs3\mongodb.conf

 

 

//主節點中執行

rs.add("127.0.0.1:27020");

使用方式2 進行節點新增 1.複製rs3中文件至文件夾rs4 2.修改配置文件如下: 3.啟動新的mongodb實例

systemLog:

path: D:\mongodb\replicaSet\rs4\logs\mongodb.log

logAppend: true

destination: file

storage:

dbPath: D:\mongodb\replicaSet\rs4\data

net:

port: 27021

bindIp: 127.0.0.1

security:

keyFile: D:\mongodb\replicaSet\rs4\key

replication:

replSetName: replcaSetTest

secondaryIndexPrefetch: all

 

 

mongod -config D:\mongodb\replicaSet\rs3\mongodb.conf

 

//主節點中添加測試數據

 

db.usertest.insert({name:1})

 

//主節點中執行

rs.add("127.0.0.1:27021");

//新添加的副本節點中執行show collections 發現已經同步

rs.remove()可以進行節點移除

rs.remove("127.0.0.1:27020");

rs.reconfig()可以修改副本集配置,特別是針對複雜的副本集配置,比rs.add()rs.remove()更有效

config = rs.config();

config.members[1].priority = 20;

rs.reconfig(config);

以上命令修改了 127.0.0.1:27018的優先順序,發現修改完成後自動切換為了主節點,通過命令rs.status()可以查看

副本集監控

主節點中執行 db.printReplicationInfo() 命令可以查看oplog信息

  • configured oplog size——配置的oplog文件大小
  • log length start to end——oplog日誌的啟用時間段
  • oplog first event time——第一個事務日誌產生的時間
  • oplog last event time——最後一個事務日誌產生的時間
  • now——當前時間

副本節點中執行db.printSlaveReplicationInfo()命令可以查看同步狀態信息

  • source——從庫的IP及埠
  • syncedTo——當前的同步情況,,延遲了多久等信息

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

-Advertisement-
Play Games
更多相關文章
  • 彙總數據 函數 說明 AVG() 返回某列的平均數 COUNT() 返回某列的行數 MAX() 返回某列的最大值 MIN() 返回某列的最小值 SUM() 返回某列值的和 1、AVG函數 2、count()函數 這條select語句使用count(cust_email)對cust_email列中有值 ...
  • 問題描述:Oracle表空間創建到了C盤,發現C盤的空間不夠,現在將表空間的文件轉移到D盤下。 操作方法: 1. 先登錄sqlplus,登錄用戶.在cmd中輸入:sqlplus /nologSQL>conn system/system@orc (system:用戶名,system:密碼,orc:數據 ...
  • 新建查詢,執行如下語句: EXEC sp_attach_db @dbname = 'xxx', /*資料庫名稱*/ @filename1 = 'D:\資料庫備份\預發佈\201611241045 測試\xxx.mdf', /*mdf文件目錄*/ @filename2 = 'D:\資料庫備份\預發佈\ ...
  • 今天碰到了一個奇怪的問題,是關於Oracle一個事務中的Insert和Update語句的執行順序的問題。 首先詳細說明下整個過程: 有三張表:A,B,C,Java代碼中有一段代碼是先在表A中插入一條數據,然後再更新表B的兩個欄位,更新的兩個欄位是特定值。並且插入和更新在一個事務中。 有個需求需要在表 ...
  • 1、導入資料庫 在命令行下輸入: 說明: username 是資料庫用戶名, test 為目標資料庫, /home/data/test.sql 是你要備份的路徑和名稱 回車,輸入資料庫密碼,就進行導入操作了! 2、導出資料庫 2.1、導出整個資料庫: 說明:username是資料庫用戶名,test源 ...
  • PageSize = 30 PageNumber = 201 方法一:(最常用的分頁代碼, top / not in) 備註: 註意前後的order by 一致 方法二:(not exists, not in 的另一種寫法而已) 備註:EXISTS用於檢查子查詢是否至少會返回一行數據,該子查詢實際上 ...
  • 版權聲明:本文發佈於http://www.cnblogs.com/yumiko/,版權由Yumiko_sunny所有,歡迎轉載。轉載時,請在文章明顯位置註明原文鏈接。若在未經作者同意的情況下,將本文內容用於商業用途,將保留追究其法律責任的權利。如果有問題,請以郵箱方式聯繫作者(793113046@q ...
  • 昨天遇到一個案例,YourSQLDba做事務日誌備份時失敗,檢查YourSQLDba輸出的錯誤信息如下: yMaint.backups backup log [gewem] to disk = 'M:\DB_BACKUP\LOG_BACKUP\xxxx_[2016-11-22_01h11m05_Tu... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...