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.缓存机制 这是最场景的方式,当使用了缓存后,…...
深入解析Triton Inference Server的Backend机制与实战配置
1. Triton Inference Server的Backend机制揭秘 第一次接触Triton Inference Server时,我被它的Backend机制搞得一头雾水。直到在真实项目中踩过几次坑后,才真正理解它的精妙之处。简单来说,Backend就像是一个万能适配器,让Triton能…...
Windows下Power Shell快速激活venv虚拟环境的正确姿势(避坑指南)
Windows下Power Shell快速激活venv虚拟环境的正确姿势(避坑指南) 在Windows平台上使用Python进行开发时,虚拟环境(venv)是隔离项目依赖的必备工具。然而,许多从Linux/macOS转向Windows的开发者,…...
用STM32F103C8和5路红外模块,我花了一个周末做了个能自己拐弯的小车(附完整代码)
从零打造智能循迹小车:STM32F103C8与红外模块的实战指南 看着桌上散落的电子元件逐渐组合成一个能自主行动的小车,这种成就感是任何现成玩具都无法比拟的。本文将带你完整经历一次基于STM32F103C8和五路红外模块的智能小车开发过程,无需复杂算…...
解锁欧空局10米土地利用数据:从注册到实战应用全流程解析
1. 欧空局10米土地利用数据简介 第一次接触欧空局WorldCover平台的朋友可能会被这个10米分辨率的土地利用数据惊艳到。作为一个长期和遥感数据打交道的从业者,我可以很负责任地说,这个数据集在精度和实用性上确实很能打。简单来说,它把全球地…...
换掉 Notepad++,事实证明它更牛逼!
提到文本编辑工具,大家肯定第一时间想到的是 Notepad 。Notepad 是一种流行的源代码编辑器,也是 Windows 用户的可靠记事本替代品。它是一个功能强大的实用程序,可在不占用大量存储空间的情况下提供最佳性能。不幸的是,它不适用于…...
Win11虚拟内存配置全解析:从临时页面文件到永久解决方案(含DISM命令详解)
Win11虚拟内存深度优化指南:从原理到实战的完整解决方案 每次开机看到那个烦人的"页面文件配置问题"提示,是不是让你感到困惑又无奈?作为Windows系统内存管理的关键组件,虚拟内存的配置直接影响着系统性能和稳定性。本文…...
突破4大技术壁垒!MediaPipe TouchDesigner让实时视觉交互创作效率提升300%
突破4大技术壁垒!MediaPipe TouchDesigner让实时视觉交互创作效率提升300% 【免费下载链接】mediapipe-touchdesigner GPU Accelerated MediaPipe Plugin for TouchDesigner 项目地址: https://gitcode.com/gh_mirrors/me/mediapipe-touchdesigner 核心价值&…...
Web Scraper插件实战:解决豆瓣电影Top250爬取乱序问题(附完整JSON配置)
Web Scraper插件实战:解决豆瓣电影Top250爬取乱序问题(附完整JSON配置) 当你第一次使用Web Scraper爬取豆瓣电影Top250榜单时,可能会遇到一个令人困惑的现象:明明页面上电影名称和简介是对应的,但爬取下来的…...
自动驾驶小白必看:航向角、偏航角、前轮转角到底有什么区别?
自动驾驶入门:航向角、偏航角与前轮转角的本质差异与应用解析 刚接触自动驾驶技术时,最让人困惑的莫过于那些描述车辆方向的专业术语——航向角、偏航角、前轮转角,它们看起来相似却又各有所指。理解这些概念不仅是掌握车辆控制的基础&#…...
Qwen3.5-4B-Claude模型Java微服务集成指南:SpringBoot实战案例
Qwen3.5-4B-Claude模型Java微服务集成指南:SpringBoot实战案例 1. 引言:当大模型遇上微服务 最近在开发企业知识管理系统时,我们遇到了一个典型需求:如何让传统Java微服务架构与前沿的大语言模型无缝集成。经过多次尝试…...
