前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mongoDB复制(译 v4.0)

mongoDB复制(译 v4.0)

作者头像
shirley
修改于 2019-06-28 15:15:13
修改于 2019-06-28 15:15:13
1K0
举报
文章被收录于专栏:进击的全栈进击的全栈
  • 冗余和数据可用性
  • MongoDB中的复制
  • 异步复制
  • 自动故障转移
  • 读操作
  • 事务
  • 变更流
  • 其它功能

注: MongoDB Atlas上托管的所有数据库都配置为副本集。 Atlas可以轻松添加和删除首选云提供商的任何区域中的副本集成员。注册MongoDB Atlas

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

冗余和数据可用性

复制提供冗余并提高数据可用性。通过在不同数据库服务器上提供多个数据副本,复制可提供一定级别的容错功能,以防止丢失单个数据库服务器

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

MongoDB中的复制

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

主节点接收所有写操作。副本集只能有一个能够确认具有写入关注的写入的主节点;虽然在某些情况下,另一个mongod实例可能暂时认为自己也是主节点。[1]主节点将所有的变更记录到它的操作日志的数据集中,即oplog。有关主节点操作的详细信息,请参阅副本集主节点

Replication in MongoDB
Replication in MongoDB

从节点复制主节点的oplog并将操作应用于其数据集,以使从节点的数据集反映主节点的数据集。 如果主节点不可用,则符合条件的从节点将有机会选择它自己成为主节点。 有从节点成员的详细信息,请参阅副本集从节点成员

Replication in MongoDB
Replication in MongoDB

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

Replication in MongoDB
Replication in MongoDB

仲裁者将永远是仲裁者,而主节点有可能降级成为从节点,而从节点可能在一次选举期间成为主节点。

异步复制

从节点异步应用主节点的操作。 通过在主节点之后应用操作,尽管一个或多个成员失败,但集合仍可继续运行。 有关复制机制的详细信息,请参阅副本集Oplog副本集数据同步

副本集的从节点现在记录oplog项的时间要比应用的慢操作阈值长。在REPL组件下的诊断日志中为从节点记录这些慢速oplog消息,其应用的文本 op 是:<oplog entry> took <num>ms。 这些慢oplog条目仅取决于慢速操作阈值。 它们不依赖于日志级别(系统级别或组件级别),性能分析级别或慢操作采样率。 分析器不捕获慢速oplog条目。 有关更多信息,请参阅慢Oplog应用程序

自动故障转移

当主节点超过配置的electionTimeoutMillis(默认为10秒)不能与集合的其它成员通信时,符合条件的从节点要求选举将自己指定为新主节点。 群集尝试完成新主节点的选举并恢复正常操作。

Replication in MongoDB
Replication in MongoDB

在选举成功完成之前,副本集无法处理写入操作。 如果查询被配置为主节点脱机时在从节点上运行,则副本集可以继续提供读取查询。

假设是默认的副本配置设置,群集选择新主节点之前的中位时间通常不应超过12秒。 这包括将主节点标记为不可用并调用和完成一次选举所需的时间。 您可以通过修改复制配置选项settings.electionTimeoutMillis来调整此时间段。 网络延迟等因素可能会延长副本集选举完成所需的时间,从而影响群集在没有主节点的情况下运行的时间。 这些因素取决于您的特定群集体系结构。

将复制配置选项electionTimeoutMillis从默认的10000(10秒)降低可以更快地检测到主节点故障。 但是,由于诸如临时网络延迟等因素,群集可能会更频繁地调用选举,即使主节点是正常的。 这可能导致w:1写入操作的回滚增加。

您的应用程序连接逻辑应包括自动故障转移和后续选举的容差。

版本3.6中的新功能:MongoDB 3.6+驱动程序可以检测主数据库的丢失并自动重试某些写操作一次,从而提供额外的内置自动故障转移和选举处理。

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

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

读操作

默认情况下,客户端从主[1]读取; 但是,客户端可以指定读取首选项以将读取操作发送到从节点。 对从节点的异步复制意味着从从节点读取的数据不能反映主节点上数据的状态。 有关从副本集读取的信息,请参阅读取首选项

包含读取操作的多文档事务必须将读取首选项设置为主节点(use read preference primary)。

给定事务中的所有操作都必须路由到同一成员。

根据write concern,客户端可以在写入持久之前查看写入结果:

  • 无论是否write concern,使用“本地”或“可用”readConcern的其他客户端都可以在向发布客户端确认写入操作之前查看写入操作的结果。

