MongoDB 副本集管理

来源:https://www.cnblogs.com/chenmh/archive/2018/04/04/8681867.html
-Advertisement-
Play Games

一、以單機模式啟動成員節點 有時候出於維護的需要,需要以單機模式啟動某個節點而不是一個副本集成員身份。 1).首先查詢伺服器命令行參數 2).關閉當前副本 3).以單機模式啟動副本 這裡需要指定副本原先的db路徑,為了避免可能的其它連接這裡可以指定一個新的port啟動;也可以直接使用原先的配置文件啟 ...


版本:3.6 

一、以單機模式啟動成員節點

有時候出於維護的需要,需要以單機模式啟動某個節點而不是一個副本集成員身份。

1).首先查詢伺服器命令行參數

db.serverCmdLineOpts()

2).關閉當前副本

3).以單機模式啟動副本

這裡需要指定副本原先的db路徑,為了避免可能的其它連接這裡可以指定一個新的port啟動;也可以直接使用原先的配置文件啟動只需要註釋掉“replSet”參數即可。

mongod --port 27000 --bind_ip 192.168.137.10,127.0.0.1 --dbpath /mongos27012/data/db4

4).維護完之後再以副本成員身份啟動當前伺服器。

二、檢查寫入是否成功

getLastError命令檢查寫入是否成功

db.runCommand({"getLastError":1,"w":2,"wtimeout":1000});

getLastErrorDefaults預設配置值

conf = rs.config();

conf.settings = {"getLastErrorDefaults" : {

                            "w" : 1,

                            "wtimeout" : 0

                            }

                            };

rs.reconfig(conf);

wtimeout:等待超時時長,如果超過這個時間MongoDB無法在指定時間內將寫入操作複製到“w”個成員,返回超時。

w的多個值:

majority:一直等待保證大多數成員都執行完了寫入操作

number(數字):w值包含主節點,如果設置1那麼只保證主節點寫入成功,如果希望被覆制到N個節點,那麼應該將“w”設置為N+1

三、自定義複製保證規則,設置成員標簽

1.設置成員標簽

conf = rs.config();

conf.members[0].tags={"dc" : "dc01"};

conf.members[1].tags={"dc" : "dc01"};

conf.members[2].tags={"dc" : "dc02"};

rs.reconfig(conf);

上面操作設置了兩個組,分別是dc01和dc02;

註意:

1.tags用來給每一個節點成員設置標簽,它是一個集合所以可以像集合一樣包含多個值,比如

{"dc": "rack1", disk:"ssd", ssd: "installed"}

2.如果要初始化tags必須先初始化settings.getLastErrorModes

2.配置規則,應用於settings選項

通過配置getLastErrorMode欄位實現,每條規則的形式為:"name":{"key":number}.其中name是規則的名字,自己定,key就是上面tags的標識,number表示覆制操作至少複製到多少個分組上,每個分組內至少一臺機器上.

conf = rs.config();

conf.settings.getLastErrorModes={"eachDC":{"dc":2}                                                }

rs.reconfig(conf);

初始化getLastErrorModes

conf = rs.config();

conf.settings.getLastErrorModes={}

rs.reconfig(conf);

3.插入記錄並應用規則

db.users.insert( { id: "xyz", status: "A" }, { writeConcern: { w:"eachDC" } } );

註意:如果不想數據複製到某個節點,可以不給這個節點配置標簽,這樣該成員就是隱藏成員。

conf = rs.config();

conf.members[1].tags={};

rs.reconfig(conf);

4.註意事項

conf = rs.conf()

conf.members[0].tags = { "dc": "east", "production": "node-1" }

conf.members[1].tags = { "dc": "east", "production": "node-2" }

conf.members[2].tags = { "dc": "east", "production": "node-3" }

rs.reconfig(conf)

下麵的規則可以創建成功,因為標簽production擁有三個不同的組

conf.settings = {

    getLastErrorModes: {

        productionWriteConcern : { "production": 3 }

    }

}

下麵的規則不能創建成功,因為標簽dc只有一個唯一的組

conf.settings = {

    getLastErrorModes: {

        dcWriteConcern : { "dc": 3 }

    }

}

四、副本集配置

副本集的配置在local.system.replSet集合中。副本集中所有成員的的該文檔記錄都是相同的。

rs.:副本命令,是replSet是縮寫,代表副本集。

db.:資料庫命令,比如db.printReplicationInfo(),db.printSlaveReplicationInfo()

rs.status:查看成員的複製狀態,可以在任意節點執行。

