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

MongoDB 双机热备那篇文章是 “毒”

5faf2e4a7d450c535729a731ed2c8b3f.png

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis ,Oracle ,Oceanbase 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加微信号 liuaustin3 (共1200人左右 1 + 2 + 3)新人会进入3群

如果没有法律,我可能真想做了这个事情,群里最近有人问MongoDB 双机热备,我非常愤怒的告诉他们,不可以,不应该,不要,NO NO NO 。

这个底气我是有的,为什么?官方 official 问答,解释了这个问题,我还真好笑,还真有人提出这个问题。哎,使用MongoDB 7年了,从3.2 到了现在的4.4 (惭愧,我们准备5.0) , 没有想到MongoDB 的知识普及率还那么低,还有人问出 MongoDB  双机热备,还有人写出这样的文章。

212ff454f21df8582ecc2b5320264c3a.png

先看完官方的回复 MongoDB Developer Community 

ae5c380a0201935daf3e7ccdb4d53581.png

757ede361cbfb523b84d8fa9b29f9c95.png

0f1202349ca50dafcdd7743efc566920.png

这里普及一个基本的概念,MongoDB 本身在生产环境中,从来不存在单机使用方式(不抬杠,如果你的业务随时可以DOWN机,那你不在讨论的范围),同时必须要注意,MongoDB 本身是一款历史和传统相比,很新的数据库他本身在设计之初就融入了分布式的概念,网络数据传输的概念,自动切换的概念,以及服务程序和程序员至上的方式,最终是不能用传统数据库的理念去使用MongoDB 的。

在MongoDB 的生产环境中,有最小化成本投入和标准成本投入,以及特殊成本投入。

举例如果你的项目需要成本较低,那么你在搭建MongoDB 的时候可以加入 Arbiter节点, 但在标准的应用里面,官方也不建议你使用Arbiter ,而是标准的三节点的MongoDB Replicaset.

MongoDB 具有完善的复制集的协议,也就是我们知道的 protocol version1 简称 PV1 , 这个协议是从MongoDB 3.2后开始的,他详细的定义了如下的一些概念

1  写入数据的概念:在写入数据的时候  w:1 是MongoDB 特有的概念,其中可以标定到底需要几个节点写入后,才可以算是数据写入,比如你有3个节点,你在一条插入数据的语句执行后,MongoDB 会根据你语句中的数字来判断你的写入的操作是否完成,给与数据安全写,和性能之间的平衡的权利交给你来抉择。当然你可以使用默认的设置 majority ,大多数写的概念,完全能Hold 95%以上的应用场景。

在早期的PV0中(版本为  MongoDB 3.4.1 之前的版本)与PV1 版本的不同在于PV1 在4.0 后不会在支持具有副本集W:1 回滚的可能性。

3  投票权和否决权,在MongoDB 中为什么必须是三个节点,我想在MySQL  使用MHA 的那些同学也深知这个道理,脑裂,也就是如果你是两个节点的情况下,你网络出现问题,如何判断你当时那个节点应该是主,那个节点应该从,两个节点,自说自话各自为政,导致数据不一致,这点MySQL 的同学应该是深知的,那么为什么到了 MongoDB 这样一个使用 raft like 协议的数据库,提出双机热备这样,上世纪早期数据库提出的一个算不算高可用的理念。请别把Oracle 的 DG 放到这里。

这里在MongoDB PV1 协议中明确指出,各个成员可以在特性选举的情况下,对候选人投赞成或不赞成,但单方面不能停止选举,这在两个节点是无法实现这个功能的,因为,因为,因为 在两个节点的情况下,瞬间两个节点都认为他们是主节点,需要有第三个节点来进行仲裁,到底谁是真正的主节点。PV1 中使用了 term的概念,允许快速检测到同时存在主节点并在短时间进行多次的成功的选举,这更是在两个节点的情况下无法完成。

