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

开头还是介绍一下群,如果感兴趣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 双机热备,还有人写出这样的文章。

先看完官方的回复 MongoDB Developer Community



这里普及一个基本的概念,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%以上的应用场景。
2 在早期的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的基本原理。

同时这里也建议,不在使用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

相关文章:
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 生成抛物线的核心逻辑: 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组件库后,在项目中使用时,想要达到以下提示效果,组件提示与属性提示,有什么解决方案呢: 事实上,这是vetur的功能,原文如下: Component Data | Vetur If a pac…...
慕课网 Go工程师 第三周 package和gomodules章节
Go包的引入: 包名前面加匿名,只引入但不使用,如果对应包有init函数,会执行init函数(初始化操作) 包名前面加. 把这个包的结构体和方法导入当前包,慎用,你不知道当前包和被引入的包用…...
【ES6】JavaScript 中的数组方法reduce
reduce() 是一个 JavaScript 中的数组方法,它会对数组的每个元素执行一个提供的 reducer 函数,将其减少到一个单一的值。 这是 reduce() 的基本用法: //(method) Array<number>.reduce(callbackfn: (previousValue: number, currentV…...
数据结构--树4.2(二叉树)
目录 一、二叉树的定义和特点 1、定义 2、特点 二、二叉树的基本形态 1、空二叉树 2、只有一个根结点 3、根结点只有左子树 4、根结点只有右子树 5、根结点既有左子树又有右子树 6、斜树 7、满二叉树 8、满二叉树和完全二叉树 三、二叉树的性质 一、二叉树的定义和…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
