复制

副本集 MongoDB中是一组mongod其保持相同的数据集的过程。副本集提供冗余和 高可用性,并且是所有生产部署的基础。本节介绍MongoDB中的复制以及副本集的组件和体系结构。本节还提供了与副本集相关的常见任务的教程。

冗余和数据可用性

复制提供冗余并提高 数据可用性。使用不同数据库服务器上的多个数据副本,复制可提供一定程度的容错能力,以防止丢失单个数据库服务器。

在某些情况下,复制可以提供更大的读取容量,因为客户端可以将读取操作发送到不同的服务器。在不同数据中心中维护数据副本可以提高数据本地性和分布式应用程序的可用性。您还可以维护其他副本以用于专用目的,例如灾难恢复,报告或备份。

在MongoDB中复制

副本集是一组mongod维护相同数据集的实例。一个副本集包含多个数据承载节点和一个仲裁器节点(可选)。在数据承载节点中,只有一个成员被视为主要节点,而其他节点则被视为次要节点。

所述主节点接收所有的写操作。副本集只能有一个能够确认与 写入有关的写入的主数据库。尽管在某些情况下,另一个mongod实例可能会暂时认为自己也是主要实例。 [1]主数据库在其操作日志(即oplog)中记录对其数据集的所有更改。有关主节点操作的更多信息,请参见“ 副本主集”{ w: "majority" }

点击放大

次级复制初级的OPLOG和应用操作的数据集,使得次级数据集反映了主要的数据集。如果主要节点不可用,则符合条件的次要节点将进行选举以自行选举新的主要节点。有关辅助成员的更多信息,请参阅副本集辅助成员

点击放大

您可以将一个额外的mongod实例作为仲裁器添加到副本集 。仲裁者不维护数据集。仲裁程序的目的是通过响应其他副本集成员的心跳和选举请求来维护副本集中的仲裁。由于仲裁器不存储数据集,因此它是提供副本集仲裁功能的好方法,比具有数据集的功能齐全的副本集成员的资源成本低。如果您的副本集成员数为偶数,请添加仲裁程序以majority在主要选举中获得票数。仲裁器不需要专用硬件。有关仲裁器的更多信息,请参见副本集仲裁器

点击放大

一个仲裁器将永远的仲裁器而可降级并成为一个次级和一个 次级选举过程中可能成为主。

异步复制

辅助节点复制主节点的操作日志,并将操作异步应用于其数据集。通过使次要节点的数据集反映主要节点的数据集,即使一个或多个成员失败,副本集也可以继续运行。

有关复制机制的更多信息,请参阅 副本集操作日志副本集数据同步

较慢的操作

从版本4.2(也从版本4.0.6开始可用)开始,副本集的辅助成员现在 记录的oplog条目所花费的时间比慢操作阈值要长。这些缓慢的oplog消息会在组件下的文本中记录为次要日志。这些慢操作日志条目仅取决于慢操作阈值。它们不依赖于日志级别(在系统级别或组件级别),配置级别或运行缓慢的采样率。探查器不会捕获缓慢的操作日志条目。diagnostic logREPLapplied op: <oplog entry> took <num>ms

复制延迟和流控制

复制滞后是指将操作上的写操作复制(即复制)到辅助上所花费的时间 。可以接受一些小的延迟时间,但是随着复制滞后的增加会出现严重的问题,包括在主数据库上增加缓存压力。

从MongoDB 4.2开始,管理员可以限制主数据库应用其写入的速率,以将延迟保持在可配置的最大值以下。majority committedflowControlTargetLagSeconds

默认情况下,流量控制为enabled

注意

为了启用流控制,副本集/分片集群必须具有:featureCompatibilityVersion(FCV) of 4.2并读取关注。也就是说,如果未启用FCV 或禁用了多数读功能,则启用的流控制无效。majority enabled4.2

启用流量控制后,随着滞后时间逐渐接近 flowControlTargetLagSeconds,主锁上的写操作必须先获得票证,然后才能锁定应用写操作。通过限制每秒发出的票证数量,流控制机制尝试将滞后保持在目标以下。

有关更多信息,请参见检查复制延迟和 流控制

自动故障转移

当主节点与集合中的其他成员的通信electionTimeoutMillis时间超过配置的时间段(默认为10秒)时,合格的辅助节点将要求选举以提名自己为新的主节点。群集尝试完成新主数据库的选择并恢复正常操作。

点击放大

副本集无法处理写入操作,直到选举成功完成。如果将副本集配置为在主副本处于脱机状态时在次副本上运行,则副本集可以继续提供读取查询 。

