这篇文章主要介绍MongoDB副本集相关知识,后续会不断完善。

1、副本集组成与简介

所以副本集就是同一份数据冗余存储,通常用于高可用性的保证。如下图为MongoDB副本集的架构图:

​(1)副本集是维护相同数据集的一组mongod实例(mongod:一台部署mongodb的机器实例);

(2)MongoDB副本集组成。一个副本集包含多个数据承载节点(data bearing node)和一个仲裁器节点(可选)。在数据承载节点中有一个且只有一个成员被视为主节点,而其他节点被视为次节点。仲裁器节点不承载数据主要用于选举。仲裁节点永远是仲裁节点,但是主节点可能因选举变成副节点,副节点也有可能因选举而变成主节点。

(3)冗余与高可用。副本集的作用就是通过冗余来保证高可用。通过冗余存储,副本集整体对单个节点不可用提供具有一定的容忍性;

(4)副本集的另一个功能是通过配置读写策略可以是实现读扩展(读写策略处介绍)。

(5)副本集中主节点接收所有写入操作。主节点会通过操作日志(即oplog)记录所有数据集的更改操作(mongodb向primary节点写数据时也会将oplog写到primary节点所在的local数据库中)。

注:写请求都是直接打到主节点的,虽然从节点也要去复制数据;即使这样,主节点要做的事情还是要比从节点多很多。也就是说主节点的cpu占用比副节点高是正常现象。

2、副本集心跳分析

MongoDB副本集成员之间通过心跳感知其他节点的存活状态。副本集成员一般情况下每2秒钟彼此之间发送一次心跳,就是我们通常说的ping。通常节点超过10S没人任何反馈就会被标记位不可用。如果这个超过10s没有响应的节点为主节点,这个时候副节点就会触发选举重新投票选出主节点实现自动故障转移。

相关代码主要集中在:

mongo/db/repl/replication_coordinator_impl_heartbeat.cpp

mongo/src/mongo/db/repl/replication_coordinator_impl.cpp

副本集最重要的三个关键点,分别是:①数据同步 ②故障转移 ③配置读选项。

1、数据同步

为了维护分片数据集的最新副本,副本集的secondary节点将同步或复制来自其他成员的数据。MongoDB使用两种形式的数据同步:一个是初始化同步,即用完整的数据集填充新成员;另一个是借助oplog的实时变更的同步。

1.1、初始化同步

关于初始化同步这里就不做过多介绍,其实就是完整的copy。

1.2、实时同步

关于Oplog的官网说明 : Replica Set Oplog — MongoDB Manual

1、Oplog简介。Oplog即操作日志(operation log)是用于保存Mongodb数据库所有数据操作记录(实际上只记录改动数据库数据的操作记录,即增/删/改)的固定大小集合(Capped Collections)。类比过来的话就相当于是mysql的binlog日志。

Oplog的存在及大地方便了MongoDB副本集的各节点的数据同步。

2、副本集数据同步的过程。

其流程大概如下:Primary节点写入数据后,Secondary节点为了保证自身数据足够新会检查自己local数据库的oplogt.rs集合,找出最近的一条记录的时间戳;接着会去查询Pirmaryoplog.rs集合找出所有大于此时间戳的记录;之后再将操作记录写到自己的oplog执行这些记录所代表的操作①所有的副本集成员都会有一个oplog的副本 ②oplog中的每次操作都是幂等的,即便有操作被同步了两次或多次也不会有什么负面影响。③为了提高复制效率,副本集中的所有节点之间会相互的进行心跳检测(ping),每个节点都可以从其他节点获取oplog。④mongodb将oplog.rs设置成一个capped类型的集合即固定大小,这符合情理;⑤但是对于长时间宕机的节点secondary节点利用自己最新的时间戳去查找primary节点的oplog.rs时会出现找不到的情况,此时不得不手动重新同步数据了。⑥由此可见oplog的大小非常重要。

注:对于固定集合(Capped Collections)就把他想成一个环形队列,当集合空间用完后,再插入元素就会覆盖最初始的头部元素。

