MongoDB副本集成员如何复制新数据

news2024/12/22 1:56:08

复制是指在多台服务器上保持相同的数据副本。MongoDB 实现此功能的方式是保存操作日志(oplog),其中包含了主节点执行的每一次写操作。oplog 是存在于主节点 local 数据库中的一个固定集合。从节点通过查询此集合以获取需要复制的操作。

每个从节点都维护着自己的 oplog,用来记录它从主节点复制的每个操作。这使得每个成员都可以被用作其他成员的同步源。从节点从同步源中获取操作,将其应用到自己的数据集上,然后再写入 oplog 中。如果应用某个操作失败(只有在基础数据已损坏或数据与主节点不一致时才会发生这种情况),则从节点会停止从当前数据源复制数据。

oplog 中按顺序保存着所有执行过的写操作。每个成员都维护了一份自己的 oplog,它们应该和主节点的oplog 完全一致(可能会有一些延迟)

如果一个从节点由于某种原因而停止运行,那么当它重新启动后,就会从 oplog 中的最后一个操作开始同步。由于这些操作是先应用到数据上然后再写入 oplog,因此从节点可能会重复已经应用到其数据上的操作。MongoDB 在设计时就考虑到了这种情况:将 oplog 中的同一个操作执行多次与只执行一次效果是一样的。oplog 中的每个操作都是幂等的。也就是说,无论对目标数据集应用一次还是多次,oplog 操作都会产生相同的结果。

由于 oplog 的大小是固定的,因此它只能容纳一定数量的操作。通常来说,oplog 使用空间的速度与系统写入的速度差不多:如果在主节点上每分钟写入 1KB 的数据,那么 oplog 就会以每分钟 1KB 的速度被填满。不过,也有一些例外:如果一个操作会影响多个文档,比如删除多个文档或导致多文档更新,那么这个操作将被分解为许多 oplog 条目。主节点上的单个操作将为每个受影响的文档分解一个 oplog 操作。因此,如果使用 db.coll. remove() 从集合中删除 1 000 000 个文档,那么 oplog 中就会有 1 000 000 条操作日志,每条日志对应一个被删除的文档。如果进行大量的批量操作,那么oplog 可能会比你预期的更快被填满。

在大多数情况下,默认的 oplog 大小就足够了。如果预测副本集的工作负载属于以下模式之一,那么你可能会希望创建一个大于默认值的 oplog。相反,如果应用程序主要执行读操作而执行很少的写操作,那么一个较小的 oplog 就足够了。以下这些工作负载可能会需要更大的 oplog。

  1. 一次更新多个文档

    为了保持幂等性,oplog 必须将一个多文档更新转换为多个单独的操作。这可能会占用大量的 oplog 空间,但相应的数据大小和数据的磁盘使用量不会增加。

  2. 删除的数据量与插入的数据量相同

    如果删除的数据量与插入的数据量大致相同,那么数据库的磁盘使用量不会显著增加,但是操作日志的大小可能会非常大。

  3. 大量的就地(in-place)更新

    如果很大一部分的工作负载是不增加文档大小的更新,那么数据库会记录大量操作,但磁盘上的数据量不会改变。

在 mongod 进程创建 oplog 之前,可以使用 oplogSizeMB 选项指定其大小。然而,在第一次启动副本集成员后,只能使用“更改 oplog 大小”这个流程来更改 oplog 的大小。

MongoDB 中存在两种形式的数据同步:初始化同步用于向新成员中添加完整的数据集,复制用于将正在发生的变更应用到整个数据集。下面将逐一进行讲解。

初始化同步

MongoDB 在执行初始化同步时,会将所有数据从副本集中的一个成员复制到另一个成员中。当一个副本集成员启动时,它会检查自身的有效状态,以确定是否可以开始从其他成员中同步数据。如果状态有效,它就会尝试从该副本集的另一个成员中复制数据的完整副本。这一过程有几个步骤,可以从mongod 的日志中看到。

首先,MongoDB 会克隆除 local 数据库之外的所有数据库。mongod 会扫描源数据库中的每个集合,并将所有数据插入目标成员上这些集合的对应副本中。在开始克隆操作之前,目标成员上的任何现有数据都将被删除。

只有当你不再需要数据目录中的数据或者已经将数据移到其他地方时,才对一个成员进行初始化同步,因为在初始化同步时 mongod 首先会将其全部删除。

在 MongoDB 3.4 及之后的版本中,初始化同步在为每个集合复制文档时会创建集合中的所有索引(在早期版本中,只有"_id" 索引会在此阶段创建)。此过程还会在数据复制期间提取新添加的 oplog 记录,因此为了在这一阶段存储这些记录,应该确保目标成员在 local 数据库中有足够的磁盘空间。