假设为default,则集群选择新的主节点之前的中值时间通常不应超过12秒。这包括将主要节点标记为不可用并致电并完成选举所需的时间。您可以通过修改复制配置选项来调整此时间段 。网络延迟之类的因素可能会延长完成副本集选举所需的时间,进而影响您的群集在没有主数据库的情况下可以运行的时间。这些因素取决于您的特定群集体系结构。replica configuration settingssettings.electionTimeoutMillis

electionTimeoutMillis 复制配置选项从默认值10000(10秒)降低可导致更快地检测主要故障。但是,由于临时网络等待时间等因素,群集可能会更频繁地调用选举,即使主节点处于其他状态也是如此。这可能会导致增加回滚为 宽:1次的写操作。

您的应用程序连接逻辑应包括对自动故障转移和后续选举的容忍度。从MongoDB 3.6开始,MongoDB驱动程序可以检测到主数据库的丢失,并可以一次自动 重试某些写入操作,从而提供了自动故障转移和选择的其他内置处理:

  • 与MongoDB 4.2兼容的驱动程序默认情况下启用可重试写入
  • MongoDB 4.0和3.6兼容的驱动程序必须通过retryWrites=true连接字符串中包含来显式启用可重试的写入。

有关副本集选择的完整文档,请参阅副本集选择

要了解有关MongoDB的故障转移过程的更多信息,请参阅:

读取操作

读取首选项

默认情况下,客户端从主服务器[1]读取数据;但是,客户端可以指定读取首选项,以将读取操作发送到辅助对象。

点击放大

异步复制到辅助数据库意味着从辅助数据库读取数据可能会返回不反映主数据库上数据状态的数据。

包含读取操作的多文档事务必须使用读取首选项primary。给定事务中的所有操作都必须路由到同一成员。

有关从副本集读取的信息,请参见“ 读取首选项”

数据可见性

根据读取的关注点,客户端可以在持久写入之前看到写入结果:

  • 不管写的写关注点如何,其他使用"local""available" 读关注的客户端都可以在向发布客户端确认写操作之前看到写操作的结果。
  • 使用"local""available" 读取关注点的客户端可以读取数据,这些数据随后可能会在副本集故障转移期间回滚

对于多文档事务中的操作,在提交事务时,将保存在事务中进行的所有数据更改,并在事务外部可见。也就是说,一个事务在回滚其他事务时将不会提交其某些更改。

在提交事务之前,在事务外部看不到在事务中进行的数据更改。

但是,当一个事务写入多个分片时,并非所有外部读取操作都需要等待已提交事务的结果在所有分片上可见。例如,如果提交了一个事务,并且在分片A上可以看到写1,但是在分片B上仍然看不到写2,则外部读处于读关注状态 "local"可以读取写1的结果而看不到写2。

有关MongoDB的读取隔离,一致性和新近度的更多信息,请参阅读取隔离,一致性和新近度。

交易

从MongoDB 4.0开始,多文档事务可用于副本集。

包含读取操作的多文档事务必须使用读取首选项primary。给定事务中的所有操作都必须路由到同一成员。

在提交事务之前,在事务外部看不到在事务中进行的数据更改。

但是,当一个事务写入多个分片时,并非所有外部读取操作都需要等待已提交事务的结果在所有分片上可见。例如,如果提交了一个事务,并且在分片A上可以看到写1,但是在分片B上仍然看不到写2,则外部读处于读关注状态 "local"可以读取写1的结果而看不到写2。

更改流

从MongoDB 3.6开始,更改流可用于副本集和分片群集。更改流允许应用程序访问实时数据更改,而不会带来复杂性和拖延操作日志的风险。应用程序可以使用更改流来订阅一个或多个集合上的所有数据更改。

附加功能

副本集提供了许多选项来支持应用程序需求。例如,您可以在多个数据中心中部署具有成员的副本集,或通过调整members[n].priority某些成员的数量来控制选举的结果 。副本集还支持专用成员进行报告,灾难恢复或备份功能。

有关更多信息,请参见优先级0副本集成员, 隐藏副本集成员和 延迟副本集成员

[1] 12某些情况下,副本集中的两个节点可能暂时相信他们是主要的,但最多,其中一人将能够完全写入的写入关注。可以完成 写入操作的节点是当前主节点,另一个节点是以前的主节点,由于网络分区,该主节点尚未意识到其降级。发生这种情况时,尽管求读取首选项,但连接到前主数据库的客户端可能仍会观察到过时的数据 ,并且对前主数据库的新写入最终将回滚。{ w: "majority" }{ w: "majority" }primary

参考:https://docs.mongodb.com/manual/replication/

