前文我们搭建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副本集自动故障转移全流程原理的更多相关文章
-
(2)MongoDB副本集自动故障转移原理
前文我们搭建MongoDB三成员副本集,了解集群基本特性,今天我们围绕下图聊一聊背后的细节. 默认搭建的replica set均在主节点读写,辅助节点冗余部署,形成高可用和备份, 具备自动故障转移的能 ...
-
MongoDB 主从复制及 自动故障转移
1.MongoDB 主从复制 MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允许您从 ...
-
MongoDb复制集实现故障转移,读写分离
前言 数据库技术是信息系统的一个核心技术,发展很快,各种功能类型数据库层出不穷,之前工作中使用过关系型数据库(mysql.oracle等).面相对象数据库(db4o).key-value存储(Memc ...
-
mongodb副本集自动切换修复节点解决方案
副本集部署 1.启动mongod 在每台运行mongod服务的机器上增加配置文件/etc/mongodb-rs.conf,内容为: [root@MongodbF-A etc]# vi /etc/mon ...
-
MongoDB副本集的原理,搭建
介绍: mongodb副本集即客户端连接到整个副本集,不关心具体哪一台机器是否挂掉.主服务器负责整个副本集的读写,副本集定期同步数据备份,一旦主节点挂掉,副本节点就会选举一个新的主服务器,这一切对于应 ...
-
MongoDB副本集(一主两从)读写分离、故障转移功能环境部署记录
Mongodb是一种非关系数据库(NoSQL),非关系型数据库的产生就是为了解决大数据量.高扩展性.高性能.灵活数据模型.高可用性.MongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模 ...
-
Redis集群以及自动故障转移测试
在Redis中,与Sentinel(哨兵)实现的高可用相比,集群(cluster)更多的是强调数据的分片或者是节点的伸缩性,如果在集群的主节点上加入对应的从节点,集群还可以自动故障转移,因此相比Sen ...
-
mongodb副本集加分片集群安全认证使用账号密码登录
mongodb副本集加分片集群搭建网上资料有很多.粘贴一个写的比较好的.副本集加分片搭建 对于搭建好的mongodb副本集加分片集群,为了安全,启动安全认证,使用账号密码登录. 默认的mongodb是 ...
-
java程序连接MongoDB副本集测试
三个节点有一个节点挂掉也不会影响应用程序客户端对整个副本集的读写! public class TestMongoDBReplSet { public static void main(String[] ...
随机推荐
-
[书目20160624]Android应用开发从入门到精通
卢海东 著 第1章 揭开神秘面纱——Android系统简介 1 1.1 认识Android系统 2 1.1.1 Android成长历程 2 1.1.2 发行版本 3 1.1.3 得到大 ...
-
C#的参数修饰符out,params,ref
using System; namespace ParamsProgram { class TestParams { public static void Main(string[] args)//s ...
-
sqlserver中对时间类型的字段转换
获取当前日期利用 convert 来转换成我们需要的datetime格式. select CONVERT(varchar(12) , getdate(), 112 ) 20040912-------- ...
-
js 字符串转 数字
<html> <body> <script language="javascript"> var a = "0.11"; v ...
-
poj 1220 NUMBER BASE CONVERSION(短除法进制转换)
题目连接:1220 NUMBER BASE CONVERSION 题目大意:给出两个进制oldBase 和newBase, 以及以oldBase进制存在的数.要求将这个oldBase进制的数转换成ne ...
-
MySQL利用binlog恢复误操作数据(python脚本)
在人工手动进行一些数据库写操作的时候(比方说数据订正),尤其是一些不可控的批量更新或删除,通常都建议备份后操作.不过不怕万一,就怕一万,有备无患总是好的.在线上或者测试环境误操作导致数据被删除或者更新 ...
-
JVM垃圾回收机制与内存回收
暂时转于:https://blog.csdn.net/qq_27035123/article/details/72857739 垃圾回收机制 GC是垃圾回收机制,java中将内存管理交给垃圾回收机制, ...
-
C++获取和设置时区
一. 获取当前系统时区信息 使用API函数GetTimeZoneInformation可以获得当前时区的相关信息,函数原型为 DWORD GetTimeZoneInformation( LPT ...
-
MATLAB错误:下标索引必须是正整数类型或者逻辑类型
背景: Matlab R2015b 问题: 在运行BP算法时出现错误: 下标索引必须是正整数类型或者逻辑类型 output( i , class( i ) ) = 1 ; 解决办法: 根目录下运行, ...
-
浅谈对IT的认识!
我是一个从农村出来的学生,家里的情况和大多数的农村同学是一样的,家里算不上有钱,父母供我读书,也已经是做到仁至义尽了. 我现在选了,一个和计算机有关的专业---计算机应用技术.就是希望毕业后,可以找到 ...