MongoDB-副本集

一、什么是 MongoDB 副本集?
1.副本集的定义
MongoDB 的副本集(Replica Set)是一组 MongoDB 服务器实例,它们存储同一数据集的副本,确保数据的高可用性和可靠性。副本集中的每个节点都有相同的数据副本,但并不是所有节点都可以直接响应客户端请求。
副本集中的节点有不同的角色:
- Primary 节点:主节点,所有写操作都在这个节点上执行,客户端只能写入主节点。每个副本集只能有一个主节点。
- Secondary 节点:副节点,副本集中的数据复制到这些节点,支持读取操作。副节点会从主节点同步数据。
- Arbiter 节点:仲裁节点,不存储数据,仅用于参与选举,帮助决定主节点的变更。仲裁节点不承担数据存储的职责,但在副本集发生故障时发挥作用。
副本集提供了故障恢复、自动切换(自动选举)以及数据冗余等特性,是保证 MongoDB 集群高可用性和灾难恢复的核心机制。
2.副本集的优势
副本集提供了以下几个重要的优势:
- 高可用性:副本集通过自动故障转移和数据复制,确保在某个节点故障时,系统可以自动切换到其他节点,保证服务的持续可用性。
- 数据冗余:副本集中的每个节点都存储着完整的数据副本,即使某个节点宕机,数据依然能够通过其他节点恢复。
- 读写分离:通过将读取操作分配给 Secondary 节点,副本集可以实现一定程度的读写分离,从而减轻主节点的负担。
- 自动恢复:如果副本集中的 Primary 节点宕机,副本集会自动选举新的 Primary 节点,确保业务不间断。
二、如何配置 MongoDB 副本集?
1.创建副本集
MongoDB 副本集的创建非常简单,通常的配置步骤如下:
1、启动副本集成员
假设我们有三个 MongoDB 实例,分别运行在不同的服务器或端口上,首先启动每个 MongoDB 实例并指定副本集的名称。假设副本集的名称是 rs0,以下是启动 MongoDB 实例的命令:mongod --replSet rs0 --port 27017 --dbpath /data/db1 --bind_ip 127.0.0.1
mongod --replSet rs0 --port 27018 --dbpath /data/db2 --bind_ip 127.0.0.1
mongod --replSet rs0 --port 27019 --dbpath /data/db3 --bind_ip 127.0.0.1
--replSet rs0:指定副本集的名称为 rs0。
--port:指定每个实例的端口号。
--dbpath:指定每个实例的数据存储路径。
2、连接到 MongoDB 实例
使用 mongo 命令连接到副本集中的一个实例(例如端口 27017):
mongo --port 27017
3、初始化副本集
在 MongoDB shell 中执行以下命令来初始化副本集:
rs.initiate()
这将会启动副本集,并将当前节点设置为 Primary。如果系统中已经有多个节点在运行,MongoDB 会尝试自动加入其他节点。
4、添加其他节点到副本集
通过 rs.add() 命令添加更多的节点。例如,添加端口 27018 和 27019 的节点:
rs.add("localhost:27018")
rs.add("localhost:27019")
这样,副本集就完成了初始化,Primary 节点和 Secondary 节点开始同步数据。
2.查看副本集状态
使用 rs.status() 命令查看副本集的状态:
rs.status()
这将显示副本集的详细信息,包括各个节点的状态、选举情况等。
3.配置仲裁节点(Arbiter)
如果副本集中的节点数不为奇数,MongoDB 推荐配置一个仲裁节点来帮助选举过程。仲裁节点不存储数据,只负责选举工作,保证副本集的稳定性。
添加仲裁节点的命令:
rs.addArb("localhost:27020")
三、副本集的工作原理
1.数据同步与复制
副本集中的 Secondary 节点 会持续从 Primary 节点 拉取数据更新,确保所有副本节点的数据一致性。这个过程称为 数据复制。
- 同步方式:Secondary 节点通过 oplog(操作日志)同步数据。oplog 是一个固定大小的循环日志,记录了所有对主节点的写操作。
- 增量同步:副本集节点并不会全量复制数据,而是通过增量同步的方式将变化的数据同步到副本节点,从而减少了带宽和存储的消耗。
2.自动故障切换(Failover)
副本集的一个重要特性是自动故障切换。当 Primary 节点 宕机时,副本集会自动触发选举过程,选举一个 Secondary 节点 为新的 Primary。这个过程通常会在几秒钟内完成,最大程度地减少系统的停机时间。
3.选举过程
副本集使用一种 选举算法 来选举新的 Primary 节点。选举过程的核心原则是:
- 副本集中的所有节点都可以参与选举。
- 选举过程通过比较节点的 优先级 和 投票 来决定新的 Primary 节点。
- Arbiter 节点参与选举,但不存储数据,也不承担主节点角色。
4.写入一致性和读取一致性
MongoDB 副本集中的写操作通常是通过 Primary 节点 执行的,而读取操作可以根据需求选择 Primary 或 Secondary 节点。MongoDB 提供了 读取偏好(Read Preference)机制,允许开发者指定读取操作的优先级:
- primary:只从 Primary 节点读取。
- secondary:只从 Secondary 节点读取。
- primaryPreferred:默认从 Primary 读取,如果 Primary 不可用则从 Secondary 读取。
- secondaryPreferred:默认从 Secondary 读取,如果没有 Secondary 节点则从 Primary 读取。
- nearest:从最近的节点读取,无论是 Primary 还是 Secondary。
四、副本集的管理与维护
1.监控副本集
MongoDB 提供了多种方式来监控副本集的健康状况和性能:
- rs.status():查看副本集的状态。
- rs.printSlaveReplicationInfo():查看副本集的复制信息。
- mongostat:用于实时监控 MongoDB 实例的性能。
- mongotop:查看 MongoDB 实例的操作情况和表的访问频率。
2.手动故障切换
在某些情况下,您可能需要手动触发副本集的故障切换。例如,当您需要将某个 Secondary 节点提升为 Primary 时,可以使用以下命令:
rs.stepDown()
这个命令会让当前的 Primary 节点退让,并触发选举过程。
3.数据恢复
如果副本集的某个节点丢失了数据,可以通过以下步骤恢复:
- 确保数据没有被完全覆盖,可以使用 --repair 参数进行修复。
- 从其他副本集成员中同步数据。