主从同步有很多自己的细节。但是总的来讲拉取oplog并回放可以理解为“单个生产者多个消费者”的生产者-消费者模型。彼此是独立的,正常情况下相互也是不阻塞的。关于代码细节,有机会研究下吧。

1.3、同步延迟分析

问题:当负载过大时mongodb的主从同步存在明显延迟,导致有时候读取不到最新的数据。

正常使用场景这种延迟几乎是感知不到的,例如自己手动测试的时候完全不会出现数据不一致的情况、另外腾讯云的主从延迟监控也都远远在秒级以下(可能仅ms量级)。但是如果写入负载特别大的情况下可能就会出现较为明显的延迟,不过就我们50k/min的写入量几乎没出现过明显延迟的。关于这一点也不是mongodb的问题,因为CAP理论决定了一致性、可用性和分区容忍性只能3取2,对于大多数据分布式数据库来说都是选择A(可用性)和P(分区容忍性)放弃C(一致性),转而追求要求不那么高的最终一致性。

注:CAP理论中的C(一致性)指的是线性一致性(强一致性),与之对应的是最终一致性(弱一致性)。

除了主从不同方面的数据一致性以外,mongodb还有数据读写方面的一致性、以及内存/磁盘维度的数据一致性等。感觉可以专门讲一讲。

3、Oplog的默认大小

当你首次启动副本集成员的时候,如果你没有指定oplog的打下,mongodb会自动创建一个默认大小的oplog。对于Unix 和Windows系统,默认oplog的大小取决于引擎,如下:

Storage Engine Default Oplog Size Lower Bound Upper Bound
In-Memory 5% of physical memory 50 MB 50 GB
WiredTiger 5% of free disk space 990 MB 50 GB
MMAPv1 5% of free disk space 990 MB 50 GB

在大多数情况下,默认的oplog大小是足够用的。例如,如果oplog占可用磁盘空间的5%,并在24小时的操作中填满,则副本节点可以实现24小时不从oplog复制数据也不会影响最终同步(例如副本节点宕机)。大多数副本集的操作量要小得多,它们的oplog可以容纳更多的操作。

通常系统中存在以下操作的话,可能就需要设置更大的Oplog值来避免数据的丢失。

①一次性更新大量数据 ②删除域插入大致同样数量的数据 ③大量的更新现有数据

4、oplog常用命令

(1)查看oplog的状态:

rs.printReplicationInfo()

(2)查看oplog存储设置的大小

use local

db.oplog.rs.stats().maxSize

(3)查看oplog最大大小和现在占用大小以及记录时长

db.getReplicationInfo()

(4)更改副本集成员的Oplog大小

db.adminCommand({replSetResizeOplog: 1, size: 15000})

注意点:

(1)sharding架构下,mongos不能查看oplog,但是我们可以到每个mongod实例去看。

另外,上面诸多命令在单mongo实例下也是不能用的(提示没有探测到副本集)。

与之类似的玩法:

redis中的玩法:

其实这个玩法和redis的AOF持久化完全就是一个思想,AOF持久化就是以日志的形式记录服务器所处理的数据改动操作,记录下来;万一redis挂了进行数据恢复的时候就先恢复RDB持久化下来的二进制压缩存储,然后以之为契机重现一遍写 增、删、改操作即可。

mysql中的玩法:

MySQL 的二进制日志 binlog 可以说是 MySQL 最重要的日志,它记录了所有的 DDL 和 DML 语句(除了数据查询语句select、show等),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。binlog 的主要目的是复制和恢复。Binlog日志的两个最重要的使用场景
①MySQL主从复制:MySQL Replication在Master端开启binlog,Master把它的二进制日志传递给slaves来达到master-slave数据一致的目的
②数据恢复:通过使用 mysqlbinlog工具来使恢复数据

2、故障转移

3、配置读选项