对于多文档事务中的操作,在事务提交之前,事务的数据更改在事务外部不可见。 但是,其他客户端可以在向发布客户端确认提交操作之前查看事务提交时的结果。

  • 使用“本地”或“可用”readConcern的客户端可以读取在副本集故障转移期间可能随后回滚的数据。

有关MongoDB的读取隔离、一致性和recency的更多信息,请参阅Read Isolation, Consistency, and Recency

事务

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

包含读取操作的多文档事务必须使用read preference primary。

给定事务中的所有操作都必须路由到同一成员。

变更流

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

其它功能

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

有关详细信息,请参阅优先级0副本集成员隐藏副本集成员延迟副本集成员

1(1,2)在某些情况下,副本集中的两个节点可能会暂时认为它们是主要节点,但最多其中一个节点将能够使用 { w: "majority" }write concern完成写入。 可以完成{ w: "majority" } 写入的节点是当前主节点,而另一个节点是以前的主节点,通常由于网络分区尚未意识到其已降级。 发生这种情况时,尽管已经被要求设置读首选项为主节点,连接到前一个主节点的客户端仍可能会观察到过时数据,对前一个主节点的新写入最终将回滚。

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
mongoDB 文档查询
1、文档查询db.users.find()等价于db.users.find( {} ) 2、基于and运算符的多个组合条件可以省略and运算符的多个组合条件可以省略and,直接将条件组合即可 3、对于$and运算符内的条件,用[]括起来,相当于数组形式 4、对于数组查询,可以使用基于下标的方式精确配置特定的元素值 5、对于内嵌文档,可以使用”文档键.内嵌文档键”方式进行访问 6、对于数组内内嵌文档的方式,可以使用”数组名.下标.内嵌文档键”方式访问 7、对于哪些列名需要显示可以通过{ field1: <0|1>, … }来设定 8、本文参考:https://docs.mongodb.com/manual/tutorial/query-documents/
Leshami
2018/08/13
3.3K0
【翻译】MongoDB指南/CRUD操作(一)
【原文地址】https://docs.mongodb.com/manual/ MongoDB CRUD操作(一) 主要内容:CRUD操作简介,插入文档,查询文档。 CRUD操作包括创建、读取、更新和删除文档。 创建操作 执行创建或者插入操作可向集合中添加文档。如果集合不存在,插入操作会创建此集合。 MongoDB提供下列方法向集合中插入文档: db.collection.insert() db.collection.insertOne()  3.2版本新增 db.collection.insertMany(
甜橙很酸
2018/03/08
5.6K0
【翻译】MongoDB指南/CRUD操作(一)
MongoDB 数组元素增删改
与关系型数据库相比,MongoDB支持数组,将数组存储到文档之中。因此,与之对应的是数组的增删改查。对于有C语言基础的童鞋,数组应该不会陌生。数组的增删改查,在MongoDB中有相应的操作符来实现。本文主要描述数组的增删改相关操作符的使用。 有关数组的查询可以参考:MongoDB 数组查询 1、占位符$ 占位符$的作用主要是用于返回数组中第一个匹配的数组元素值(子集),重点是第一个 在更新时未显示指定数组中元素位置的情形下,占位符$用于识别元素的位置 通过数组过滤条件找到的第一个匹配的元素值的文档将
Leshami
2018/08/13
6.9K0
mongoDB 文档删除
mongoDB文档删除等同于关系型数据库中删除满足条件的单条或者多条记录,通常使用db.collection.remove()方法来实现文档的删除动作。mongDB文档删除属于原子性操作,仅仅在仅仅在单个文档级别。本文描述mongoDB文档删除操作并给出示例。 预备热身 Linux下快速安装MongoDB Windows平台下安装MongoDB mongoDB 启动与停止 mongo shell连接到mongoDB及shell提示符下执行js脚本 mongoDB简介及关键特性
Leshami
2018/08/13
1.7K0
【翻译】MongoDB指南/CRUD操作(二)
【原文地址】https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关注),写确认(写关注) 1 更新文档 1.1 更新 MongoDB提供下列方法用于更新一个集合 db.collection.updateOne() 更新使用指定过滤器匹配到的文档,即使过滤器匹配到多个文档,也只会更新一个文档。 3.2版本新增特性。 db.collection.upda
甜橙很酸
2018/03/08
2.5K0
mongoDB 文档更新
1、mongoDB文档更新有很多个不同的方法,传统的update,以及3.2版本之后的updateOne,updateMany 2、mongoDB文档替换也有很多个不通的方法,传统的update,以及3.2版本之后的replaceOnye,replaceMany 3、updateOne与updateMany是对update方法的扩展,update方法可以通过multi值为true或false来等同于updateMany以及updateOne 4、replaceOne与replaceMany也是对update方法的扩展,update方法可以通过multi值为true或false来等同于replaceMany以及replaceOne
Leshami
2018/08/13
1.8K0
MongoDB(3): 查询
  2、如果没有显示指定_id字段隐藏,则默认会显示,显示指定隐藏,如:find({},{"_id":0});