相关文章:
MongoDB-副本集
一、什么是 MongoDB 副本集? 1.副本集的定义 MongoDB 的副本集(Replica Set)是一组 MongoDB 服务器实例,它们存储同一数据集的副本,确保数据的高可用性和可靠性。副本集中的每个节点都有相同的数据副本,但…...
【图像处理lec7】图像恢复、去噪
目录 一、图像退化与恢复概述 二、图像退化中的噪声模型 1、使用 imnoise 函数添加噪声 (1)imnoise 函数的概述 (2)函数语法 (3)支持的噪声类型与具体语法 (4)噪声类型的详细…...
C# 连接ClickHouse 数据库
在 C# 中连接 ClickHouse 数据库,您可以使用 ClickHouse.Client 库。这个库提供了对 ClickHouse 数据库的高效访问。以下是详细的步骤指南,帮助您在 C# 项目中连接和操作 ClickHouse 数据库。 1. 安装 ClickHouse.Client 包 首先,您需要在您…...
在安卓Android应用中实现二维码图像的保存与条形码文本合并
在开发Android应用时,我们经常需要处理图像和文本数据,特别是当涉及到二维码生成和条形码信息展示时。本文将介绍如何在Android应用中实现一个功能,即将二维码图像保存到设备存储,并在图像下方添加条形码文本信息。为了实现这一功…...
Vue3 重置ref或者reactive属性值
需要重新定义一个对象绑定复制给原对象 。 实例代码: const data () > ({groupId: ,groupCode: ,groupName: ,groupType: ,});const formData ref(data());//重置对象值 const reset()>{Object.assign(formData, data()…...
深入理解STL list erase
1、list erase后,当前的迭代器失效,返回指向下一个节点的迭代器 #include<list> #include<iostream> #include<vector> using namespace std;int main() {list<int> ls;ls.push_back(1);ls.push_back(2);ls.push_back(3);list&…...
使用 Python 从 ROS Bag 中提取图像:详解与实现
在机器人应用中,ROS (Robot Operating System) 是一个常见的框架。ROS Bag(rosbag)是 ROS 中用于记录和回放数据流(例如传感器数据、话题消息等)的一种强大工具。有时,我们需要将存储在 rosbag 文件中的图像…...
MYSQL执行一条update语句,期间发生了什么
客户端先通过连接器建立连接,连接器自会判断用户身份; 因为这是一条 update 语句,所以不需要经过查询缓存,但是表上有更新语句,是会把整个表的查询缓存清空的,所以说查询缓存很鸡肋,在 MySQL 8…...
前端性能优化思路
前端性能优化需要从多方面入手,包括减少资源加载时间、优化页面渲染、利用浏览器缓存、使用CDN加速,服务端渲染和预渲染、性能监控和分析。需要综合运用这些优化策略才能显著提升网页或应用的性能和用户体验 一、减少资源加载时间 1. 代码分割 原理: 代码分割允许我们将代…...
有向图判环(leetcode207,leetcode210)
有向图判环(leetcode207,leetcode210) 有向图判环 #include <iostream> #include <vector> using namespace std;struct graph {int V; // 顶点的数量vector<vector<int>> adj; // 邻接表数组…...
概率论得学习和整理25:EXCEL 关于直方图/ 频度图 /hist图的细节,2种做hist图的方法
目录 1 hist图的特点 2 hist的设置技巧:直接生成的hist图往往很奇怪不好用:因为横轴的分组不对 3 如何修改分组 4 设置开放边界,把长尾合并,得到hist图1 5 用原始表得到频数表 6 用上面的频数图做柱状图,再修改&…...
PHP8.4下webman直接使用topthink/think-orm
环境信息 操作系统win11php 8.4.1webman-framework ^1.6.8MySQL 8.4.3topthink/think-orm ^3.0 说明 PHP8.3以下版本 直接使用webman提供的webman/think-orm更方便。 PHP 环境换为 8.4 使用webman/think-orm 报了个错;所以换topthink/think-orm,根据文…...
【从零开始入门unity游戏开发之——C#篇04】栈(Stack)和堆(Heap),值类型和引用类型,以及特殊的引用类型string,垃圾回收( GC)
文章目录 知识回顾一、栈(Stack)和堆(Heap)1、什么是栈和堆2、为什么要分栈和堆3、栈和堆的区别栈堆 4、总结 二、值类型和引用类型1、那么值类型和引用类型到底有什么区别呢?值类型引用类型 2、总结 三、特殊的引用类…...
基于微信小程序的小区疫情防控ssm+论文源码调试讲解
第2章 程序开发技术 2.1 Mysql数据库 为了更容易理解Mysql数据库,接下来就对其具备的主要特征进行描述。 (1)首选Mysql数据库也是为了节省开发资金,因为网络上对Mysql的源码都已进行了公开展示,开发者根据程序开发需…...
第P2周:Pytorch实现CIFAR10彩色图片识别
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目标 实现CIFAR-10的彩色图片识别实现比P1周更复杂一点的CNN网络 具体实现 (一)环境 语言环境:Python 3.10 编 译 器: …...
CTFHub 命令注入-综合练习(学习记录)
综合过滤练习 命令分隔符的绕过姿势 ; %0a %0d & 那我们使用%0a试试,发现ls命令被成功执行 /?ip127.0.0.1%0als 发现一个名为flag_is_here的文件夹和index.php的文件,那么我们还是使用cd命令进入到文件夹下 http://challenge-438c1c1fb670566b.sa…...
OpenCV目标检测 级联分类器 C++实现
一.目标检测技术 目前常用实用性目标检测与跟踪的方法有以下两种: 帧差法 识别原理:基于前后两帧图像之间的差异进行对比,获取图像画面中正在运动的物体从而达到目标检测 缺点:画面中所有运动中物体都能识别 举个例子…...
QT6 Socket通讯封装(TCP/UDP)
为大家分享一下最近封装的以太网socket通讯接口 效果演示 如图,界面还没优化,后续更新 废话不多说直接上教程 添加库 如果为qmake项目中,在.pro文件添加 QT network QT core gui QT networkgreaterThan(QT_MAJOR_VERS…...
elasticsearch设置密码访问
1 用户认证介绍 默认ES是没有设置用户认证访问的,所以每次访问时,直接调相关API就能查询和写入数据。现在做一个认证,只有通过认证的用户才能访问和操作ES。 2 开启加密设置 1.生成证书文件 /usr/share/elasticsearch/bin/elasticsearch-…...
彻底理解如何优化接口性能
作为后端研发,必须要掌握怎么优化接口的性能或者说是响应时间,这样才能提高系统的系能,本文通过如下两个方面进行分析: 一.后端代码 有如下几步: 1.缓存机制 这是最场景的方式,当使用了缓存后,…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