MongoDB同步机制的更多相关文章

  1. MongoDB Sharding 机制分析

    MongoDB Sharding 机制分析 MongoDB 是一种流行的非关系型数据库.作为一种文档型数据库,除了有无 schema 的灵活的数据结构,支持复杂.丰富的查询功能外,MongoDB 还自 ...

  2. linux内核级同步机制--futex

    在面试中关于多线程同步,你必须要思考的问题 一文中,我们知道glibc的pthread_cond_timedwait底层是用linux futex机制实现的. 理想的同步机制应该是没有锁冲突时在用户态 ...

  3. .NET Core采用的全新配置系统[10]: 配置的同步机制是如何实现的?

    配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.要了解配置同步机制的实现原理,先得从认识一个 ...

  4. Linux的原子操作与同步机制

    Linux的原子操作与同步机制   .进程1执行完“mov eax, [count]”后,寄存器eax内保存了count的值0.此时,进程2被调度执行,抢占了进程1的CPU的控制权.进程2执行“cou ...

  5. windows核心编程 - 线程同步机制

    线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...

  6. NSURLSessionTask使用dispatch_semaphore 完成同步机制

    在NSURLSessionTask发起网路请求时,一般是异步操作,如果需要进行同步等待的话,可采用dispatch_semaphore_t信号量基于计数器的一种多线程同步机制.但是在多个线程访问共有资 ...

  7. 锁相关知识 & mutex怎么实现的 & spinlock怎么用的 & 怎样避免死锁 & 内核同步机制 & 读写锁

    spinlock在上一篇文章有提到:http://www.cnblogs.com/charlesblc/p/6254437.html  通过锁数据总线来实现. 而看了这篇文章说明:mutex内部也用到 ...

  8. Java中的闪光点:ThreadLocal是线程Thead的局部变量,可替代同步机制的设计,值得学习和研究

    线程局部变量ThreadLocal,是Java支持的一种线程安全机制,目的是解决多线程的并发问题. 具体来讲,就是多个线程访问该实例对象的变量时,该实例对象将其存储为键值对的形式,保证各个线程(键)分 ...

  9. 分析.Net里线程同步机制

    我 们知道并行编程模型两种:一种是基于消息式的,第二种是基于共享内存式的. 前段时间项目中遇到了第二种 使用多线程开发并行程序共享资源的问题 ,今天以实际案例出发对.net里的共享内存式的线程同步机制 ...

随机推荐

  1. Netty学习笔记(一)——nio基础

    Netty简单认识: 1) Netty 是由JBOSS 提供的一个Java 开源框架. 2) Netty 是一个异步的.基于事件驱动的网络应用框架,用以快速开发高性能.高可靠性的网络I0 程序. 3) ...

  2. solr8.0创建core,报Can't find resource 'solrconfig.xml

    出现这个问题,主要是因为没有找到对应的配置文件, 只需要将solr_home\configsets\_default\conf下的配置文件,拷贝到自己新建的core文件夹下即可解决问题!

  3. 【基本优化实践】【1.6】在sql server修改且移动数据库文件位置

    在master数据库中,SQL Server提供系统扩展的存储过程,其中有一些存储过程的命名以xp_开头,用于处理操作系统的文件. 一,判断文件是否存在 存储过程sys.xp_fileexist 用于 ...

  4. Python复习笔记02

    语句表达式: 在Python中支持遍历循环的对象:可迭代器对象,支持迭代协议的对象 比如列表list没有迭代功能只是可迭代对象 迭代:迭代协议 --> 例:f.__next__() 属于f的迭代 ...

  5. 使用Duilib开发Windows软件(1)——HelloWorld

    我使用的是网易版本: https://github.com/netease-im/NIM_Duilib_Framework 时间是2019-11-28,作者最新的提交如下图: 运行官方示例程序 下载完 ...

  6. 【判环】Perpetuum Mobile

    Perpetuum Mobile 题目描述 The year is 1902. Albert Einstein is working in the patent office in Bern. Many ...

  7. MySQL 子查询(三) 派生表、子查询错误

    From MySQL 5.7 ref:13.2.10.8 Derived Tables 八.派生表 派生表是一个表达式,用于在一个查询的FROM子句的范围内生成表. 例如,在一个SELECT查询的FR ...

  8. RabbitMq的环境安装

    1.如图第一个是erlang语言的安装包,第二个是rabbitmq的安装包. 2.配置erlang语言环境,因为rabbitmq由erlang语言编写的,所以需要配置erlng语言环境. erlang ...

  9. 怎样给回调函数绑定this

    在三种绑定this的方法中, Function.prototype.call() 和 Function.prototye.apply() 都是会立即执行该函数的, 但回调函数是不能立即执行的, 它只是 ...

  10. 箭头函数的arguments不可用

    ES5中的arguments function func(a,b,c){ console.log(arguments[0],arguments[1],arguments[2]) } func(1,2, ...