MongoDB-副本集

主页.png

一、什么是 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 参数进行修复。
  • 从其他副本集成员中同步数据。

二维码.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/63188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《数据结构》(408代码题)

2009 单链表(双指针) 分析:首先呢,给我们的数据结构是一个带有表头结点的单链表,也不允许我们改变链表的结构。链表的长度不是直接给出的啊,所以这个倒数也很棘手。那我们该如何解决这个“k”呢&#xff0c…

6.1 初探MapReduce

MapReduce是一种分布式计算框架,用于处理大规模数据集。其核心思想是“分而治之”,通过Map阶段将任务分解为多个简单任务并行处理,然后在Reduce阶段汇总结果。MapReduce编程模型包括Map和Reduce两个阶段,数据来源和结果存储通常在…

Cad c#.net 一键修改标注dimension中的文本内容

本例为给标注加前缀,也可定制其他形式,效果如下: public class Demo{[CommandMethod("xx")]//public void Dim(){Document doc Application.DocumentManager.MdiActiveDocument;Database db doc.Database;Editor ed doc.Editor;…

旅游系统旅游小程序PHP+Uniapp

旅游门票预订系统,支持景点门票、导游产品便捷预订、美食打卡、景点分享、旅游笔记分享等综合系统 更新日志 V1.3.0 1、修复富文本标签 2、新增景点入驻【高级版本】3、新增门票核销【高级版】4、新增门票端口【高级版】

MacOS系统 快速安装appium 步骤详解

在macOS系统上,你可以通过使用nvm(Node Version Manager)来管理Node.js的版本,并基于nvm安装的Node.js环境来快捷地安装Appium。以下是具体步骤: 一、安装nvm 下载nvm 访问nvm的GitHub仓库(nvm GitHub&…

技术速递|.NET 9 简介

作者:.NET 团队 排版:Alan Wang 今天,我们非常激动地宣布 .NET 9的发布,这是迄今为止最高效、最现代、最安全、最智能、性能最高的 .NET 版本。这是来自世界各地数千名开发人员又一年努力的成果。这个新版本包括数千项性能、安全和…

Vue项目打包部署到服务器

1. Vue项目打包部署到服务器 1.1. 配置 (1)修改package.json文件同级目录下的vue.config.js文件。 // vue.config.js module.exports {publicPath: ./, }(2)检查router下的index.js文件下配置的mode模式。   检查如果模式改…

NPU是什么?电脑NPU和CPU、GPU区别介绍

随着人工智能技术的飞速发展,计算机硬件架构也在不断演进以适应日益复杂的AI应用场景。其中,NPU(Neural Processing Unit,神经网络处理器)作为一种专为深度学习和神经网络运算设计的新型处理器,正逐渐崭露头…

使用skywalking,grafana实现从请求跟踪、 指标收集和日志记录的完整信息记录

Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的开源项目, 2017年12月SkyWalking成为Apache国内首个个人孵化项目, 2019年4月17日SkyWalking从Apache基金会的孵化器毕业成为顶级项目, 目前SkyWalking支持Java、 .Net、 Node.js、…

纯CSS实现文本或表格特效(连续滚动与首尾相连)

纯CSS实现文本连续向左滚动首尾相连 1.效果图&#xff1a; 2.实现代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, init…

【LeetCode刷题之路】622.设计循环队列

LeetCode刷题记录 &#x1f310; 我的博客主页&#xff1a;iiiiiankor&#x1f3af; 如果你觉得我的内容对你有帮助&#xff0c;不妨点个赞&#x1f44d;、留个评论✍&#xff0c;或者收藏⭐&#xff0c;让我们一起进步&#xff01;&#x1f4dd; 专栏系列&#xff1a;LeetCode…

Node.js基础入门

1.Node.js 简介 Node 是一个让 JavaScript (独立)运行在服务端的开发平台,它让 JavaScript 成为与PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。 发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。 简单的说 Node.js 就是运行在服务端的…

#思科模拟器通过服务配置保障无线网络安全Radius

演示拓扑图&#xff1a; 搭建拓扑时要注意&#xff1a; 只能连接它的Ethernet接口&#xff0c;不然会不通 MAC地址绑定 要求 &#xff1a;通过配置MAC地址过滤禁止非内部员工连接WiFi 打开无线路由器GUI界面&#xff0c;点开下图页面&#xff0c;配置路由器无线网络MAC地址过…

Qt-chart 画折线图(以时间为x轴)

上图 代码 #include <iostream> #include <random> #include <qcategoryaxis.h>void MainWindow::testLine() {//1、创建图表视图QChartView* view new QChartView(this);//2.创建图表QChart* chart new QChart();//3.将图表设置给图表视图view->setCh…

up主亲测,ToDesk/青椒云/顺网云这三款云电脑玩转AIGC场景

文章目录 1. 前言2. 云电脑性能分析3. 基础硬件数据3.1 硬件配置3.2 AI 评测跑分 4. 云电脑 AIGC 上手实测4.1 ToDesk4.1.1 AIGC 技术集成情况4.1.2 界面及功能4.1.3 项目部署4.1.4 黑神话悟空 AI 换脸4.1.6 AIGC 文生图体验 4.2 青椒云4.2.1 AIGC 技术集成情况4.2.2 界面及功能…

C++(十八)

前言&#xff1a; 本文依据上一篇&#xff0c;继续对C中的函数进行学习。 一&#xff0c;内联函数。 再执行函数代码时&#xff0c;比不使用函数花费了更多时间&#xff0c;因为总结步骤&#xff0c;传递参数和返回值都很花费时间。 因此&#xff0c;在调试小型函数时&…

数独游戏app制作拆解(之一)——功能介绍

android studio版本&#xff1a;2023.3.1 例程名称&#xff1a;shudu666 前阵子作了一个EXCEL版的数独&#xff0c;再早之前就想作这个数独app,但一直没动手&#xff0c;一方面懒&#xff0c;另一方面我把自己绕到坑里了&#xff0c;之前做的是一解数独的app,那个是有点难&am…

Python随机抽取Excel数据并在处理后整合为一个文件

本文介绍基于Python语言&#xff0c;针对一个文件夹下大量的Excel表格文件&#xff0c;基于其中每一个文件&#xff0c;随机从其中选取一部分数据&#xff0c;并将全部文件中随机获取的数据合并为一个新的Excel表格文件的方法。 首先&#xff0c;我们来明确一下本文的具体需求。…

构建树莓派温湿度监测系统:从硬件到软件的完整指南

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

28. Three.js案例-创建圆角矩形并进行拉伸

28. Three.js案例-创建圆角矩形并进行拉伸 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染 3D 场景的主要渲染器。 构造器 WebGLRenderer( parameters : Object ) 参数类型描述parametersObject渲染器的配置参数&#xff0c;可选。 …