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.mzph.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;商城开发的核…