在MongoDB 中4.0以上的版本PV1,防止一个成员对于选举重复发起投票,通过term修改副本集协议中的版本,在MongoDB 副本集中每个成员都会维护一个term计数器,计数器会递增标识每次选举中状态是否进行了切换,这里在任意一个member接受到选票时他会检查当前自己的term和选票上的term 谁大谁小,如果自己小则更新自己,并接受该选票,同时也会验证选票中候选人的信息来确保自己有没有重复投票,通过这样的方式每个成员对每个 Term 发送一次选票,避免重复投票和选择冲突,而这一切都建议在至少3个节点的基础上。

所以我不知道提出MongoDB 双机热备的文章的作者是否了解MongoDB的基本原理。

f3288f2b3bf74e5cb0847133268df3a5.png

同时这里也建议,不在使用MongoDB 3.x ,目前在用MongoDB 应该在4.X 起步,也是基于3.x 在使用PV0 协议时的一些可能的问题的基础上。

如果你还在使用3.x 的Mongodb 3.2 3.4 可以通过如下的命令来修改你当前的使用的版本信息

cfg = rs.conf();
cfg.protocolVersion=1;
rs.reconfig(cfg);

看似简单的MongoDB ,一点都不简单,如果你觉得他简单,那是你还没有深入。

参考文章链接

https://www.mongodb.com/community/forums/t/setup-a-2-node-mongodb-replica-set/3323

0718efa9835a5bb9616416a88dae52eb.png

相关文章:

MongoDB 双机热备那篇文章是 “毒”

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis ,Oracle ,Oceanbase 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加微信号 liuaustin3 (…...

Leetcode17电话号码的组合

思路:用字典的形式保存号码的映射,实际组合是前一个数字串的组合加上后面一个数字的所有可能组合 answer_dict{2:[a,b,c],3:[d,e,f],4:[g,h,i],5:[j,k,l],6:[m,n,o],7:[p,q,r,s],8:[t,u,v],9:[w,x,y,z]} class Solution:def letterCombinations(self, d…...

入职一家公司只会功能测试,如何进一步提升自己?

一定要帮助想上进却又迷茫的人。最近也听到一些做功能测试的同学的交流,天天做手工测试,想提升一下自己又不知道如何提升?其实还是在于这些同学对自己没有一个清晰的定位,没有明确的目标。 做为功能测试人员来讲,从发…...

WordPress导航主题源码

源码说明: V2.0406 添加搜索自动索引百度热搜关键词 添加首页tab标签模式加载方式切换(ajax加载和普通加载)(首页设置) 修复tab标签ajax加载模式会显示未审核的网址的bug 小屏幕热搜采用水平滚动 优化子主题支持 添加文章分页 添加解决WordPress 429的服务(…...

基于ADAU1452 DSP ANC和AEC算法的实现

是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?加我微信hezkz17, 本群提供音频技术答疑服务,+群附加赠送,DSP音频项目核心开发资料, 1 使用Sigma中的NLMS算法模块 对应C源代码:...

Wireshark数据抓包分析之传输层协议(TCP协议)

一、实验目的: 通过使用wireshark对TCP协议的数据包的抓取分析TCP协议的具体内容 二、预备知识: 1.需要了解TCP协议的三次握手过程 2.需要了解TCP协议的四次挥手的过程 三、网络拓扑 四、实验过程: part1:3次握手和4次挥手的数据包的获取 …...

ADRV9009子卡 设计原理图:FMCJ450-基于ADRV9009的双收双发射频FMC子卡 便携测试设备

FMCJ450-基于ADRV9009的双收双发射频FMC子卡 一、板卡概述 ADRV9009是一款高集成度射频(RF)、捷变收发器,提供双通道发射器和接收器、集成式频率合成器以及数字信号处理功能。北京太速科技,这款IC具备多样化的高性能和低功耗组合,FMC子…...

Linux 桌面上的 Firefox 面临着大问题

导读毫无疑问,无论是在桌面、笔记本电脑还是移动设备上,浏览器都是任何操作系统中最重要的应用之一。 如果没有一个功能强大、快速且稳定的浏览器,操作系统的实用性将大幅度降低,以至于我相当确定,如果一个操作系统没有…...

查漏补缺 - 构造函数,原型,this,原型链,继承

目录 1,构造函数2,原型3,this4,原型链1,特点2,Object.prototype.toString()3,instanceof 运算符4,Object.getPrototypeOf()5,创建空原型对象6,面试题 5&#…...

C# 学习笔记--个人学习使用 <2>

C# 学习笔记 Chapter 2 比较硬的基础部分Section 1 委托Part 1 Action 与 func 委托的示例Part 2 自定义委托Part 3 委托的一般使用Part 4 委托的高级使用Part 5 适时地使用接口 Interface 取代一些对委托的使用 Section 2 事件Part 1 初步了解事件Part 2 事件的应用Part 3 事件…...

Linux网络编程Socket通信6-Libevent移植与使用

目录 libeventlibevent交叉编译并移植libevent安装安装步骤测试代码libevent执行报错解决 libevent_base根节点event_base_newevent_base_freeevent_reinit event_loop循环等待事件event_base_loopevent_base_dispatchevent_base_loopexitevent_base_loopbreak event事件event_…...

c#:委托 泛型委托的使用 泛型约束

委托 在 C# 中,delegate 是一种引用类型,它允许您定义和使用可以引用特定方法的对象。delegate 可以看作是一种函数指针,它可以在运行时动态地调用不同的方法。 以下是一个简单的例子来说明 delegate 的实际作用: // 1. 定义一…...

大数据之linux入门

一、linux是什么 linux操作系统 开发者是林纳斯-托瓦兹,出于个人爱好编写。linux是一个基于posix和unix的多用户、多任务、支持多线程和多CPU的操作系统。 Unix是20世纪70年代初出现的一个操作系统,除了作为网络操作系统之外,还可以作为单…...

MPI之MPI_Sendrecv接口以及空进程概念介绍

MPI_Sendrecv函数原型 int MPI_Sendrecv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag,void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, int recvtag, MPI_Comm comm, MPI_Status *status);其中各个参数的含义如下&…...

Revit SDK:PointCurveCreation 创建点来拟合曲线

前言 这个例子通过留个例子来展示如何通过点来拟合曲线或者曲面。 内容 PointsParabola 生成抛物线的核心逻辑&#xff1a; double yctr 0; XYZ xyz null; ReferencePoint rp null; double power 1.2; while (power < 1.5){double xctr 0;double zctr 0;while (…...

嵌入式Linux开发实操(十五):nand flash接口开发

# 前言 flash memory,分NAND和NOR: 如果说nor flash有个特点就是能执行代码,NOR并行接口具有地址和数据总线,spi flash更是主要用于存储代码,SPI(或QSPI)NOR代码可就地执行(XiP),一般系统要求flash闪存提供相对较高的频率和数据缓存的clocking。而nand flash主要用于…...

vue2 组件库之vetur提示

当我们开发完自定义UI组件库后&#xff0c;在项目中使用时&#xff0c;想要达到以下提示效果&#xff0c;组件提示与属性提示&#xff0c;有什么解决方案呢&#xff1a; 事实上&#xff0c;这是vetur的功能&#xff0c;原文如下&#xff1a; Component Data | Vetur If a pac…...

慕课网 Go工程师 第三周 package和gomodules章节

Go包的引入&#xff1a; 包名前面加匿名&#xff0c;只引入但不使用&#xff0c;如果对应包有init函数&#xff0c;会执行init函数&#xff08;初始化操作&#xff09; 包名前面加. 把这个包的结构体和方法导入当前包&#xff0c;慎用&#xff0c;你不知道当前包和被引入的包用…...

【ES6】JavaScript 中的数组方法reduce

reduce() 是一个 JavaScript 中的数组方法&#xff0c;它会对数组的每个元素执行一个提供的 reducer 函数&#xff0c;将其减少到一个单一的值。 这是 reduce() 的基本用法&#xff1a; //(method) Array<number>.reduce(callbackfn: (previousValue: number, currentV…...

数据结构--树4.2(二叉树)

目录 一、二叉树的定义和特点 1、定义 2、特点 二、二叉树的基本形态 1、空二叉树 2、只有一个根结点 3、根结点只有左子树 4、根结点只有右子树 5、根结点既有左子树又有右子树 6、斜树 7、满二叉树 8、满二叉树和完全二叉树 三、二叉树的性质 一、二叉树的定义和…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...