专栏首页Dotnet Plus(2)MongoDB副本集自动故障转移原理(含客户端)

(2)MongoDB副本集自动故障转移原理(含客户端)

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

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

集群心跳保活

集群每个节点以周期性向其他成员发出心跳命令 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可侦测主节点的失联,并执行一次重试操作。

tip

适配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数组,并未体现主副节点,客户端是怎么区分主副节点,并向主节点发出写入指令;更何况副本集主副节点会变化,客户端如何感知?

点击下方空白区域查看答案

「Client Monitoring」


所有符合MongoDB官方规范的Driver都会实现Service Discovery和Monitoring,连接副本集的字符串IP实际是种子成员,Driver会准实时发起指令检测集群状态(heartbeatFrequencyMS约定了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

本文分享自微信公众号 - Dotnet Plus(nodotnet),作者:小码甲

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

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

    小码甲
  • MongoDB 副本集运维策略

    本文聊一聊 MongoDB 副本集运维窗口期的操作策略,最大程度地减少主节点不可用的时间。

    小码甲
  • (1)解锁MongoDB replica set核心姿势

    本文倒腾目前大热的MongoDB Replica Set集群,在倒腾的同时串讲一些 MongoDB特性。

    小码甲
  • 算法原理系列:2-3查找树

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/...

    用户1147447
  • javascript入门笔记9-认识DOM

    认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法。DOM 将HTML文档呈现为带有元素、属性和...

    方志朋
  • 尝试手撕红黑树

    祖宗根节点必黑,允许黑连黑,不允许红连红;新增红色,爸叔通红就变色,爸红叔黑就旋。

    疯狂的KK
  • 最通俗易懂入门红黑树(R-B Tree)

    二叉平衡树(AVL):二叉平衡树是在二叉搜素树的基础上加上了限制:任意节点,左右子树的高度差不能超过1。这个约束常常借助左旋和右旋操作实现。

    vivi
  • MongDB进阶系列——1.认识复制集

    从这一篇开始,我们要踏上MongoDB进阶之路啦,想想还有点小开心呢。一筐猪镇楼。

    陈琛
  • 2020-3-22-64匹马8赛道选前8的算法解析

    可以看到例如1-8节点同dumb节点的距离都是1,9-16节点同dumb节点的距离都是1,不满足约束。

    黄腾霄
  • MongoDB 事务 — 基础入门篇

    MongoDB 单文档原生支持原子性,也具备事务的特性,但是我们说起事务,通常是指在多文档中的实现,因此,MongoDB 在 4.0 版本支持了多文档事务,4....

    五月君

扫码关注云+社区

领取腾讯云代金券