一旦所有的数据库都被克隆,mongod 就会使用这些来自同步源的 oplog 记录来更新它的数据集以反映副本集的当前状态,并将复制过程中发生的所有变更应用到数据集上。这些变更可能包括任何类型的写入(插入、更新和删除),而此过程可能意味着 mongod 必须重新克隆某些被克隆程序移动并因此丢失的文档。

这时,数据应该与主节点上的数据集完全匹配。成员在完成初始化同步后会过渡到正常同步流程,这使其成了从节点。

从操作者的角度来看,进行初始化同步的过程非常容易:只需用一个干净的数据目录启动 mongod。然而,更推荐从备份中进行恢复。从备份中恢复通常比通过mongod 复制所有的数据要快。

还有一点,克隆可能会破坏同步源的工作集。在许多情况下,某些数据的子集经常会被访问,因而这部分数据总是存在于内存中(因为操作系统经常对其进行访问)。执行初始化同步会强制此成员将其所有数据分页加载到内存中,从而“驱逐”那些经常使用的数据。当那些通常由 RAM 中的数据进行处理的请求突然被迫转到磁盘时,可能此成员的速度会显著降低。不过,对于那些小型数据集和性能较好的服务器,初始化同步是一个简单易用的选择。

进行初始同步时一个最常见的问题就是时间过长。在这种情况下,新成员可能会从同步源的 oplog 末尾“脱离”:由于同步源的 oplog 已经覆盖了成员继续复制所需的数据,因此新成员会远远落后于同步源并且无法再跟上。

除了在不太忙的时候尝试初始化同步或从备份进行恢复之外,没有其他方法可以解决这个问题。如果成员已经脱离了同步源的 oplog,那么初始化同步将无法进行。

复制

MongoDB 执行的第二种同步是复制。从节点成员在初始化同步之后会持续复制数据。它们从同步源复制 oplog,并在一个异步进程中应用这些操作。从节点可以根据需要自动更改同步源,以应对 ping 时间及其他成员复制状态的变化。有一些规则可以控制给定节点从哪些成员进行同步。例如,拥有投票权的副本集成员不能从没有投票权的成员那里同步数据,从节点不能从延迟成员和隐藏成员那里同步数据。

处理过时数据

如果某个从节点远远落后于同步源当前的操作,那么这个从节点就是过时的。过时的从节点无法赶上同步源,因为同步源上的操作过于领先了:如果继续同步,从节点就需要跳过一些操作。这种情况可能发生在以下场景中:从节点服务器停止运行,写操作超过了自身处理能力,或者忙于处理过多的读请求。

当一个从节点过期时,它将依次尝试从副本集中的每个成员进行复制,看看是否有成员拥有更长的 oplog 以继续进行同步。如果没有一个成员拥有足够长的 oplog,那么该成员上的复制将停止,并且需要重新进行完全同步或从最近的备份中恢复。

为了避免出现不同步的从节点,让主节点拥有一个比较大的oplog 以保存足够多的操作日志是很重要的。一个更大的oplog 会占用更多的磁盘空间,但通常这是一个很好的折中,因为磁盘空间一般来说比较便宜,而且实际中使用的oplog 只有一小部分,所以不会占用太多的 RAM。根据经验,oplog 应该可以覆盖两到三天的正常操作(复制窗口)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1383.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Solving Inverse Problems With Deep_Neural Networks – Robustness Included_

作者:Martin Genzel, Jan Macdonald, and Maximilian Marz期刊:preprint arXiv时间:2020代码链接:代码论文链接:论文 1 动机与研究内容 最近工作发现深度神经网络对于图像重构的不稳定(instabilities),以…

记一次漏洞挖掘【网络安全】

漏洞信息 从CVE-2019-10999查看该CVE的基础信息得知,这是一个栈溢出漏洞,攻击者在已登录的情况下可以通过向wireless.htm发送一个超长的WEPEncryption参数导致栈溢出,从而执行任意命令攻击. 现在我们利用Shambles Desktop工具确定这个漏洞的…

单商户商城系统功能拆解23—用户标签

单商户商城系统,也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法,例如拼团,秒杀,砍价,包邮…

在Windows使用VSCode搭建嵌入式Linux开发环境

在Windows使用VSCode搭建嵌入式Linux开发环境 百问网已经制作好了完备的Ubuntu镜像,可以从这里下载: 链接:https://pan.baidu.com/s/1vw4VUV_Mvt0HXz8IC66ACg 提取码:iftb 我们也正在(2022.10.17开始)使用纯粹的Ubuntu环境开始…

孙宇晨2022釜山区块链周演讲:区块链是未来数字城市发展基石

