MongoDB 副本集(Replica Set)
副本集(Replica Set)
副本集概念

此集群拥有一个主节点(Master)和多个从节点(Slave),与主从复制模式类似,但是副本集与主从复制的区别在于:当集群中主节点发生故障时,副本集可以自动投票,选举出新的主节点,并引导其余的从节点连接新的主节点。
**MongoDB 的副本集是自带故障恢复功能的主从复制 **
副本集作用
- 异地备份(数据冗余)
- 故障转移(服务冗余)
- 负载均衡(读写分类)
- 高可用基石(HA)
副本集角色
主节点(Primary)
Primary 是副本集的主节点,可读写,唯一可以进行写操作的节点,由集群自行选举出来副本节点(Secondary)
Seconary 会参与 Primary 选举,并从 Primary 同步最新写入的数据,以保证与 Primary 存储相同的数据(Seconary 默认不提供读写服务)
仲裁者(Arbiter)
Arbiter 节点只参与投票,不能被选为 Primary,并且不从 Primary 同步数据
副本集数据同步原理
intial sync(全量同步)
- 全量同步开始,设置 minvalid 集合的 _initialSyncFlag 字段为 true
- 获取主节点上的当前最新 oplog 时间戳
- 同步集合数据并建立索引(比较耗时)
- 获取主节点上的当前最新的 oplog 时间戳
- 读取两个 oplog 时间戳段内的 oplog 并重放
- 全量同步结束,设置 minvalid 集合的 _initialSyncFlag 字段为 false
Replication(增量同步)
全量同步结束后,从节点不断的从主节点拉取 oplog 并重放应用到自身,这个过程并不是由一个线程来完成的,mongodb 为了提升同步效率,将拉取 oplog 以及重放 oplog 分到了不同的线程来执行。