py3study
2020/01/09
1.9K0
MongoDB(3): 查询
mongodb查询的语法总结
$size是匹配数组内的元素数量的,如有一个对象:{a:[“foo”]},他只有一个元素:
周小董
2019/03/25
1.8K0
pymongo的简单使用
pymongo的使用 首先安装: pip install pymongo 安装好了使用 import pymongo # 链接mongodb,得到一个mongoclient的客户端对象 client = pymongo.MongoClient() # 指定数据库 db = client.test db = client["test"] # 这两种方式都可以指定数据库,如果没有该数据库的话,会自行创建 # 如果了解面向对象的一些魔法(内置)方法的话,大概能够知道client对应的类,肯定重写__get
py3study
2020/01/16
8330
MongoDB权威指南学习笔记(1)--基础知识与对文档的增删改查
使用.来分割不同命名空间的子集合,例如一个博客系统可能包含两个集合,分别时blog.posts和blog.authors。
earthchen
2020/09/24
5.7K0
mongodb操作(概述以及相关的命令)
http://blog.csdn.net/ljfbest/article/details/11979609
bear_fish
2018/09/20
6550
MongoDB 3.0.6的主,从,仲裁节点搭建
在MongoDB所在路径创建log和data目录 mkdir log mkdir data
用户3003813
2018/09/06
1.4K0
MongoDB 3.0.6的主,从,仲裁节点搭建
MongoDB常用操作
插入多条测试数据 > for(i=1;i<=1000;i++){ ... db.blog.insert({"title":i,"content":"mongodb测试文章。","name":"刘"+i}); ... }
白墨石
2021/01/13
1.2K0
MongoDB入门实操《下篇》
友情提示:“无量测试之道”原创著作,欢迎关注交流,禁止第三方不显示文章来源时转载。
Wu_Candy
2022/07/04
2250
mongodb的查询语句学习摘要 原
db.users.find({"age" : 27}) select * from users where age = 27
拓荒者
2019/03/11
8380
python操作mongodb数据库
(6) $push: 和 $ pushAll 都是向数组属性添加元素。# 好像两者没啥区别
bear_fish
2018/09/20
1.8K0
浅尝辄止MongoDB:操作(1)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/82863479
用户1148526
2019/05/25
9510
浅尝辄止MongoDB:操作(3)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/82882703
用户1148526
2019/05/25
1.1K0
mongodb进阶一之高级查询「建议收藏」
上篇文章我们讲了mongodb的crud基本操作 http://blog.csdn.net/stronglyh/article/details/46812579
全栈程序员站长
2022/07/08
5690
MongoDB基本概念
Mongo 是 humongous 的中间部分,在英文里是“巨大无比”的意思。所以 MongoDB 可以翻译成“巨大无比的数据库”,更优雅的叫法是“海量数据库”。Mongodb是一款非关系型数据库,说到非关系型数据库,区别于关系型数据库最显著的特征就是没有SQL语句,数据没有固定的数据类型,关系数据库的所使用的SQL语句自从 IBM 发明出来以后,已经有 40 多年的历史了,但是时至今日,开发程序员一般不太喜欢这个东西,因为它的基本理念和程序员编程的想法不一致。后来所谓的 NoSQL 风,指的就是那些不用 SQL 作为查询语言的数据存储系统,而文档数据库 MongoDB 正是 NoSQL 的代表。看一下当下数据库的排名就会发现,目前排在Mongodb数据库前面的无一例外是老牌的关系型数据库,而在NoSQL序列中,Mongodb排名第一,且有上升的趋势。
Java廖志伟
2022/03/07
6.7K0
MongoDB基本概念
相关推荐
mongoDB 文档查询
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档