MongoDB 7 分片副本集升級方案詳解(上)

#作者:任少近

文章目錄

  • 前言:Mongodb版本升級
  • 升級步驟
  • 環境
    • 1.1環境準備
    • 1.2standalone升級
    • 1.3分片、副本集升級

前言:Mongodb版本升級

在開始升級之前,請參閱 MongoDB下個版本中的兼容性變更文檔,以確保您的應用程序和部署與下個MongoDB兼容。在開始升級之前,請解決部署中的不兼容問題。
在升級 MongoDB 之前,請務必在臨時環境中測試,然后再將升級部署到生產環境。
以下舉例從7升級到8

升級步驟

1.首先確保是副本集狀態
3.先關閉1個從節點
4.升級副本節點的可執行文件
5.更新配置文件
6.啟動升級后的副本節點
7.確保集群工作正常
8.滾動升級其他副本節點
9.最后主節點降級
10.確保集群可用
11.關閉降級的老的主節點
12.升級老的主節點
13.重新加入集群

環境

1.1環境準備

系統系統 BC 21.10
三臺服務器:192.168.123.247/248/249
升級包:
mongodb-linux-x86_64-rhel8-8.0.3.tgz (截止2024年10月30日星期三最新版)
mongosh-2.3.1-linux-x64.tgz

升級之前插入10000條數據,方便升級后驗證。

[direct: mongos] admin>sh.enableSharding("foo");
[direct: mongos] admin>sh.shardCollection("foo.bar", {_id: 'hashed'});
[direct: mongos] admin> use foo
for (var i = 0; i < 10000; i++) {db.bar.insertOne({i: i})};

在這里插入圖片描述
查看多了一個bar庫狀態:
在這里插入圖片描述