- producer 线程:该线程不断的从主节点上拉取 oplog,并加入到一个 BlockQueue 的队列里保存着,BlockQueue 最大存储 240MB 的 oplog 数据,当超过这个阈值时,就必须等到 oplog 被 replBatcher 消费掉才能继续拉取
- replBatcher 线程:该线程负责逐个从 producer 线程的队列里取出 oplog,并放到自己维护的队列里,这个队列最多允许 5000 个元素,并且元素总大小不超过 512 MB,当队列满了时,就需要等待 oplogApplication 线程消费掉
- oplogApplication 线程:该线程会取出 replBatch 线程当前队列的所有元素,并将元素根据集合名称分散到不同的replWriter 线程(默认16个)
- replWriter 线程:该线程将所有的 oplog 进行回放;
- 等待所有 oplog 都回放完毕,最终 oplogApplication 线程将所有的 oplog 顺序写入到一个集合中,完成增量同步
副本集心跳检测
- 副本集创建成功后,每一个节点之间都保持着通信,即每 2s 会向整个副本集的其他节点发一次心跳检测 ping 命令
- 副本集中每一个节点的数据库内部,维护着整个副本集节点的状态信息,一旦某一个节点超过 10s 不能收到 ping 命令的响应,就认为这个节点不能访问
- 副本集中的主节点除了维护整体副本集节点状态信息外,还要判断是否和大多数节点可以正常通信,如果不能则要主动降级(只读状态)
副本集 Primary 选举场景
需要进行 Primary 选举的场景如下:
- 副本集初始化
- 副本集被 reconfig
- Primary 节点宕机
- Primary 节点主动 stepDown(主动降级为Secondary)
副本集 Primary 选举规则
每一个副本集节点根据自己维护的节点状态信息,如果判断出整个副本集没有主节点,而且本身具备升主节点条件,则会引发一次投票选举
投票发起者向副本集成员发起 Elect 请求,成员在收到请求后经过会一系列检查,如果通过检查则为发起者投一票
检查条件如下:
- 在所有有效的副本集节点中它持有最新的 optime 时间戳
- Priority 优先级最高(默认1)
- 先发先得选票
如果投票发起者获得超过半数(初始化时整个副本集节点的数量的一半)的投票,则选举通过成为 Primary 节点,否则重新发起投票
所有成员都可以投否决票,否决票具有一票否决权,所以一般可以认为只要有成员反对,则发起选举节点将不能成为 Primary
投否决票一般需要判断以下三个条件:
- 副本集中是否有其他节点已经是 Primary
- 本节点的数据是否比请求成为主节点的数据更新(optime 时间戳)
- 其他节点的数据是否比请求成为主节点的数据更新(optime 时间戳)
注:如果以上任意一个条件满足,则会停止选举过程;原计划升为主节点将仍旧保持 Secondary 状态
官方推荐副本集的成员数量为奇数,且至少副本集包含 3 个节点
MongoDB 副本集(Replica Set)的更多相关文章
- MongoDB副本集replica set (二)--副本集环境搭建
(一)主机信息 操作系统版本:centos7 64-bit 数据库版本 :MongoDB 4.2 社区版 ip hostname 192.168.10.41 mongoserver1 192.16 ...
- MongoDB副本集replica set(三)--添加删除成员
在上一篇文章中,我们搭建了3个节点的副本集,集群信息如下: rstest:PRIMARY> rs.config() { "_id" : "rstest", ...
- NoSQL数据库Mongodb副本集架构(Replica Set)高可用部署
NoSQL数据库Mongodb副本集架构(Replica Set)高可用部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. MongoDB 是一个基于分布式文件存储的数据库.由 C ...
- MongoDB 副本集的原理、搭建、应用
概念: 在了解了这篇文章之后,可以进行该篇文章的说明和测试.MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组 ...
- MongoDB副本集学习(一):概述和环境搭建
MongoDB副本集概述 以下图片摘自MongoDB官方文档:http://docs.mongodb.org/manual/core/replication-introduction/ Primary ...
- MongoDB副本集的常用操作及原理
本文是对MongoDB副本集常用操作的一个汇总,同时也穿插着介绍了操作背后的原理及注意点. 结合之前的文章:MongoDB副本集的搭建,大家可以在较短的时间内熟悉MongoDB的搭建和管理. 下面的操 ...
- MongoDB副本集的搭建
副本集是mongodb提供的一种高可用解决方案.相对于原来的主从复制,副本集能自动感知primary节点的下线,并提升其中一个Secondary作为Primary. 整个过程对业务透明,同时也大大降低 ...
- 十分钟搞定mongodb副本集
mongodb副本集配置 最近项目中用到了mongodb,由于是用mongodb来记录一些程序的日志信息和日常的统计,为了增加应用的可靠性,一直在找mongodb集群的一些资料,下面是对最近做的一个小 ...
- mongodb副本集高可用架构
一.简介 Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点. Mongodb Driver(客户端)的所有数据都写入Primary,Sec ...
- MongoDB副本集及C#程序的连接配置
1.副本集 高可用是绝大多数数据库管理系统的核心目标之一.如果要想生产数据在发生故障后依然可用,就需要确保为生产数据库多部署一台服务器.MongoDB副本集提供了数据的保护.高可用和灾难恢复的机制. ...
随机推荐
- Java中创建线程的方式和线程中常用方法?
Java中如何创建线程? 继承Thread类 实现Rnnable接口 实现Callable接口 通过线程池创建线程 线程中常用方法 线程等待:wait() 进入等待状态,只有等其他线程唤醒或中断才能运 ...
- SQL Server修改表的时候出现错误:未更新任何行,未删除任何行
无论点击什么,一直报错:未更新任何行,未删除任何行,就差点砸电脑啦. 参考这个大神才解决的问题: https://blog.csdn.net/weixin_44690047/article/detai ...
- github 设置代理
1. 直接修改 .git/config 文件 注意: 仅对当前仓库有效, 推荐这种, 因为不是所有的仓库都需要走代理 [http "https://github.com"] pro ...
- MxDraw云图平台 2021.10.28更新,H5在线CAD,网页CAD,网页浏览编辑DWG
1. 增加转换CAD文件的outpath参数设置,设置输出文件路径2. 修改转换程序,在 windows server 2010上,没有buf,距到中文路径的文件 ,转换会失败问题3. 修改宋体字体显 ...
- Android 6.0动态添加权限(Finn_ZengYuan博客)
1,随着手机版本变高,各种权限也有所限制:以下代码可人性化添加动态权限: 权限工具类1,2,3,4: 1,FinnPermissionConfig.CLass package com.finn.too ...
- Linux修改主机名hostname
红帽系: [root@f112 ~]# vi /etc/sysconfig/network # Created by anaconda # 加上一行 HOSTNAME=f111 [root@f112 ...
- Debian 迁移到新硬盘
老硬盘 A,新硬盘 B,先把B分好区,做好格式化. 准备虚拟机一台,Linux LiveCD光盘或者可用的Linux虚拟机系统,把硬盘A B 映射成虚拟机可以使用的硬盘文件,根据LiveCD新建相应的 ...
- Android Studio 修改jar包中的.class代码
修改a.jar中的b.class文件: 1.在Android Studio的项目中引入a.jar,sync,通过反编译找到并拷贝b.java的代码 2.使用压缩软件打开a.jar,并删掉需要修改的文件 ...
- c函数调用过程
一.内存结构内存大致可以分为四个部分:代码段,静态存储区,堆,栈.具体划分如下图所示: 栈:在执行函数时,函数内部局部变量的存储单元都可以在栈上创建,函数执行结束后会自动释放内存.栈内存的分配运算内置 ...
- spring-cloud项目初始化问题
无法引入本地依赖 参考:https://blog.csdn.net/qq_39684784/article/details/115289982 时区问题: url设置:serverTimezone=U ...