当前位置: 首页 > news >正文

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状态,已恢复,变成从,运行正常。

在这里插入图片描述

相关文章:

MongoDB 7 分片副本集升级方案详解(上)

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

【工业安全】-CVE-2022-35555- Tenda W6路由器 命令注入漏洞

文章目录 1.漏洞描述 2.环境搭建 3.漏洞复现 4.漏洞分析 4.1&#xff1a;代码分析  4.2&#xff1a;流量分析 5.poc代码&#xff1a; 1.漏洞描述 漏洞编号&#xff1a;CVE-2022-35555 漏洞名称&#xff1a;Tenda W6 命令注入 威胁等级&#xff1a;高危 漏洞详情&#xff1…...

算法分析 ——《模拟》

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

将Sqlite3数据库挂在内存上处理

创作灵感&#xff1a;最近把小学生的口算题从2位数改到3位数&#xff0c;100以内四则运算练习&#xff08;千纬数学&#xff09;再次更新&#xff0c;选取难题-CSDN博客要不断刷题目&#xff0c;以前100以内的加减乘除也是这样刷出来的&#xff0c;代码如下&#xff1a; impor…...

前端大屏适配方案:从设计到实现的全流程指南

引言 随着数据可视化需求的增长&#xff0c;大屏展示项目在前端开发中越来越常见。然而&#xff0c;大屏开发面临独特的挑战&#xff1a; 屏幕分辨率多样&#xff1a;从1080P到4K甚至8K&#xff0c;如何保证清晰度&#xff1f;布局复杂&#xff1a;多图表、多组件如何合理排列…...

学习总结三十二

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学院课程连接&#xff1a;https://edu.csdn.net/course/detail/39573...

linux 查看设备中的摄像头迅速验证设备号

​ 通常&#xff0c;摄像头在系统中会被识别为/dev/video*设备文件&#xff0c;比如/dev/video0、/dev/video1等。用户可能有多个摄像头&#xff0c;比如内置摄像头和外接USB摄像头&#xff0c;这时候每个摄像头会被分配不同的设备号。 1. 列出所有摄像头设备 方法 1&#xf…...

2.8 企业级训练数据构造革命:从人工标注到GPT智能标注的工业级实践指南

企业级训练数据构造革命:从人工标注到GPT智能标注的工业级实践指南 引言:数据标注——AI模型的基石与瓶颈 据2024年AI行业报告显示,高质量标注数据的获取成本占模型开发总成本的62%,且标注错误导致的模型性能下降可达40%。本文将揭示如何结合大模型能力,构建支持千万级数…...

DeepSeek的蒸馏技术:让模型推理更快

DeepSeek系列模型&#xff0c;如DeepSeek-R1-Distill-Qwen-7B&#xff0c;采用了知识蒸馏&#xff08;Knowledge Distillation&#xff09;技术&#xff0c;这是一种强大的模型压缩和优化方法。通过蒸馏&#xff0c;DeepSeek模型在保持甚至提升性能的同时&#xff0c;实现了更快…...

19.4.6 读写数据库中的二进制数据

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

如何在 Elasticsearch 中设置向量搜索 - 第二部分

作者&#xff1a;来自 Elastic Valentin Crettaz 了解如何在 Elasticsearch 中设置向量搜索并执行 k-NN 搜索。 本文是三篇系列文章中的第二篇&#xff0c;深入探讨了向量搜索&#xff08;也称为语义搜索&#xff09;的复杂性以及它在 Elasticsearch 中的实现方式。 第一部分重…...

【CXX-Qt】0 Rust与Qt集成实践指南(CXX-Qt)

CXX-Qt 是一个用于在 Rust 和 Qt 之间实现安全互操作的库。与通常的 Rust Qt 绑定不同&#xff0c;它提供了一种不同的方式来桥接 Qt 代码和 Rust 代码。CXX-Qt 认识到 Qt 和 Rust 代码具有不同的习惯&#xff0c;因此不能直接从一个语言包装到另一个语言。相反&#xff0c;它使…...

C++ 设计模式-适配器模式

适配器模式示例,包括多电压支持、类适配器实现、安全校验等功能: #include <iostream> #include <memory> #include <stdexcept>// 抽象目标接口:通用电源接口 class PowerOutlet {public:virtual ~PowerOutlet() = default;virtual int outputPower() c…...

【Elasticsearch】文本分析Text analysis概述

文本分析概述 文本分析使 Elasticsearch 能够执行全文搜索&#xff0c;搜索结果会返回所有相关的结果&#xff0c;而不仅仅是完全匹配的结果。 如果你搜索“Quick fox jumps”&#xff0c;你可能希望找到包含“A quick brown fox jumps over the lazy dog”的文档&#xff0c…...

【IDEA】2017版本的使用

目录 一、常识 二、安装 1. 下载IDEA2017.exe 2. 安装教程 三、基本配置 1. 自动更新关掉 2. 整合JDK环境 3. 隐藏.idea文件夹和.iml等文件 四、创建Java工程 1. 新建项目 2. 创建包结构&#xff0c;创建类&#xff0c;编写main主函数&#xff0c;在控制台输出内容。…...

