【mongoDB】mongoDB的高可用、一致性

作者&投稿:单转 (若有异议请与网页底部的电邮联系)
~ 高可用是MongoDB最核心的功能之一,相信很多同学也是因为这一特性才想深入了解它的。
那么本节就来说下MongoDB通过哪些方式来实现它的高可用,然后给予这些特性我们可以实现什么程度的高可用。

相信一旦提到高可用,浮现在大家脑海里会有如下几个问题:

那么,带着这些问题,我们继续看下去,看完大家应该会对这些问题有所了解了。

MongoDB高可用的基础是复制集群,复制集群本质来说就是一份数据存多份,保证一台机器挂掉了数据不会丢失。
一个副本集至少有3个节点组成:

从上面的节点类型可以看出,一个三节点的复制集群可能是PSS或者PSA结构。
PSA结构优点是节约成本,但是缺点是Primary挂掉之后,一些依赖 majority(多数)特性的写功能出问题,因此一般不建议使用。

复制集群确保数据一致性的核心设计是:

从上面4点我们可以得出 MongoDB 高可用的如下结论:

MongoDB宕机重启之后可以通过checkpoint快速恢复上一个60s之前的数据。
MongoDB最后一个checkpoint到宕机期间的数据可以通过Journal日志回放恢复。
Journal日志因为是100ms刷盘一次,因此至多会丢失100ms的数据
(这个可以通过WriteConcern的参数控制不丢失,只是性能会受影响,适合可靠性要求非常严格的场景)

如果在写数据开启了多数写,那么就算Primary宕机了也是至多丢失100ms数据(可避免,同上)。

分布式系统必须要面对的一个问题就是数据的一致性和高可用,针对这个问题有一个非常著名的理论就是CAP理论。
CAP理论的核心结论是:一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。
关于CAP理论在网上有非常多的论述,这里也不赘述。

CAP理论提出了分布式系统必须面临的问题,但是我们也不可能因为这个问题就不用分布式系统。
因此,BASE(Basically Available基本可用、Soft state软状态、Eventually consistent最终一致性)理论被提出来了。
BASE理论是在一致性和可用性上的平衡,现在大部分分布式系统都是基于 BASE理论设计的,当然MongoDB也是遵循此理论的。

MongoDB为了保证可用性和分区容错性,采用的是副本集的方式,这种模式就必须要解决的一个问题就是怎样快速在系统启动和Primary发生异常时选取一个合适的主节点。

这里潜在着多个问题:

MongoDB的选举算法是基于Raft协议的改进,Raft协议将分布式集群里面的节点有3种状态:

leader:就是Primary节点,负责整个集群的写操作。
candidate:候选者,在Primary节点挂掉之后,参与竞选的节点。只有选举期间才会存在,是个临时状态。
follower:就是Secondary节点,被动的从Primary节点拉取更新数据。

节点的状态变化是:正常情况下只有一个leader和多个flower,当leader挂掉了,那么flower里面就会有部分节点成为candidate参与竞选。
当某个candidate竞选成功之后就成为新的leader,而其他candidate回到flower状态。
具体状态机如下:

Raft协议中有两个核心RPC协议分别应用在选举阶段和正常阶段:

请求投票:选举阶段,candidate向其他节点发起请求,请求对方给自己投票。
追加条目:正常阶段,leader节点向follower节点发起请求,告诉对方有数据更新,同时作为心跳机制来向所有follower宣示自己的地位。
如果follower在一定时间内没有收到该请求就会启动新一轮的选举投票。

Raft协议规定了在选举阶段的投票规则:
一个节点,在一个选举周期(Term)内只能给一个candidate节点投赞成票,且先到先得。
只有在candidate节点的oplog领先或和自己相同时才投赞成票。

一轮完整的选举过程包含如下内容:

以上就是目前掌握的MongoDB的选举机制,其中有个问题暂时还未得到解答,就是最后一个,怎样确保选出的Primary是最合适的那一个?

因为,从前面的协议来看,存在一个逻辑bug:由于follower转换成candidate是随机并行的,再加上先到先得的投票机制会导致选出一个次优的节点成为Primary。

针对Raft协议的这个问题,下来查询了一些资料,结论是:

Raft协议确实不保证选举出来的Primary节点是最优的。

MongoDB通过在选举成功,到新Primary即位之前,新增了一个 catchup(追赶)操作来解决。
即在节点获取投票胜利之后,会先检查其它节点是否有比自己更新的oplog,如果没有就直接即位,如果有就先把数据同步过来再即位。

MongoDB的主从同步机制是确保数据一致性和可靠性的重要机制。其同步的基础是oplog,类似MySQL的binlog,但是也有一些差异,oplog虽然叫log但并不是一个文件,而是一个集合(Collection)。

