前文我们搭建MongoDB三成员副本集,了解集群基本特性,今天我们围绕下图聊一聊背后的细节。

默认搭建的replica set均在主节点读写,辅助节点冗余部署,形成高可用和备份, 具备自动故障转移的能力。

集群心跳保活

集群每个节点以周期性向其他成员发出心跳命令 replSetHeartbeat来获取状态,

根据应答消息来更新节点的状态,根据最终状态确定是否重选主节点。

默认心跳周期 heartbeatIntervalMillis= 2000ms;

认定Primary节点失联的阈值 electionTimeoutMillis=10s

异步复制

辅助节点复制主节点的oplog,并将改变应用到数据集,从而保持与主节点数据同步。

这里有三个知识点:

  • oplog是一个特殊的封顶集合capped collection, 主节点上的operation log会记录在主节点的oplog中,辅助节点异步拷贝这些操作,这样所有的节点的都包含operatin log的一个副本:local.oplog.rs集合

  • 每次异步复制触发的时机是在心跳保活阶段,所有的辅助节点都会在ping阶段从其他成员插入oplog文档。

  • oplog中的每个操作都是冥等的:无论是一次还是多次应用到目标数据集,oplog操作会产生相同的结果

删除和插入操作:

若多次应用删除操作,后续删除操作无效果;

若多次应用插入操作,因为每次操作均包含_id值,因此它也不会插入文档的第二个副本(因为_id必须是唯一的)。

当有新节点加入集群,该节点会启动另一种同步:initial sync, 将所有数据从副本集一个成员拷贝到另外一个成员, 复制完成,将过渡为辅助节点。

选举主节点

集群会因为各种事件触发选举主节点

  • 在集群中添加新节点

  • 初始化replica set集群

  • 执行人工运维命令(rs.stepDown()  rs.reconfig())维护集群

  • 辅助节点与主节点失联时间超过默认10s

自动故障转移说的是最后一种情况:

默认情况下,辅助节点A与主节点心跳失联超过10s,A节点标记主节点不可用;之后与其他辅助节点心跳保活,沟通各自信息(节点的票数、节点优先级、PingMs等因素)确立出新主节点。

在发生故障转移时,集群不能再执行写入操作; 如果你在客户端配置了在辅助节点的读取首选项 read preference,则集群可继续提供读取能力。

你的应用程序可用重试逻辑应对自动故障转移和后续的重选,从MongoDB3.6版本开始,MongoDB Driver可侦测主节点的失联,并执行一次重试操作。

适配MongoDB4.2的Driver默认会重试写入操作;

适配Mongodb4.0-3.6的Driver需显式在连接字符串包含retryWrites = true,以确保主节点失联时能重试写入操作。

连接副本集的客户端配置字符串,其中rs0是配置文件中设置的副本集名称 replSetName

mongodb://account:passward@mongodb0.example.com:27017,mongodb1.example.com:27017,mongodb2.example.com:27017?replicaSet=rs0

OK, 以上便是MongoDB副本集心跳保活、异步复制、自动故障转移的背景知识。

留一个作业?

客户端连接MongoDB副本集的连接字符串,只是一个很普通的IP数组,

  • 并未体现主副节点, 客户端是怎么区分主副节点,并向主节点发出写入指令?
  • 另外MongoDB服务器发生故障转移后,客户端又是如何再次识别出主副节点?

这就涉及到客户端Moninoring, 所有遵守MongoDB官方规范的Driver都会实现 Service discovery和Monitoring :

  我们在连接字符串指定的IP节点其实是种子节点,Driver会准实时监视集群,获取集群最新的状态信息。(heartbeatFrequencyMS 约定了客户端Driver检查集群状态的时间间隔)

这也与我在MongoDB 辅助节点看到的日志相互照应, 这也说明了 MongoBB故障转移并不只是服务端的事,客户端Driver 也为我们做了不少的事情。

+ https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.rst#heartbeatfrequencyms

+ https://docs.mongodb.com/manual/reference/connection-string/#urioption.heartbeatFrequencyMS