据韩国媒体全球经济新闻10月27日报道,波场TRON创始人孙宇晨线上出席了2022 釜山区块链周(Blockchain Week in Busan 2022,以下简称BWB 2022),并发表《 The Cities of Tomorrow》主题演讲。孙宇晨表示,“区块…

生产环境数据库表迁移实践集锦

数据库表迁移是开发者必须要掌握的一种能力,对中高级开发者来说更是如此。工作中随着公司业务不断发展、系统架构的慢慢调整演化,迁移数据库表是不可避免的。由于数据是公司最最核心的资产,所以对生产环境数据库表的迁移并不是谁都可以去实施…

Web服务器、Ftp服务器、DNS服务器搭建【高级路由协议与实验04-2】

上一篇自学练习了如何搭建web服务器 文章目录网络设置1.修改配置文件2.改成桥接模式访问外网3.选择网卡4.重启网卡一、web服务器补充:步骤1.安装httpd软件包2.将httpd服务设为开始自启动,并启动该服务3.查看httpd服务是否启动4.在防火墙开放80端口并查看…

小白学习spring第一天

第二章:Spring 第1节:概述 1.1 介绍 heap stack Spring是一个分层的Java SE/EE full-stack(一站式)轻量级开源框架,以 IoC(Inverse Of Control:控制反转)和 AOP(Aspec…

力扣刷题day32|738单调递增的数字、714买卖股票的最佳时机含手续费、968监控二叉树

文章目录738. 单调递增的数字思路难点:遍历顺序难点:设置flag714. 买卖股票的最佳时机含手续费贪心思路难点968. 监控二叉树思路难点:如何隔两个节点放一个摄像头738. 单调递增的数字 力扣题目链接 当且仅当每个相邻位数上的数字 x 和 y 满…

常用算法———P I D控制算法(P I D三个参数的作用和两种P I D算法的代码实现)

如果有错误请及时指出,大家一起学习交流。 目录 一、PID的概述 二、PID三个参数的控制原理 1、P控制器 2、I控制器 3、D控制器 4、PID控制器 5、PID的数学公式 三、位置式PID和增量式PID的差别和代码实现 1、位置式PID和增量式PID的差别 2、位置式PID …

(附源码)计算机毕业设计SSM竞赛报名管理系统

(附源码)计算机毕业设计SSM竞赛报名管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&…

mindspore实现自定义CNN图像分类模型

一、数据集定义 使用mindspore.dataset中的ImageFolderDataset接口加载图像分类数据集,ImageFolderDataset接口传入数据集文件上层目录,每个子目录分别放入不同类别的图像。使用python定义一个create_dataset函数用于创建数据集,在函数中使用…

[C++基础]-初识模板

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、泛型编…

【正点原子STM32连载】第五十五章 T9拼音输入法实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id677017430560 3)全套实验源码手册视频下载地址:http://www.openedv.com/thread-336836-1-1.html 4&#xff…

deepwalknode2vec 代码实战

提示:笔记内容来自于B站up主同济子豪兄 文章目录1. Embedding嵌入的艺术2. deepwalk2.1. 什么是图嵌入?2.2. deepwalk的步骤1、生成graph;2、利用random walk生成多个路径;3、训练表示向量的学习;4、为了解决分类个数过…

航拍遥感数据集

一、Roundabout Aerial Images for Vehicle Detection 本数据集是从无人机拍摄的西班牙环形交叉口航空图像数据集,使用PASCAL VOC XML文件进行注释,指出车辆在其中的位置。此外,还附带一个CSV文件,其中包含与捕获的环形交叉口的位…

深度学习 神经网络(2)前向传播

深度学习 神经网络(2)前向传播一、前言二、神经网络结构三、前向传播四、参考资料一、前言 前面介绍了《感知器》,类似于单个神经元细胞,现在我们用多个感知器组合成更加复杂的神经网络。本文介绍了多层神经网络通过前向传播方法…

超市营业额数据分析

文章目录1:查看单日交易额最小的3天的交易数据,并查看这3天是周几1.1:导入模块1.2:数据处理1.3:输出结果完整代码2:把所有员工的工号前面增加一位数字,增加的数字和原工号最后一位相同&#xff…

FBAR滤波器的工作原理及制备方法

近年来,随着无线通信技术朝着高频率和高速度方向迅猛发展,以及电子元器件朝着微型化和低功耗的方向发展,基于薄膜体声波谐振器(Film Bulk Acoustic Resonator,FBAR)的滤波器的研究与开发越来越受到人们的关…

酒楼拓客营销流程,酒楼宣传推广方案

随著网络时代的发展,许多行业受到了大大的冲击,其中也涵盖酒楼,在目前的情况下,对于酒楼来说,无论是互联网还是线下,引流都是最重要的。那么酒楼如何做好营销推广工作,从而提升业绩?…