同时由于 oplog 的并行写入,存在尾部乱序和空洞现象,具体来说就是oplog里面的数据顺序可能是和实际数据顺序不一致,并且存在时间的不连续问题。

为了解决这个问题,MongoDB采用的是混合逻辑时钟(HLC)来解决的,HLC不止解决乱序和空洞问题,同时也是用来解决分布式系统上事务一致性的方案。

主从同步的本质实际上就是,Primary节点接收客户端请求,将更新操作写到oplog,然后Secondary从同步源拉取oplog并本地回放,实现数据的同步。

同步源是指节点拉取oplog的源节点,这个节点不一定是Primary,链式复制模式下就可能是任何节点。
节点的同步源选取是一个非常复杂的过程,大致上来说是:

在同步源选取时有些特殊情况:

用户可以为节点指定同步源。
如果关闭链式复制,所有Secondary节点的同步源都是Primary节点。
如果从同步源拉取出错了,会被短期加入黑名单。

整个拉取和回放的逻辑非常复杂,这里根据自己的理解简化说明,如果想了解更多知识可以参考《MongoDB复制技术内幕》

节点有一个专门拉取oplog的线程,通过Exhausted cursor从同步源拉取 oplog。拉取下来之后,并不会执行回放执行,而是会将其丢到一个本地
的阻塞队列中。

然后有多个具体的执行线程,从阻塞队列中取出oplog并执行。

在取出过程中,同一个Collection的oplog一定会被同一个线程取出执行,线程会尽可能的合并连续的插入命令。

整个回放的执行过程,大致为先加锁,然后写本店oplog,然后将oplog刷盘(WAL机制),最后更新自己的最新opTime。

MongoDB全方位知识图谱
https://mp.weixin.qq.com/s/bhXPnLotUoQYJI61eORCfA


mongodb 怎么读
['mɒŋgəʊ]+db 盲狗db

mongo和mysql索引有什么不同?
Mongodb和Mysql索引选型 1)首先两种数据库都选择平衡m叉树作为底层索引结构,因为平衡树m叉树是同种元素序列情况下的深度最小的m叉排序树。这可以减少m叉树元素查找的深度,从而提升平均查找效率。B树和B+树都是平衡m叉树。2)Mongodb选择B树为索引结构,Mongodb是典型的非关系行数据库,设计之初就不...

mongodb总提示No suitable servers found,该怎么办
表标PHP已经自带了mongo功能,你就可以操作下面的代码(但是你必须有安装mongodb服务器)一、连接数据库使用下面的代码创建一个数据库链接复制代码代码如下:listDBs());\/\/能打印出数据库数组,看看有几个数据库。?>如图:上图说有一个数据库名字叫local,总大小1个字节,他是空的。看见ok表示运行成功。

mongodb segmentation fault怎么解决
I have a system that creates files on disk, then uses mmap and madvise and mflush to asynchronously do I\/O to the disk. This system may potentially create many, many files, each of which will have three mmap sections, that will be rotated through the file.After trying to ...

java mongodb insert怎么插入数组
1、连接数据库,拿到集合firstCollection MongoClient mClient = new MongoClient("10.211.55.8");DB db = mClient.getDB("test");DBCollection collection = db.getCollection("firstCollection");2、插入一条文档 内容:name:user28,age:30,sex:1 Java方法内容:BasicDBObject obj = new ...

ThinkPhp框架中使用mongodb数据库配置报错Call to a member function sel...
TP3.1的解决方法就是如楼上所说,需要实例化mong数据库的模型。so 有两种方式:直接在使用的方法内实例化MongoModel类;写一个model专门继承MongoModel,把需要连mongo的操作或方法都丢里面去,然后在需要的页面中D()一下这个model中的某一方法即可.如下图代码:...

php 远程连接Mongodb问题
foreach ($cursor as $obj) { echo $obj["title"] . "\\n"; } \/\/删除所有数据 \/\/$collection->remove(); \/\/删除 name 为hm \/\/$collection->remove(array('name'=>'hm')); \/\/断开MongoDB连接 $m->close(); ?>你可以去后盾人平台看看,里面的东西不错 ...

MongoDB Aggregate $project中,如果想新加一列常数,如何写?
> mongoimport -d testdb -c website --file website.json connected to: 127.0.0.1 Mon Jan 13 14:30:22.662 imported 10 objects Note If the collection is existed, add --upsert option to override the data.> mongoimport -d testdb -c website --file website.json --upsert ...