11.MongoDB之副本集与Oplog相关推荐

  1. MongoDB之副本集

    MongoDB之副本集 一.简介 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库 ...

  2. MongoDB配置副本集(含Arbiter)

    MongoDB配置副本集(含Arbiter) 集群模式为:一主一副一仲裁 安装依赖 yum install net-snmp lsof -yyum install net-snmp -y 配置数据节点 ...

  3. SpringBoot整合MongoDB以及副本集、分片集群的搭建

    整合springboot应用 说明: 这里主要以 springboot 应用为基础应用进行整合开发. Spring Data : Spring 数据框架 JPA .Redis.Elasticsearc ...

  4. MongoDB之副本集配置

    MongoDB主从复制 主从复制是 MongoDB 最早使用的复制方式, 该复制方式易于配置,并且可以支持任意数量的从节点服务器,与使用单节点模式相比有如下优点: 在从服务器上存储数据副本,提高了数据 ...

  5. MongoDB 搭建副本集

    副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成.通过Replication,将数据的更新由Primary ...

  6. mongodb系列~mongodb的副本集搭建和原理

    一 简介: mongodb副本集 二 复制方式: 1 全量复制 2 增量复制 三 同步检测过程:     一 正常情况下:        1 master执行语句,并将所有的修改数据库的操作以日志Op ...

  7. MongoDB的副本集

    文章目录 1.副本集-Replica Sets 2.副本集的三个角色 3.副本集架构目标 4.故障测试 1.副本集-Replica Sets MongoDB中的副本集(Replica Set)是一组维 ...

  8. MongoDB之副本集创建

    目录 一 复制 1 复制简介 2 建立副本集 3 网络注意事项 4 安全注意事项 5 观察副本集 6 更改副本集操作 7 如何设计副本集 8 如何进行选举 9 成员变量配置 10 创建索引 二 同步 ...

  9. Golang + MongoDB ReplSet副本集

    本文介绍MongoDB副本集,暂且按照3个节点来配置:A(primary).B(secondary).C(arbiter) 1. 在集群每个节点上安装一份MongoDB: 2. 配置副本集: 3. 配 ...

  10. MongoDB部署副本集

    本页包含内容 概览 系统需求 部署一个基于Key文件实现访问控制的副本集 x.509 内部身份验证 概述 首发于sf.gg. 原文翻译自MongoDB官方文档.我一直认为,与其从网上随便扒一些教程,不 ...

最新文章

  1. js实现表格动态数据展示在其他页面上
  2. 开服侠显示服务器已停止,蜘蛛侠:极限(已关服)无法连接服务器是什么原因...
  3. 每日程序C语言36-数组中前面各数顺序向后移动m个位置
  4. MFC-CString与int互相转化
  5. sambd ERROR: job for smbd.service failed
  6. 错误提示:ssh: Could not resolve hostname devsrv: Name or service not known
  7. 使用QuickPart时应用自定义属性和Web Part Connection功能的演示视频
  8. mysql手册02_事务
  9. ubuntu出现qt.qpa.plugin报错
  10. AB测试的来源及适用场景
  11. 文件系统FAT32与NTFS
  12. 京东到家埋点治理实践
  13. 魅魔php影视系统,魅魔全新且强大的视频电影程序(MacCMS PHP) 6.1 20120511
  14. 神武服务器物品开放,《神武4》宠物携带等级规则调整限服测试 生存大挑战等玩法优化全服开放...
  15. python 中全局变量、局部变量、静态变量,实例变量的区别和理解
  16. ansible批量修改主机密码(非明文)
  17. 亚马逊的这个Bug居然要花两个月时间来解决?
  18. 解决eclipse老是Refreshing external folders
  19. 国内外学者联合撰写,ChatGPT技术路线图
  20. FPGA纯verilog实现UDP通信,三速网自协商仲裁,动态ARP和Ping功能,提供工程源码和技术支持

热门文章

  1. java double 存储_Java语言中:float、double在内存中存储方式
  2. 蓝桥杯2021年第十二届C++省赛第三题-直线
  3. Ubuntu-vim 命令
  4. Web — 概述、国际标准概述、特点+扩展名类型
  5. Mvc model验证总结
  6. 中小型网站集群拓扑图
  7. Nginx与Tomcat、Client之间请求的长连接配置不一致问题解决[转]
  8. windows :32位到64 位
  9. Security+ 学习笔记32 云安全控制
  10. MPLS virtual private network 地址重叠实验(华为设备)