rs.config():可以得到當前副本的配置,修改配置文件,然後將修改後的配置文件傳遞給                      reconfig、initiate命令。

rs.reconfig()(replSetReconfig):修改副本集的配置。rs.reconfig(conf,{"force":true})

rs.initiate():會初始化配置,只需要對副本集中的一個成員調用rs.initiate就可以(一般主節點),收到initiate命令的成員會自動將配置文件傳遞給副本集中的其他成員

1.創建副本集

1).登入

mongo --port 27010

2).切換admin資料庫

use admin

3).驗證許可權

db.auth("dba","dba")

4).初始化複製集,預設會創建當前節點為主節點的副本集

rs.initiate()

5).重啟當前節點

db.shutdownServer()

2.修改副本集成員

1).添加新成員,在主節點執行:

rs.add("192.168.137.10:27011")
可以在添加成員的時設定成員配置,也就是rs.conf中member的參數:
rs.add("_id":1,"host":"192.168.137.10:27011", "priority" : 0, "hidden" : true)

2)刪除成員

rs.remove("192.168.137.10:27012");

修改副本集成員配置時的限制:

1、不能修改_id;

2、不能將當前執行rs.reconfig命令的成員的優先順序設置為 0;

3、不能將仲裁者成員變為非仲裁者成員,反正亦然;

4、不能將buildIndexes由false改為 true;

3.保證主節點不切換

將所有的備份節點的priority和votes都設置為0;這樣只有主節點有投票權所以無論備份節點是否存在都不會導致主節點的狀態由primary變成other。

conf=rs.config()

conf.members[1].priority=0

conf.members[1].votes=0

rs.reconfig(conf)

4.強制重新配置

如果副本集無法選出新的主節點,這時需要重新配置副本集。可以在備份節點上調用rs.reconfig(conf,{"force":ture})強制重新配置副本集。註意conf必須是正確、有效的配置。而且只允許在備份節點執行強制重新配置。

備份節點收到新的配置文件之後,就會修改自身的配置,並且將新的配置發送給副本集中的其他成員。副本集的其他成員收到新的配置文件之後,會判斷配置文件的發送者是否是它們當前配置中的一個成員,如果是,才會用心的配置文件對自己進行重新配置。所以,如果新的配置修改了某些成員的主機名,則應該關閉被修改主機名的節點,並以單機模式啟動,手動修改locak.system.replset文檔,然後以副本集的方式重新啟動。

5.修改成員狀態

1).把主節點變為備份節點,在主節點執行

rs.stepDown()

rs.stepDown(60):讓主節點退化為備份節點,並維持60秒。如果這段時間內沒有新的主節點被選舉出來,那麼當前節點可以要求重新參與進行選舉。

2).阻止選舉

如果需要對主節點進行維護操作,但是不希望這段時間內其它成員選舉為主節點,可以在每個備份節點上執行freeze命令,以強制它們始終處於備份節點的狀態。命令以秒為單位。

rs.freeze(3600):保持1個小時處於備份節點狀態。

rs.freeze(0):再次在備份節點執行且將時間指定為0就是“釋放”備份節點。

註意:如果在退位的備份節點上執行rs.freeze(0),可以讓退位的備份節點重新變為主節點。

6.禁用複製鏈

1).查看複製源

查詢節點從哪個節點處複製。在備份節點上運行。

db.adminCommand({"replSetGetStatus":1})['syncingTo'];

也可以運行rs.status(),查看"syncingTo"欄位信息。

2.)複製鏈

MongoDB根據ping時間選擇同步源,一個成員向另一個成員發送心跳請求,就知道心跳請求所耗費的時間(rs.status()中的"pingMs"記錄了成員到達相關成員的所花費的平均時間)。MongosDB維護著不同成員間請求的平均花費時間。選擇同步源時,會選擇一個離自己比較近而且數據比自己新的成員。但是同一數據中心的成員可能會從同一數據中心的其他成員處複製,而不是從位於另一個數據中心的主節點處複製(這樣可以減少網路流量),所以會出現複製鏈的情況,複製鏈越長會導致主節點的操作複製到所有的伺服器所花費的時間越長。這對於需要從副本中讀取數據的需求這種情況是不希望看到的。



3).修改複製源

db.adminCommand({"replSetSyncFrom":"192.168.137.10:27011"});

4).禁用複製鏈

conf = rs.conf()
conf.settings.chainingAllowed = false
rs.reconfig(conf)

在主副本中執行

