MongoDB原理:复制集状态同步机制

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,通用型 2核4GB
简介:

MongoDB复制集(3.0版本)之间通过心跳信息来同步成员的状态信息,每个节点会周期性的向复制集内其它的成员发送心跳信息来获取状态,如rs.status()看到的复制集状态信息。

一次心跳请求分3个阶段 (主动发起心跳请求的节点称为源,接受到心跳请求的成为目标)

  1. 源向目标发送心跳请求
  2. 目标处理心跳请求,并向源发送应答
  3. 源接受到心跳应答,更新目标节点状态

接下来将介绍这3个阶段里的主要状态同步逻辑

阶段1

默认配置下,复制集的节点每隔2s会向其他成员发送一次心跳请求,即发送replSetHeartbeat命令请求,心跳请求的内容类似如下(通过mongosniff抓包获取),主要包含replSetName、发送心跳的节点地址、复制集版本等。

command: replSetHeartbeat database: admin metadata: { $replData: 1 } commandArgs: { replSetHeartbeat: "mongo-9552", pv: 1, v: 22, from: "10.101.72.137:9552", fromId: 3, checkEmpty: false } 

阶段2

复制集成员收到心跳请求后,就开始处理请求,并将处理的结果回复给请求的节点。

  • 如果自身不是复制集模式、或复制集名称不匹配,则返回错误应答
  • 如果源节点的复制集配置(rs.conf()的内容)版本比自己低,则将自身的配置加入到心跳应答消息里
  • 将节点自身的oplog及其他状态信息等加入到心跳应答消息
  • 如果自身是未初始化状态,则立即向源节点发送心跳请求,以更新复制集配置

        commandReply: { ok: 1.0, time: 1460705698, electionTime: new Date(6273289095791771649), e: true, rs: true, state: 1, v: 22, hbmsg: "", set: "mongo-9552", opTime: new Date(6272251740930703361) } metadata: { $replData: { term: -1, lastOpCommitted: { ts: Timestamp 1460372410000|1, t: -1 }, lastOpVisible: { ts: Timestamp 0|0, t: -1 }, configVersion: 22, primaryIndex: 2, syncSourceIndex: -1 } } 
    

阶段3

阶段3是最主要的处理部分,节点收到心跳应答后,会根据应答消息来更新对端节点的状态,并根据最终的状态确定是否需要进行重新选举。

  • 收到心跳应答时,如果是错误应答(心跳消息超时未应答相当于收到了错误应答),则

    • 如果当前重试次数 <= kMaxHeartbeatRetries(默认为2),并且上一次发送心跳在kDefaultHeartbeatTimeoutPeriod(默认为10)时间内,则立即发送下一次心跳
    • 当失败次数超过kMaxHeartbeatRetries,或者上一次心跳时间到现在超过kDefaultHeartbeatTimeoutPeriod,则认为节点down
  • 如果对端的复制集版本比自己高,则更新自己的配置并持久化到local数据库中
  • 根据应答消息更新对端的状态信息
  • 如果自身是主节点,当发现有优先级更高的节点可被选为主,则主动降级
  • 如果其他是主节点,但自身有更高的优先级并可被选为主,则会主动要求主节点降级(目前这个逻辑实现有bug,主要靠主节点主动降级来保证优先级最高的节点最终会变成主, https://jira.mongodb.org/browse/SERVER-23630
  • 如果当前没有主节点,则主动发起新的选举,当得到大多数节点同意后,即可选出新的主节点

总的来说,MongoDB通过心跳来同步节点间信息并触发选举,最终将复制集达到统一的状态,但过程的正确性没有理论依据,MongoDB-3.2版本里,使用了新版本的复制集通信协议,改用raft来选举,能进一步降低故障发现恢复时间,目前还在学习中。

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
8月前
|
NoSQL MongoDB
MongoDB-复制集搭建
在安装目录下新建 data/conf/log 3个文件夹,在conf文件夹下新建 mongo.config,在mongo.config中配置如下内容:
59 0
|
2月前
|
存储 运维 负载均衡
MongoDB详解(二)——MongoDB架构与原理
MongoDB详解(二)——MongoDB架构与原理
39 2
|
2月前
|
NoSQL Linux MongoDB
centos7搭建MongoDB以及MongoDB复制集
centos7搭建MongoDB以及MongoDB复制集
36 0
|
8月前
|
数据库
MongoDB-复制集投票节点
?> 投票节点就是不保存任何数据, 只参与投票的节点
49 0
|
5月前
|
监控 NoSQL MongoDB
轻松掌握组件启动之MongoDB(番外篇):高可用复制集架构环境搭建-mtools
mtools是一个基于Python实现的MongoDB工具集,旨在提供一系列功能,包括MongoDB日志分析、报表生成以及简易的数据库安装等。它由MongoDB原生的工程师单独发起并进行开源维护。mtools包含了一些常用的组件,如mlaunch、mlogfilter、mplotqueries和mlogvis等,可以帮助我们更方便地启动和创建MongoDB数据库。
|
5月前
|
监控 NoSQL 安全
轻松掌握组件启动之MongoDB(下):高可用复制集架构环境搭建
本章介绍了MongoDB复制集的配置和使用方法,如何初始化和添加节点到复制集,验证主节点的写入和从节点的读取功能。了解如何查询复制集的状态,包括成员的健康状况、同步信息和角色等。最后,我们介绍了如何配置复制集的安全认证,包括创建用户和生成keyFile文件,并演示了使用认证信息连接复制集的方式。通过本章的学习,你将掌握MongoDB复制集的基本使用和配置方法。
|
5月前
|
存储 NoSQL 容灾
轻松掌握组件启动之MongoDB(上):高可用复制集架构环境搭建
本文介绍了MongoDB复制集的架构和特点,强调了使用复制集提供数据的高可用性和冗余性的重要性。复制集由Primary节点和Secondary节点组成,确保数据一致性。复制集还具有数据分发、读写分离和异地容灾等附加功能。使用MongoDB复制集可以提供稳定可靠的数据存储和高可用性。
轻松掌握组件启动之MongoDB(上):高可用复制集架构环境搭建
|
7月前
|
存储 缓存 NoSQL
MongoDB基础及原理介绍
MongoDB基础及原理介绍
307 0
|
8月前
|
存储 NoSQL MongoDB
图解MongoDB集群部署原理(3)
MongoDB的集群部署方案中有三类角色:实际数据存储结点、配置文件存储结点和路由接入结点。
110 0
|
8月前
|
数据库 索引
MongoDB-复制集同步规则
初始化同步 • 将一个新的节点加入到复制集中时, 就需要进行初始化同步 • 初始化同步会先清空自己所有的内容, 保证将来自己和主节点一模一样 • 初始化同步会将主节点中现有所有的 ‘数据库’, ‘集合’, ‘文档’, ‘索引’ 全部拷贝过来 • 但是在拷贝的过程中主节点仍然可能会做一些其它操作, 新增一些其它的数据等
54 0

相关产品

  • 云数据库 MongoDB 版