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特征兼容性版本检查
- 所有副本集节点必须运行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.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第三步:升级主节点
- 降级主节点。
- 关闭server1。
- 并将mongod二进制文件替换为8.0二进制文件。
- 请使用 mongosh 连接到主节点,并运行以下命令:
- 启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状态,已恢复,变成从,运行正常。
相关文章:

MongoDB 7 分片副本集升级方案详解(上)
#作者:任少近 文章目录 前言:Mongodb版本升级升级步骤环境1.1环境准备1.2standalone升级1.3分片、副本集升级 前言:Mongodb版本升级 在开始升级之前,请参阅 MongoDB下个版本中的兼容性变更文档,以确保您的应用程序和…...

【工业安全】-CVE-2022-35555- Tenda W6路由器 命令注入漏洞
文章目录 1.漏洞描述 2.环境搭建 3.漏洞复现 4.漏洞分析 4.1:代码分析 4.2:流量分析 5.poc代码: 1.漏洞描述 漏洞编号:CVE-2022-35555 漏洞名称:Tenda W6 命令注入 威胁等级:高危 漏洞详情࿱…...

算法分析 ——《模拟》
文章目录 《替换所有的问号》题目描述:代码演示:代码解析: 《提莫攻击》题目描述:代码演示:代码解析: [《Z 字形变换》](https://leetcode.cn/problems/zigzag-conversion/)题目描述:代码演示&a…...

将Sqlite3数据库挂在内存上处理
创作灵感:最近把小学生的口算题从2位数改到3位数,100以内四则运算练习(千纬数学)再次更新,选取难题-CSDN博客要不断刷题目,以前100以内的加减乘除也是这样刷出来的,代码如下: impor…...
前端大屏适配方案:从设计到实现的全流程指南
引言 随着数据可视化需求的增长,大屏展示项目在前端开发中越来越常见。然而,大屏开发面临独特的挑战: 屏幕分辨率多样:从1080P到4K甚至8K,如何保证清晰度?布局复杂:多图表、多组件如何合理排列…...

学习总结三十二
map #include<iostream> #include<map> using namespace std;int main() {//首先创建一个map对象map<int, char>oneMap;//插入数据oneMap.insert(pair<int, char>(1, A));oneMap.insert(make_pair(2,B));oneMap.insert(map<int,char>::value_ty…...

飞书专栏-TEE文档
CSDN学院课程连接:https://edu.csdn.net/course/detail/39573...
linux 查看设备中的摄像头迅速验证设备号
通常,摄像头在系统中会被识别为/dev/video*设备文件,比如/dev/video0、/dev/video1等。用户可能有多个摄像头,比如内置摄像头和外接USB摄像头,这时候每个摄像头会被分配不同的设备号。 1. 列出所有摄像头设备 方法 1…...
2.8 企业级训练数据构造革命:从人工标注到GPT智能标注的工业级实践指南
企业级训练数据构造革命:从人工标注到GPT智能标注的工业级实践指南 引言:数据标注——AI模型的基石与瓶颈 据2024年AI行业报告显示,高质量标注数据的获取成本占模型开发总成本的62%,且标注错误导致的模型性能下降可达40%。本文将揭示如何结合大模型能力,构建支持千万级数…...
DeepSeek的蒸馏技术:让模型推理更快
DeepSeek系列模型,如DeepSeek-R1-Distill-Qwen-7B,采用了知识蒸馏(Knowledge Distillation)技术,这是一种强大的模型压缩和优化方法。通过蒸馏,DeepSeek模型在保持甚至提升性能的同时,实现了更快…...

19.4.6 读写数据库中的二进制数据
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 需要北风数据库的请留言自己的信箱。 北风数据库中,类别表的图片字段在【数据表视图】中显示为Bitmap Image࿱…...

如何在 Elasticsearch 中设置向量搜索 - 第二部分
作者:来自 Elastic Valentin Crettaz 了解如何在 Elasticsearch 中设置向量搜索并执行 k-NN 搜索。 本文是三篇系列文章中的第二篇,深入探讨了向量搜索(也称为语义搜索)的复杂性以及它在 Elasticsearch 中的实现方式。 第一部分重…...
【CXX-Qt】0 Rust与Qt集成实践指南(CXX-Qt)
CXX-Qt 是一个用于在 Rust 和 Qt 之间实现安全互操作的库。与通常的 Rust Qt 绑定不同,它提供了一种不同的方式来桥接 Qt 代码和 Rust 代码。CXX-Qt 认识到 Qt 和 Rust 代码具有不同的习惯,因此不能直接从一个语言包装到另一个语言。相反,它使…...
C++ 设计模式-适配器模式
适配器模式示例,包括多电压支持、类适配器实现、安全校验等功能: #include <iostream> #include <memory> #include <stdexcept>// 抽象目标接口:通用电源接口 class PowerOutlet {public:virtual ~PowerOutlet() = default;virtual int outputPower() c…...
【Elasticsearch】文本分析Text analysis概述
文本分析概述 文本分析使 Elasticsearch 能够执行全文搜索,搜索结果会返回所有相关的结果,而不仅仅是完全匹配的结果。 如果你搜索“Quick fox jumps”,你可能希望找到包含“A quick brown fox jumps over the lazy dog”的文档,…...

【IDEA】2017版本的使用
目录 一、常识 二、安装 1. 下载IDEA2017.exe 2. 安装教程 三、基本配置 1. 自动更新关掉 2. 整合JDK环境 3. 隐藏.idea文件夹和.iml等文件 四、创建Java工程 1. 新建项目 2. 创建包结构,创建类,编写main主函数,在控制台输出内容。…...
ES6 Proxy 用法总结以及 Object.defineProperty用法区别
Proxy 是 ES6 引入的一种强大的拦截机制,用于定义对象的基本操作(如读取、赋值、删除等)的自定义行为。相较于 Object.defineProperty,Proxy 提供了更灵活、全面的拦截能力。 1. Proxy 语法 const proxy new Proxy(target, hand…...
数据结构——【二叉树模版】
#思路 1、二叉树不同于数的构建,在树节点类中,有数据,左子结点,右子节点三个属性,在树类的构造函数中,添加了变量maxNodes,用于后续列表索引的判断 2.GetTreeNode()函数是常用方法,…...

关闭浏览器安全dns解决访问速度慢的问题
谷歌浏览器加载速度突然变慢了?检查安全DNS功能(DoH)是否被默认开启。 谷歌浏览器在去年已经推出安全DNS功能(即DoH) , 启用此功能后可以通过加密的DNS增强网络连接安全性。例如查询请求被加密后网络运营商将无法嗅探用户访问的地址,因此对于增强用户的…...

【AIGC】语言模型的发展历程:从统计方法到大规模预训练模型的演化
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯语言模型的发展历程:从统计方法到大规模预训练模型的演化1 统计语言模型(Statistical Language Model, SLM):统…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...