database: {_id: 'foo',primary: 'shard3',partitioned: false,version: {uuid: UUID('8beea767-f87c-4487-a0cf-8889022dc663'),timestamp: Timestamp({ t: 1730188226, i: 2 }),lastMod: 1}},collections: {'foo.bar': {shardKey: { _id: 'hashed' },unique: false,balancing: true,chunkMetadata: [{ shard: 'shard1', nChunks: 1 },{ shard: 'shard2', nChunks: 1 },{ shard: 'shard3', nChunks: 1 }],chunks: [{ min: { _id: MinKey() }, max: { _id: Long('-3074457345618258602') }, 'on shard': 'shard3', 'last modified': Timestamp({ t: 1, i: 8 }) },{ min: { _id: Long('-3074457345618258602') }, max: { _id: Long('3074457345618258602') }, 'on shard': 'shard1', 'last modified': Timestamp({ t: 1, i: 6 }) },{ min: { _id: Long('3074457345618258602') }, max: { _id: MaxKey() }, 'on shard': 'shard2', 'last modified': Timestamp({ t: 1, i: 7 }) }],

解釋:
foo.bar:表示數據庫 foo 中的集合 bar。
shardKey:表示用于分片的鍵。這里的 { “_id”: “hashed” } 表示使用 _id 字段作為分片鍵,并且使用哈希分片策略(hashed sharding strategy)。
unique:表示是否為唯一索引。這里 false 表示 shardKey 不是唯一索引。
balancing:表示是否開啟自動平衡。這里 true 表示自動平衡是開啟的。
chunkMetadata:表示各個分片上的分塊(chunk)數量。每個分塊代表了一部分數據。這里有三個分片 shard1、shard2 和 shard3,每個分片上有一個分塊。
chunks:具體展示了各個分塊的范圍和所在的分片。每個分塊有一個 min 和 max 值來定義范圍,并且指定了所在分片以及最后修改的時間戳。

總結
foo 數據庫的主分片是 shard3,默認操作將在 shard3 上執行。
foo.bar 集合被分片,使用 _id 字段作為分片鍵,并且開啟了自動平衡。
目前 foo.bar 集合的數據在 shard1、shard2 和 shard3 上分布,每個分片上有一個分塊,具體分塊的范圍和所在分片的信息也已經給出。

查看bar庫數據分布數
Shard1上分布3273 個
在這里插入圖片描述
Shard2上分布3388個
在這里插入圖片描述
Shard3上分布3339個
在這里插入圖片描述
總數一萬個
在這里插入圖片描述

1.2standalone升級

升級就將數據備份好了,導出一份,直接升級,不再贅述。

1.3分片、副本集升級

如果部署的為分片、副本集,需要升級

分片集升級之前,先升級好副本集,確保在升級過程中保持數據的一致性和高可用性。
建議備份config數據庫。

./mongodump --uri="mongodb://server1:27017,server2:27017,server3:27017" --db config -o /home/rsj/mongodb/config

在這里插入圖片描述
在這里插入圖片描述

1.3.1特征兼容性版本檢查

  1. 所有副本集節點必須運行7.0版本。不然升級到8.0會失敗。
    featureCompatibilityVersion設立為"7.0" 。
    要檢查featureCompatibilityVersion ,執行
    db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )

該操作返回的結果應包含 “featureCompatibilityVersion” : { “version” : “7.0” }。

在這里插入圖片描述
對于分片和配置服務器,請確保沒有副本集成員處于 ROLLBACK 或 RECOVERING 狀態。

通過db.adminCommand( { replSetGetStatus: 1 } )查看。

myconfigset [direct: secondary] test> use admin
switched to db admin
myconfigset [direct: secondary] admin> db.adminCommand( { replSetGetStatus: 1 } )

在這里插入圖片描述
1.3.2下載 8.0 文件

請按照適用于 Linux 系統的 8.0 版本安裝說明進行操作。這里為
mongodb-linux-x86_64-rhel8-8.0.3.tgz,然后執行實際的升級過程。

1.3.3升級副本集程序

使用“滾動”升級從 MongoDB 7.0 升級到 8.0,即在其他成員可用時單獨升級各個成員,從而最大限度地減少停機時間。升級原則:

  1. 確認從節點
  2. 升級副本集的從節點,一次必須一個。

1.3.4禁用負載均衡器。
在升級 MongoDB 時,需要禁用負載均衡器(Balancer),以確保數據在升級過程中不會被重新分配,減少潛在的數據不一致風險。
將 mongosh 連接到分片集群中的 mongos 實例,然后運行 sh.stopBalancer() 以禁用負載均衡器。登錄任意一個節點
#mongosh mongodb://server1:27000

在這里插入圖片描述
sh.stopBalancer()
在這里插入圖片描述
驗證是否已關閉
在這里插入圖片描述
1.3.4.1第一步:關閉并升級從副本集之一
要關閉 mongod 進程,請使用 mongosh 連接到副本集節點,并運行以下命令:
根據以上信息,確認副本集從節點為server2.

[root@k8s-node6 bin]# mongosh mongodb://localhost:27017myconfigset [direct: secondary] test> use admin
switched to db admin
myconfigset [direct: secondary] admin> db.adminCommand( { shutdown: 1 } );
MongoNetworkError: connection 2 to 127.0.0.1:27017 closed

在這里插入圖片描述
已關閉。進程上也看到已不存在,此關閉是最優雅關閉,能確保所有的數據都被持久化到磁盤后才關閉

將 7.0 二進制文件替換為 8.0 二進制文件。bin_7.0.14下為老版本的mongod
在這里插入圖片描述
mongod啟動進程

mongod --config /usr/local/mongodb/config/conf/mongod.conf

查看server2狀態,等恢復了再進行下一個。查看stateStr狀態,恢復到SECONDARY狀態,
在這里插入圖片描述
查看本地的版本。
在這里插入圖片描述
再登錄已經顯示為8版本
在這里插入圖片描述
1.3.4.2第二步:并閉并升級從副本集之二

相同的方式關閉副本集從節點之server3.
將 7.0 二進制文件替換為 8.0 二進制文件。
mongod啟動
等待恢復到SECONDARY狀態,不再贅述。
結下來再升級最后一個節點:主節點

1.3.4.3第三步:升級主節點

  1. 降級主節點。
  2. 關閉server1。
  3. 并將mongod二進制文件替換為8.0二進制文件。
  4. 請使用 mongosh 連接到主節點,并運行以下命令:
  5. 啟server1

1.3.4.3.1 降級主節點。
將 mongosh 連接到主節點,并使用 rs.stepDown() 降級主節點,強制選舉新的主節點:

myconfigset [direct: primary] test> use admin
switched to db admin
myconfigset [direct: primary] admin> rs.stepDown(){ok: 1,
...

如圖:降級完成后,主節點已經成為從節點。

在這里插入圖片描述
當 rs.status() 顯示主節點已降級,并且server2成員已顯示為 PRIMARY 狀態
在這里插入圖片描述
1.3.4.3.2 升級主節點server1。

關閉server1,
myconfigset [direct: secondary] admin> db.adminCommand( { shutdown: 1 } )
MongoNetworkError: connection 3 to 127.0.0.1:27017 closed

在這里插入圖片描述
查看server1,已經為down狀態,此時進程已停止,
在這里插入圖片描述
替換二進制文件:
將mongod二進制文件替換為8.0二進制文件。
在這里插入圖片描述
mongod
啟動進程

mongod --config /usr/local/mongodb/config/conf/mongod.conf查看server1狀態,已恢復,變成從,運行正常。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895466.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895466.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895466.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI前端開發:跨領域合作的新引擎

隨著人工智能技術的飛速發展&#xff0c;AI代碼生成器等工具的出現正深刻地改變著軟件開發的模式。 AI前端開發的興起&#xff0c;不僅提高了開發效率&#xff0c;更重要的是促進了跨領域合作&#xff0c;讓數據科學家、UI/UX設計師和前端工程師能夠更緊密地協同工作&#xff0…

前端開發所需參考文檔—重中之中

菜鳥教程&#xff1a;https://www.runoob.com/ W3C&#xff1a;https://www.w3school.com.cn/index.html MMDN&#xff1a;https://developer.mozilla.org/zh-CN/ Vue3&#xff1a;Vue.js - 漸進式 JavaScript 框架 | Vue.js 基本上所有的前端開發基礎都可以在其中找到參考…

DeepSeek 助力 Vue 開發:打造絲滑的返回頂部按鈕(Back to Top)

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄 Deep…

C++中接口與繼承的區別(自我學習用)

繼承&#xff08;Inheritance&#xff09;和 接口&#xff08;Interface&#xff09;是面向對象編程&#xff08;OOP&#xff09;中的兩種不同概念&#xff0c;雖然在 C 中沒有像 Java 那樣的 interface 關鍵字&#xff0c;但可以通過 純虛函數 來實現接口的概念。讓我們詳細比…

epoll的原理

Epoll是Linux系統中高效的I/O多路復用機制&#xff0c;廣泛應用于高并發服務器&#xff08;如Nginx、Redis&#xff09;。其核心原理在于事件驅動模型和高效數據結構設計&#xff0c;解決了傳統select/poll的性能瓶頸。以下從數據結構、工作流程、觸發模式等維度展開分析&#…

epoll_ctl的概念和使用案例

epoll_ctl 是 Linux 系統中 I/O 多路復用機制 epoll 的核心函數之一&#xff0c;用于管理 epoll 實例監控的文件描述符&#xff08;File Descriptor, FD&#xff09;。它負責向 epoll 實例注冊、修改或刪除需要監控的 FD 及其事件類型&#xff0c;是實現高性能網絡編程&#xf…

Java練習(20)

ps:練習來自力扣 給你一個 非空 整數數組 nums &#xff0c;除了某個元素只出現一次以外&#xff0c;其余每個元素均出現兩次。找出那個只出現了一次的元素。 你必須設計并實現線性時間復雜度的算法來解決此問題&#xff0c;且該算法只使用常量額外空間。 class Solution {pu…

Tetragon:一款基于eBPF的運行時環境安全監控工具

關于Tetragon Tetragon是一款基于eBPF的運行時環境安全監控工具&#xff0c;該工具可以幫助廣大研究人員檢測并應對安全重大事件&#xff0c;例如流程執行事件、系統調用活動、I/O活動&#xff08;包括網絡和文件訪問等&#xff09;。 在 Kubernetes 環境中使用時&#xff0c;…

1046. 最后一塊石頭的重量

文章目錄 1.題目[1046. 最后一塊石頭的重量](https://leetcode.cn/problems/last-stone-weight/description/)2.思路3.代碼 1.題目 1046. 最后一塊石頭的重量 有一堆石頭&#xff0c;每塊石頭的重量都是正整數。 每一回合&#xff0c;從中選出兩塊** 最重的** 石頭&#xff…

Qt多線程技術【線程池】:QRunnable 和 QThreadPool

在現代軟件開發中&#xff0c;尤其是在處理大量并發任務時&#xff0c;線程池技術是一種高效的解決方案。線程池不僅能提高程序的性能&#xff0c;還能有效管理線程的生命周期&#xff0c;避免頻繁的線程創建和銷毀所帶來的性能損失。本文將以Qt中的 QThreadPool 和 QRunnable …

DOM讓JavaScript可以對文檔中的標簽、屬性、內容等進行 訪增刪改 操作

示例 HTML 文檔 首先&#xff0c;我們有一個簡單的 HTML 文件 index.html&#xff0c;內容如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widt…

218.子結構判斷

class Solution {/*** 判斷樹 B 是否是樹 A 的子結構* param A 樹 A 的根節點* param B 樹 B 的根節點* return 如果 B 是 A 的子結構&#xff0c;返回 true&#xff1b;否則返回 false*/public boolean isSubStructure(TreeNode A, TreeNode B) {// 如果樹 B 為空&#xff0c;…

【DuodooBMS】基于Odoo的開源制造執行系統——以開源之力,驅動智能制造

以用戶為中心的開放式智造平臺 DuodooMES的設計始終圍繞“用戶可編程、生態可生長”的核心思想&#xff0c;打破傳統工業軟件的封閉性&#xff0c;讓制造企業真正成為系統的“主人”&#xff1a; 1. 用戶可編程&#xff1a;生產流程由你定義 界面可配置&#xff1a;無需代碼即…

Unity使用iTextSharp導出PDF-02基礎結構及設置中文字體

基礎結構 1.創建一個Document對象 2.使用PdfWriter創建PDF文檔 3.打開文檔 4.添加內容&#xff0c;調用文檔Add方法添加內容時&#xff0c;內容寫入到輸出流中 5.關閉文檔 using UnityEngine; using iTextSharp.text; using System.IO; using iTextSharp.text.pdf; using Sys…

Navicat導入海量Excel數據到數據庫(簡易介紹)

目錄 前言正文 前言 此處主要作為科普帖進行記錄 原先Java處理海量數據的導入時&#xff0c;由于接口超時&#xff0c;數據處理不過來&#xff0c;后續轉為Navicat Navicat 是一款功能強大的數據庫管理工具&#xff0c;支持多種數據庫系統&#xff08;如 MySQL、PostgreSQL、…

文化財經t8優質短線期貨交易量化模型源碼

// 參數設置 BOLL_PERIOD : 20; // 布林帶周期 RSI_PERIOD : 14; // RSI 周期 OVERSOLD : 30; // 超賣線 OVERBOUGHT : 70; // 超買線 // 計算布林帶 MID : MA(CLOSE, BOLL_PERIOD); UPPER : MID 2 * STD(CLOSE, BOLL_PERIOD); LOWER : MID - 2 * STD(CLOSE,…

[AI]Mac本地部署Deepseek R1模型 — — 保姆級教程

[AI]Mac本地部署DeepSeek R1模型 — — 保姆級教程 DeepSeek R1是中國AI初創公司深度求索&#xff08;DeepSeek&#xff09;推出大模型DeepSeek-R1。 作為一款開源模型&#xff0c;R1在數學、代碼、自然語言推理等任務上的性能能夠比肩OpenAI o1模型正式版&#xff0c;并采用MI…

【UE5】PeerStream像素流部署

視頻教程 https://www.bilibili.com/video/BV1GhiuecEpK?spm_id_from333.788.videopod.sections&vd_source02dd8acc3a83a728e375ff61f1ebe725步驟 下載PeerStream代碼 代碼結構和項目如圖 github地址:https://github.com/inveta/PeerStreamEnterprise下載node node 對應…

老牌系統工具箱,現在還能打!

今天給大家分享一款超實用的電腦軟硬件檢測工具&#xff0c;雖然它是一款比較“資深”的軟件&#xff0c;但依然非常好用&#xff0c;完全能滿足我們的日常需求。 電腦軟硬件維護檢測工具 功能強大易用 這款軟件非常貼心&#xff0c;完全不需要安裝&#xff0c;直接打開就能用…

java商城解決方案

數字化時代&#xff0c;電子商務已成為企業拓展市場的重要渠道。對于想要建立在線商店的企業來說&#xff0c;選擇正確的技術堆棧至關重要。 Java作為一種成熟且廣泛使用的編程語言&#xff0c;為構建購物中心提供了強大的功能和靈活性。 商城Java源碼&#xff1a;商城開發的核…