ES6 Proxy 用法总结以及 Object.defineProperty用法区别

Proxy 是 ES6 引入的一种强大的拦截机制&#xff0c;用于定义对象的基本操作&#xff08;如读取、赋值、删除等&#xff09;的自定义行为。相较于 Object.defineProperty&#xff0c;Proxy 提供了更灵活、全面的拦截能力。 1. Proxy 语法 const proxy new Proxy(target, hand…...

数据结构——【二叉树模版】

#思路 1、二叉树不同于数的构建&#xff0c;在树节点类中&#xff0c;有数据&#xff0c;左子结点&#xff0c;右子节点三个属性&#xff0c;在树类的构造函数中&#xff0c;添加了变量maxNodes&#xff0c;用于后续列表索引的判断 2.GetTreeNode()函数是常用方法&#xff0c;…...

关闭浏览器安全dns解决访问速度慢的问题

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

【AIGC】语言模型的发展历程:从统计方法到大规模预训练模型的演化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;语言模型的发展历程&#xff1a;从统计方法到大规模预训练模型的演化1 统计语言模型&#xff08;Statistical Language Model, SLM&#xff09;&#xff1a;统…...

思科路由器远程管理保姆级教程:从IP配置到Telnet/SSH登录全流程(避坑line vty和密码设置)

思科路由器远程管理全流程实战指南&#xff1a;从基础配置到安全登录 刚接触思科设备时&#xff0c;最让人头疼的莫过于那一连串看似晦涩的命令行操作。记得我第一次尝试配置路由器远程访问时&#xff0c;明明按照教程一步步操作&#xff0c;却始终无法通过Telnet连接&#xff…...

使用 Taotoken CLI 工具一键配置团队开发环境中的大模型密钥

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用 Taotoken CLI 工具一键配置团队开发环境中的大模型密钥 在团队协作开发中&#xff0c;统一管理大模型 API 密钥和端点配置是一…...

Taotoken API密钥的精细权限管理与操作审计日志在安全运维中的作用

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken API密钥的精细权限管理与操作审计日志在安全运维中的作用 对于负责技术基础设施安全与合规的团队而言&#xff0c;引入新…...

第七部分-容器安全与监控——33. 镜像安全

33. 镜像安全 1. 镜像安全概述 镜像是容器的基石&#xff0c;镜像安全问题直接影响容器运行时安全。镜像安全涵盖基础镜像选择、镜像构建过程、镜像存储和分发等环节。 ┌─────────────────────────────────────────────────…...

模型视图(13):【实战】QColumnView构建级联文件浏览器[官翻]

1. QColumnView实战&#xff1a;打造级联文件浏览器 第一次看到QColumnView这个控件时&#xff0c;我正需要开发一个类似macOS Finder的文件管理器。当时尝试了各种方案都不够理想&#xff0c;直到发现Qt这个隐藏的宝藏控件。它用多列联动的形式展示层级数据&#xff0c;特别适…...

R3nzSkin内存换肤技术实现与国服应用实践

R3nzSkin内存换肤技术实现与国服应用实践 【免费下载链接】R3nzSkin-For-China-Server Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3/R3nzSkin-For-China-Server R3nzSkin是一款专为中国服务器优化的英雄联盟内存换肤工具&am…...

免费开源!3分钟让Mac鼠标滚动告别卡顿的终极平滑方案

免费开源&#xff01;3分钟让Mac鼠标滚动告别卡顿的终极平滑方案 【免费下载链接】Mos 一个用于在 macOS 上平滑你的鼠标滚动效果或单独设置滚动方向的小工具, 让你的滚轮爽如触控板 | A lightweight tool used to smooth scrolling and set scroll direction independently fo…...

三步实现iOS虚拟定位:无需越狱的终极免费方案

三步实现iOS虚拟定位&#xff1a;无需越狱的终极免费方案 【免费下载链接】iFakeLocation Simulate locations on iOS devices on Windows, Mac and Ubuntu. 项目地址: https://gitcode.com/gh_mirrors/if/iFakeLocation iFakeLocation是一个专业级的iOS虚拟定位工具&am…...

基于FastAPI与Flutter的LLM全栈聊天应用:私有化部署与架构解析

1. 项目概述与核心价值最近在折腾一个全栈的AI聊天应用&#xff0c;把后端、前端、数据库和缓存都整合到了一起。这个项目叫LLMChat&#xff0c;它不是一个简单的API包装器&#xff0c;而是一个功能完备、可以私有化部署的聊天平台。核心是用Python的FastAPI构建高性能后端&…...

Midjourney油彩模式正在悄悄升级!内部测试通道流出的--oil-mode beta参数文档(含笔触方向控制与亚麻布基底模拟指令)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney油彩模式的演进脉络与beta通道解密 Midjourney 的油彩模式&#xff08;Oil Painting Mode&#xff09;并非官方命名的功能&#xff0c;而是社区对一组特定风格化参数组合的统称&#xff0c;…...