7.計算延遲

1).查看當前副本集oplog狀態

rs.printReplicationInfo()

configured oplog size:oplog配置的大小

log length start to end:oplog包含的操作時長。

oplog first event time:oplog第一條操作的時間。

oplog last event time:oplog最後一條操作的時間。

now:當前時間。

註意:oplog中第一條操作與最後一條操作的時間差就是操作日誌的長度。

2).查看複製延遲

rs.printSlaveReplicationInfo()

會顯示當前所有的備份節點同步時間,和落後主節點的時長。

8.調整oplog大小

1)  如果是主節點,將主節點變成備份節點。

2)  將oplog中的最後一條insert操作保存到其它集合中。

use local

var lastinsert = db.oplog.rs.find({"op":{$in:["i"]}}).sort({"wall":-1}).limit(1).next();

db.tempLastOp20180330.save(lastinsert)

db.tempLastOp20180330.find()

3)   關閉當前伺服器

4)   以單機模式啟動

mongod --port 27000 --bind_ip 192.168.137.10,127.0.0.1 --dbpath /mongos27012/data/db

5)   刪除當前oplog

db.oplog.rs.drop();

6)   創建新的oplog

db.createCollection("oplog.rs",{"capped":true,"size":1048576})

7)  將最後一條insert記錄寫回oplog

var tempLastOp=db.tempLastOp20180330.find().next()
db.oplog.rs.insert(tempLastOp)
db.oplog.rs.find()

8)  以副本成員身份啟動當前伺服器

五、複製集監控

1.複製集狀態查詢:rs.status()

2.查看當前副本集oplog狀態:rs.printReplicationInfo()

3.查看複製延遲:rs.printSlaveReplicationInfo()

4.查看服務狀態詳情:db.serverStatus()

5.查詢副本集配置:rs.conf()

6.主副本查詢:db.isMaster()

 

副本配置:https://docs.mongodb.com/manual/reference/replica-configuration/#rsconf.settings.getLastErrorDefaults

 

 

 

備註:

    作者:pursuer.chen

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

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

《歡迎交流討論》

 


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

-Advertisement-
Play Games
更多相關文章
  • 1、首先查看VMware8使用的IP地址 2、查看虛擬機網關(從這裡我們可以知道在配置NAT網路的時候,配置文件中的網關應該和虛擬機的網關一一對應) 3、兩種修改IP的方式(這裡我們採用第二種) ****修改IP(重啟後無效)ifconfig eth0 192.168.12.22 ****修改IP( ...
  • Kali命令集 系統信息 arch 顯示機器的處理器架構(1) uname -m 顯示機器的處理器架構(2) uname -r 顯示正在使用的內核版本 dmidecode -q 顯示硬體系統部件 - (SMBIOS / DMI) hdparm -i /dev/hda 羅列一個磁碟的架構特性 hdpa ...
  • 參考網站:http://processors.wiki.ti.com/index.php/Linux_Kernel_Users_Guide#Compiler該網站的操作需要在內核源碼的目錄下操作在編譯uboot源碼時候報錯*** Your dtc is too old, please upgrade ...
  • 一、把STM32F103大容量移植到STM32F103C8T6上的步驟: 1、換啟動文件 startup_stm32f10x_cl.s ——互聯型的器件 包括:STM32F105xx,STM32F107xx startup_stm32f10x_hd.s ——大容量器件 包括:STM32F101xx, ...
  • #1.更新源 源文件位置區別於kali等debian系統 位置:/etc/apt/sources.list.d/parrot.list 國內源(清華大學)deb https://mirrors.tuna.tsinghua.edu.cn/parrot/ parrot main contrib non- ...
  • 僅僅是一些應用安裝,後續將陸續寫一寫開發工具的安裝和配置 [TOC] 安裝 sogou 拼音 1. sudo add apt repository ppa:fcitx team/nightly 2. sudo apt get update 3. sudo apt get install fcitx ...
  • 目前電腦配置:Ubuntu 16.04 + GTX1080顯卡 配置深度學習環境,利用清華源安裝一個miniconda環境是非常好的選擇。尤其是今天發現conda install -c menpo opencv3 一句命令就可以順暢的安裝上opencv,之前自己裝的時候也遇到了很多錯誤。conda ...
  • 1. # cd /usr/local/src 2. # tar -zxvf redis-3.0.6.tar.gz 3. # cd redis-3.0.6 4.# make 5.# make PREFIX=/usr/local/redis install 6.cd /usr/local 有redis目 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...