(2)MongoDB副本集自动故障转移原理的更多相关文章

  1. (2)MongoDB副本集自动故障转移全流程原理

    前文我们搭建MongoDB三成员副本集,了解集群基本特性,今天我们围绕下图聊一聊背后的细节. 默认搭建的replica set均在主节点读写,辅助节点冗余部署,形成高可用和备份, 具备自动故障转移的能 ...

  2. MongoDB 主从复制及 自动故障转移

    1.MongoDB 主从复制 MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允许您从 ...

  3. MongoDb复制集实现故障转移,读写分离

    前言 数据库技术是信息系统的一个核心技术,发展很快,各种功能类型数据库层出不穷,之前工作中使用过关系型数据库(mysql.oracle等).面相对象数据库(db4o).key-value存储(Memc ...

  4. mongodb副本集自动切换修复节点解决方案

    副本集部署 1.启动mongod 在每台运行mongod服务的机器上增加配置文件/etc/mongodb-rs.conf,内容为: [root@MongodbF-A etc]# vi /etc/mon ...

  5. MongoDB副本集的原理,搭建

    介绍: mongodb副本集即客户端连接到整个副本集,不关心具体哪一台机器是否挂掉.主服务器负责整个副本集的读写,副本集定期同步数据备份,一旦主节点挂掉,副本节点就会选举一个新的主服务器,这一切对于应 ...

  6. MongoDB副本集(一主两从)读写分离、故障转移功能环境部署记录

    Mongodb是一种非关系数据库(NoSQL),非关系型数据库的产生就是为了解决大数据量.高扩展性.高性能.灵活数据模型.高可用性.MongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模 ...

  7. MongoDB 副本集的原理、搭建、应用

    概念: 在了解了这篇文章之后,可以进行该篇文章的说明和测试.MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组 ...

  8. mongodb副本集原理及部署记录

    工作原理 1.副本集之间的复制是通过oplog日志现实的.备份节点通过查询这个集合就可以知道需要进行复制的操作 2.oplog是节点中local库中的一个固定的集合,在默认情况下oplog初始化大小为 ...

  9. MongoDB副本集的常用操作及原理

    本文是对MongoDB副本集常用操作的一个汇总,同时也穿插着介绍了操作背后的原理及注意点. 结合之前的文章:MongoDB副本集的搭建,大家可以在较短的时间内熟悉MongoDB的搭建和管理. 下面的操 ...

随机推荐

  1. H3C 配置NAT Server

  2. linux scull 的内存使用

    在介绍读写操作前, 我们最好看看如何以及为什么 scull 进行内存分配. "如何"是需要全 面理解代码, "为什么"演示了驱动编写者需要做的选择, 尽管 sc ...

  3. tf.train.slice_input_producer()

    tf.train.slice_input_producer处理的是来源tensor的数据 转载自:https://blog.csdn.net/dcrmg/article/details/7977687 ...

  4. 21个项目玩转深度学习:基于TensorFlow的实践详解02—CIFAR10图像识别

    cifar10数据集 CIFAR-10 是由 Hinton 的学生 Alex Krizhevsky 和 Ilya Sutskever 整理的一个用于识别普适物体的小型数据集.一共包含 10 个类别的 ...

  5. P1091 剧院广场

    题目描述 柏林首都的剧院广场呈长方形,面积为 \(n \times m\) 平方米.在这座城市的周年纪念日之际,人们决定用方形花岗岩石板铺设广场.每块石板的大小都是 \(a \times a\) . ...

  6. 2019-9-2-win10-uwp-列表模板选择器

    title author date CreateTime categories win10 uwp 列表模板选择器 lindexi 2019-09-02 12:57:38 +0800 2018-2-1 ...

  7. P1020 从大到小排序

    题目描述 给你n个整数,请你按照从大到小的顺序输出它们. 输入格式 输入的第一行包含一个整数 \(n(1 \le n \le 10^3)\) ,用于表示元素的个数. 输入的第二行包含 \(n\) 个整 ...

  8. linux ioctl 方法

    ioctl, 我们在第 1 章展示给你如何使用, 是一个系统调用, 作用于一个文件描述符; 它 接收一个确定要进行的命令的数字和(可选地)另一个参数, 常常是一个指针. 作为一个使 用 /proc 文 ...

  9. SpringBoot --web 应用开发之文件上传

    原文出处: oKong 前言 上一章节,我们讲解了利用模版引擎实现前端页面渲染,从而实现动态网页的功能,同时也提出了兼容jsp项目的解决方案.既然开始讲解web开发了,我们就接着继续往web这个方向继 ...

  10. 【t092】迷之阶梯

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 在经过地球防卫小队的数学家连续多日的工作之后,外星人发的密码终于得以破解.它告诉我们在地球某一处的古老 ...