为什么PostgreSQL比MongoDB还快
PostgreSQL9.4带来了全新的NoSQL特性,并且根据EnterpriseDB的测试,其加载,插入和查询的性能都已经几倍于MongoDB了。虽然我是PG的铁杆粉丝,但是关系数据库背负了ACID的重型装甲,在性能上居然能打败轻装上阵的NoSQL数据库总觉得有点离谱。所以我在自己的环境里验证了一下EnterpriseDB的测试结果,并且小探一...

Linux下多线程下载工具MWget和Axel使用介绍
mwget速度测试代码如下:# mwget http:\/\/fastdl.mongodb.org\/linux\/mongodb-linux-x86_64-2.4.5.tgzBegin to download: mongodb-linux-x86_64-2.4.5.tgzFileSize: 90M36% [=== === === === ] [ 33M] [2.0M\/s] [ETA:00:28]mwget速度截图如下: wget速度测试代码如下:# wget http:\/\/fastdl....

武平县13949073863: mongodb的简介 -
汤肺阿苯: MongoDB 是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型.Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引.

武平县13949073863: mongodb的使用原理 -
汤肺阿苯: 所谓“面向集合”(Collection-Oriented),意思是数据被分组存储在数据集中,被称为一个集合(Collection).每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档.集合的概念类似关系型数据库(RDBMS)里的表(...

武平县13949073863: mongodb的设计特征 -
汤肺阿苯: MongoDB 的设计目标是高性能、可扩展、易部署、易使用,存储数据非常方便.其主要功能特性如下.(1)面向集合存储,容易存储对象类型的数据.在MongoDB 中数据被分组存储在集合中,集合类似RDBMS 中的表,一个集合中可以存储无...

武平县13949073863: mongo和mongodb的区别 -
汤肺阿苯: MongoDB是一个面向文档的数据库,目前由10gen开发并维护,它的功能丰富,齐全,完全可以替代MySQL.在使用MongoDB做产品原型的过程中,我们总结了MonogDB的一些亮点:使用JSON风格语法,易于掌握和理解:MongoDB使用...

武平县13949073863: mongodb和mysql的区别 -
汤肺阿苯: 数据库模型1. mongodb 非关系行 (文档型数据库)提供可扩展的高性能数据存储2. mysql 关系行3. 存储方式1. mongodb:虚拟内存 持久化2. mysql:不同的引擎不同的存储方式3. 查询方式1. mongodb独特的查询语句2. mysql 传统的sql mongodb与mysql命令对比 传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成.MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点.

武平县13949073863: mongodb在java中怎么做修改操作 -
汤肺阿苯: java 操作mongodb插入、读取、修改以及删除基础本文主要讲述如何使用Java操作MongoDB以及了解MongoDB如何进行日常的数据库操作.文章内容如下:第一步:安装MongoDB无需太多的繁杂步骤...

武平县13949073863: 怎么连接mongodb的数据库 -
汤肺阿苯: 想在shell中连接数据库,首先要在连接数据的机器上安装mongodb的客户端才可以.客户端的安装在这里不再重复,自己百度或者google一下吧.连接mongodb的命令如下:/home/test/mongodb/mongodb-2.2.3/bin/mongo 127.0.0.1:8888 这个...

武平县13949073863: 【Python基础】mongodb存储文件的优缺点? -
汤肺阿苯: MongoDB是一个开源的、基于分布式的、面向文档存储的非关系型数据库.是非关系型数据库当中功能最丰富、最像关系数据库的.MongoDB高性能、易部署、易使用,存储数据非常方便.MongoDB优点:1、高性能:弱一致性,访问速度较快2、文档结构的存储方式,能够更便捷的获取数、存储数据方便,高效存储二进制大对象3、支持复制集、主备、互为主备、自动分片等特性4、全索引支持,查询语言功能非常强大MongoDB缺点:1、不支持事务,实际开发时得搞清楚哪些功能需要使用数据库提供的事务支持2、MongoDB占用空间大(需要强大硬盘支持)3、相对于MySQL那样成熟的维护工具,MongoDB维护工具不够完善、成熟

武平县13949073863: 千万别用MongoDB?真的吗 -
汤肺阿苯: Mongo DB 是目前在IT行业非常流行的一种非关系型数据库(NoSql),其灵活的数据存储方式备受当前IT从业人员的青睐.Mongo DB很好的实现了面向对象的思想(OO思想),在Mongo DB中 每一条记录都是一个Document对象.Mongo DB...

武平县13949073863: mongodb数据库在linux怎么登陆的 -
汤肺阿苯: 首先到下面的工具原料中的mongodb的官网下载对应你系统的安装包,拷贝到你的linux系统上面,如果有网络可以直接用wget下载解压对应的安装包命令如下:tar zxf mongodb-linux-i686-2.0.2.tgz因为mongodb不需要像别的数据库那样繁琐...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网