Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >(2)MongoDB副本集自动故障转移原理(含客户端)

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

作者头像
有态度的马甲
发布于 2020-04-15 08:14:21
发布于 2020-04-15 08:14:21
2K00
代码可运行
举报
文章被收录于专栏:精益码农精益码农
运行总次数:0
代码可运行

前文我们搭建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。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 精益码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MongoDB 副本集运维策略
本文聊一聊 MongoDB 副本集运维窗口期的操作策略,最大程度地减少主节点不可用的时间。
有态度的马甲
2020/01/19
9251
MongoDB 副本集运维策略
搭建高可用mongodb集群(三)—— 深入副本集内部机制
在上一篇文章《搭建高可用mongodb集群(二)—— 副本集》 介绍了副本集的配置,这篇文章深入研究一下副本集的内部机制。还是带着副本集的问题来看吧!
九州暮云
2019/08/21
1K0
搭建高可用mongodb集群(三)—— 深入副本集内部机制
Mongodb主从复制/ 副本集/分片集群介绍
前面的文章介绍了Mongodb的安装使用,在 MongoDB 中,有两种数据冗余方式,一种 是 Master-Slave 模式(主从复制),一种是 Replica Sets 模式(副本集)。 Mongodb一共有三种集群搭建的方式: Replica Set(副本集)、 Sharding(切片) Master-Slaver(主从)【目前已不推荐使用了!!!】 其中,Sharding集群也是三种集群中最复杂的。 副本集比起主从可以实现故障转移!!非常使用! mongoDB目前已不推荐使用主从模式,取而代之的
洗尽了浮华
2018/01/22
17.7K2
Mongodb主从复制/ 副本集/分片集群介绍
微系列:7、在Centos系统中,搭建MongoDB副本集
创建mongodb的源文件 /etc/yum.repos.d/mongodb-org-5.0.repo,添加内容
老张的哲学
2023/01/09
6770
MongoDB教程(六):mongoDB复制副本集
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!
用户11147438
2024/07/20
1690
Monogo副本集
MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成。类似于MySQL的MMM架构
mikelLam
2022/10/31
9210
Monogo副本集
MongoDB 7.0.14 副本集部署
MongoDB 副本集是一个用于数据高可用性和冗余的集群配置。副本集由多个 MongoDB 实例组成,其中一个是主节点(Primary),其余是从节点(Secondary)。主节点负责所有写入操作,从节点则从主节点复制数据,提供读操作的负载均衡,(主节点-从节点-从节点)(推荐);如果情况(例如成本)禁止添加第三个数据承载节点,则可以是两个数据承载节点加一个仲裁节点(主节点-从节点-仲裁节点)
DBA实战
2024/10/21
1660
MongoDB 7.0.14 副本集部署
MongoDB集群架构之副本集架构
本文介绍了热门的NoSQL数据库MongoDB的副本集这种分布式架构的一些概念和操作。主要内容包括:
星哥玩云
2022/08/17
9340
MongoDB集群架构之副本集架构
linux安装MongoDB副本集
在 Linux 上安装 MongoDB 副本集是构建可靠且具有高可用性的 MongoDB 集群的一种常见方式。在这篇文章中,我们将介绍如何在 Linux 上安装 MongoDB 副本集。
玖叁叁
2023/04/14
1K0
Mongodb副本集
mongodb doc mongodb的端口 mongod:27017 http:28017 mongod命令的常用选项 fork: 是否运行为后台进程 bind_ip: 绑定的ip地址 maxConns: 最大的连接数 logpath: 设置日志的存储路径 syslog: 设置是否为syslog来管理日志 syslogFacility: 如果由syslog来管理日志,那么日志的级别是local1,local2…还是local7 logappend: 日志滚动,就是把日志已追加的方式记录,而不是覆盖 pid
公众号: 云原生生态圈
2021/11/15
8900
MongoDB主从复制和副本集
MongoDB有主从复制和副本集两种主从复制模式,主从复制最大的问题就是无法自动故障转移,MongoDB副本集解决了主从模式无法自动故障转义的特点,因此是复制的首选。
星哥玩云
2022/08/17
6540
MongoDB主从复制和副本集
MongoDB 复制(副本集)
复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
用户7639835
2021/12/03
7980
(1)解锁MongoDB replica set核心姿势
本文倒腾目前大热的MongoDB Replica Set集群,在倒腾的同时串讲一些 MongoDB特性。
有态度的马甲
2020/04/15
9550
Mongo部署副本集
部署副本集 1.0 更改Mongo配置文件 [root@localhost mongo]# vim conf/mongo.conf port=27017 fork=true logpath=/usr/local/mongo/logs/mongodb.log logappend=true dbpath=/usr/local/mongo/data replSet=rs0 # 加入副本集名称,此名称要一致 启动Mongo [root@localhost mongo]# mongod -f conf/mongo.
Yuou
2022/09/26
3380
(1)解锁 MongoDB replica set核心姿势
副本集Replica Set是一个术语,定义具有多节点的数据库集群,这些节点具有主从复制(master-slave replication) 且节点之间实现了自动故障转移。 
有态度的马甲
2020/01/17
8100
(1)解锁 MongoDB replica set核心姿势
docker搭建mongodb单节点副本集
在开发中,我们很容易通过docker启动一个普通的mongodb数据库服务。但是有时候为了保持与线上环境一致,或者为了利用mongodb副本集的某些特性,我们需要在本地部署mongodb副本集。副本集往往需要启动多个mongodb服务作为副本集成员,而通常用于开发的笔记本资源比较有限。鉴于此,官方文档给了解决办法,可以直接将一个单节点mongodb服务转换为单节点副本集https://www.mongodb.com/docs/manual/tutorial/convert-standalone-to-replica-set/,本片文章的背景就是在golang中开发,操作mongo开启事务后报错:
美团骑手
2022/12/05
3.4K0
MongoDB副本集搭建教程
MongoDB副本集三节点包含主节点(Primary)、副本节点(Secondary)、仲裁节点(Arbiter)。主节点(primary)负责整个副本集的读写,用户也可根据业务需求情况设置全部或部分读请求到副本节点(Secondary);副本集实时同步数据,如果主节点出现故障或宕机,副本节点就会选举一个新的主节点,这一切对于应用服务器不需关心。仲裁节点不存储数据,只负责故障转移的群体投票,这样就少了数据复制的压力。
Power
2025/03/02
1060
MongoDB副本集搭建
我们之前的案例都是在单个节点上实现的,在生产环境中这种做法是有风险的,如果服务宕机、崩溃或者硬盘坏了都会对公司业务造成损失,因此我们需要数据备份。在MongoDB中我们可以通过副本集来实现这一需求,MongoDB副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成,如果Primary崩溃了,会自动从Secondary中选择一个将其升级为新的主服务器,本文我们先来看看副本集环境的搭建。 ---- 单台服务器模拟 我们在实际的生产环境中肯
江南一点雨
2018/04/02
1.3K0
副本集是如何实现自动Failover的
最近一个 MongoDB 集群环境中的某节点异常下电了,导致业务出现了中断,随即又恢复了正常。通过ELK 告警也监测到了业务报错日志。
MongoDB中文社区
2019/07/12
7610
副本集是如何实现自动Failover的
搭建高可用mongodb集群(二)—— 副本集
在上一篇文章《搭建高可用MongoDB集群(一)——配置MongoDB》 提到了几个问题还没有解决。
九州暮云
2019/08/21
1.5K0
搭建高可用mongodb集群(二)—— 副本集
相关推荐
MongoDB 副本集运维策略
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验