mongodb知识总结
知识前提:
数据库的CAP原则: ⼀致性、可⽤性、分区容错性(只能能满⾜三者之⼆)
⼀致性:
强⼀致性
弱⼀致性:
最终⼀致性:时间窗⼝
实现⼀致性:
NRW法则
两段式提交2pc
paxos算法
两段式提交2pc实现过程:
第⼀阶段:协调者询问参与者是否可以提交事务。如果参与者事务操作执⾏成功则回复yes,反之no
第⼆阶段:参与者都回复yes,协调者发出提交请求,则参与者收到后开始提交事务并释放相关资源。反之参与者则事务回滚并释放资源
可能出现的问题:
第⼆阶段的时候,假如其中⼀个参与者收到了do commit命令然后它提交了事务,但是另外⼀个参与者可能因为⽹络问题或者协调者挂掉了,导致⼀直苦苦等待⼀直占⽤资源,另外导致数据不⼀致
另外假如协调者是集,如果协调者在发出⼀个commit指令的时候宕机了,然后刚好⼀个接受到该命令的参与者也宕机了,等选举出新的协调者的时候,⽆法知道现在事务的状态
是⼀个开源的,基于分布式的,⾯向⽂档存储的⾮关系型数据库。是⾮关系型数据库当中功能最丰富、最像关系数据库的。      mongoDB由C++编写,其名字来源于"humongous"这个单词,其宗旨在于处理⼤量数据。
mongoDB可以运⾏在Windows、unix、OSX、Solaris系统上,⽀持32位和64位应⽤,提供多种编程
语⾔的驱动程序。      mongoDB⽀持的⾮常松散,是json的格式,通过键值对的形式存储数据,可以存储复杂的数据类型。
mongoDB⽀持的数据类型有:null、boolean、String、objectId、32位整数、64位整数、64位浮点数、⽇期、正则表达式、代码、⼆进制数据、数组、内嵌⽂档、最⼤值、最⼩值、未定义类型。
其中,内嵌⽂档我理解的并不是.等⽂件,这⾥所指的⽂档是mongoDB的⼀个存储单元(相当于关系型数据当中的记录),在mongoDB中的表现形式为{key1:value1,key2:value2},⽽内嵌⽂档则是这样的形式{key1:value1,key2:
{key2.1:value2.1,key2.2:value2.2}}。
mongoDB最⼤的特点是他⽀持的查询语⾔⾮常强⼤,其语法有点类似于⾯向对象的查询语⾔,⼏乎可以实现类似关系数据库单表查询的绝⼤部分功能,⽽且还⽀持对数据建⽴索引。
⼆、mongoDB的特性:
1. ⾯向集合存储。数据被分组到若⼲集合,每个集合可以包含⽆限个⽂档,可以将集合想象成RDBMS的表,区别是集合不需要进⾏模式定义。
2. 模式⾃由。集合中没有⾏和列的概念,每个⽂档可以有不同的key,key的值不要求⼀致的数据类型。
3. ⽀持动态查询。mongoDB⽀持丰富的查询表达式,查询指令使⽤json形式表达式。
4. 完整的索引⽀持。mongoDB的查询优化器会分析查询表达式,并⽣成⼀个⾼效的查询计划。
5. ⾼效的数据存储,⽀持⼆进制数据及⼤型对象(图⽚、视频等)。
6. ⽀持复制和故障恢复。
mysql面试题基础知识7. ⾃动分⽚以⽀持云级别的伸缩性,⽀持⽔平的数据库集,可动态添加额外的服务器。
嵌入式系统开发公司
三、 mongoDB的适⽤场景:
1.  适合作为信息基础设施的持久化缓存层
2. 适合实时的插⼊、更新与查询,并具备应⽤程序实时数据存储所需的复制及⾼度伸缩性
3. 适合⽂档化格式的存储及查询
4. 适合由数⼗或数百台服务器组成的数据库
四、mongoDB不适⽤场景:
1. 要求⾼度事务性的系统。例如对于银⾏或会计等需要⼤量原⼦性复杂事物的应⽤程序来说,还是需要关系型数据库的。
2. 传统的商业应⽤
3. 复杂的表级联查询
Mysql和MongoDB的⽐较
mongodb的复制功能:
1. master/slave
2. replica set:复制集、副本集      服务于同⼀数据集的多个mongodb实例,主节点将数据修改操作保存⾄oplog中
⼯作特性:⾄少三个,且应该为奇数个节点;可以使⽤arbiter来参与选举;
heartbeat(2s), ⾃动失效转移(通过选举⽅式实现)
linux删除文件还能恢复吗复制集的中特殊类型的节点:
0优先级的节点:冷备节点,不会被选举成为主节点,但可以参与选举;
被隐藏的从节点:⾸先是⼀个0优先级的从节点,且对客户端不可见;
延迟复制的从节点:⾸先是⼀个0优先级的从节点,且复制时间落后于主节点⼀个固定时长;
arbiter:
MongoDB的复制架构:
oplog
heartbeat
oplog: ⼤⼩固定的⽂件,存储在local数据库
初始同步(initial sync)
回滚后追赶(post-rollback catch-up)
切分块迁移(sharding chunk migrations)
local: 存放了副本集的所有元数据和oplog;⽤于存储oplog的是⼀个名为oplog.rs的collection;
oplog.rs的⼤⼩依赖于OS及⽂件系统;但可以⾃定义其⼤⼩oplogSize
Mongo的数据同步类型:
个人博客登django初始同步:
节点没有任何数据时
节点丢失副本复制历史
复制
初始同步的步骤:
1、克隆所有数据库
2、应⽤数据集的所有改变:复制oplog并应⽤于本地
3、为所有collection构建索引
副本集的重新选举的影响条件:
⼼跳信息
优先级
optime
webserver接口菜鸟教程⽹络连接
⽹络分区
选举机制:
触发选举的事件:
新副本集初始化时
从节点联系不到主节点时
主节点“下台”时
主节点收到stepDown()命令时
某从节点有更⾼的优先级且已经满⾜成主节点其它所有条件
主节点⽆法联系到副本集的“多数⽅”
MongoDB的分⽚:
CPU
Memory
IO
MySQL: Gizzard, HiveDB, MySQL Proxy + HSACLE, Hibernate Shard, Pyshards
分⽚架构中的⾓⾊:
mongos: Router
config server: 元数据服务器
shard: 数据节点,也称mongod实例
zookeeper
基于范围切⽚
range
基于列表切⽚
基于列表切⽚
list
基于hash切⽚
hash
写离散,读集中
⾯试题总结:
3. MySQL与MongoDB之间最基本的差别是什么?
MySQL和MongoDB两者都是免费开源的数据库。MySQL和MongoDB有许多基本差别包括数据的表⽰(data representation),查询,关系,事务
,schema的设计和定义,标准化(normalization),速度和性能。通过⽐较MySQL和MongoDB,实际上我们是在⽐较关系型和⾮关系型数据库。
4. 你怎么⽐较MongoDB、CouchDB及CouchBase?
MongoDB和CouchDB都是⾯向⽂档的数据库。MongoDB和CouchDB都是开源NoSQL数据库的最典型代表。 除了都以⽂档形式存储外它们没有其
他的共同点。MongoDB和CouchDB在数据模型实现、接⼝、对象存储以及复制⽅法等⽅⾯有很多不同。
5. MongoDB成为最好NoSQL数据库的原因是什么?
以下特点使得MongoDB成为最好的NoSQL数据库:
⾯向⽂件的  ⾼性能 ⾼可⽤性 易扩展性 丰富的查询语⾔
6.32位系统上有什么细微差别?
journaling会激活额外的内存映射⽂件。这将进⼀步抑制32位版本上的数据库⼤⼩。因此,现在journaling在32位系统上默认是禁⽤的。
7. journal回放在条⽬(entry)不完整时(⽐如恰巧有⼀个中途故障了)会遇到问题吗?
每个journal (group)的写操作都是⼀致的,除⾮它是完整的否则在恢复过程中它不会回放。
8. 分析器在MongoDB中的作⽤是什么?
MongoDB中包括了⼀个可以显⽰数据库中每个操作性能特点的数据库分析器。通过这个分析器你可以到⽐预期慢的查询(或写操作);利⽤这⼀信息,⽐如,可以确定是否需要添加索引。
9. 名字空间(namespace)是什么?
MongoDB存储BSON对象在丛集(collection)中。数据库名字和丛集名字以句点连结起来叫做名字空间(namespace)。
decimal类型转string
10. 如果⽤户移除对象的属性,该属性是否从存储层中删除?
是的,⽤户移除属性然后对象会重新保存(re-save())。
11. 能否使⽤⽇志特征进⾏安全备份? 是的。
12. 允许空值null吗?
对于对象成员⽽⾔,是的。然⽽⽤户不能够添加空值(null)到数据库丛集(collection)因为空值不是对象。然⽽⽤户能够添加空对象{}。
13. 更新操作⽴刻fsync到磁盘?
不会,磁盘写操作默认是延迟执⾏的。写操作可能在两三秒(默认在60秒内)后到达磁盘。例如,如果⼀秒内数据库收到⼀千个对⼀个对象递增的操作,仅刷新磁盘⼀次。(注意,尽管fsync选项在命令⾏和经过getLastError_old是有效的)(译者:也许是坑⼈的⾯试题??)。
14. 如何执⾏事务/加锁?
MongoDB没有使⽤传统的锁或者复杂的带回滚的事务,因为它设计的宗旨是轻量,快速以及可预计的
⾼性能。可以把它类⽐成MySQL MylSAM的⾃动提交模式。通过精简对事务的⽀持,性能得到了提升,特别是在⼀个可能会穿过多个服务器的系统⾥。
MylSAM的⾃动提交模式。通过精简对事务的⽀持,性能得到了提升,特别是在⼀个可能会穿过多个服务器的系统⾥。
15. 为什么我的数据⽂件如此庞⼤?
MongoDB会积极的预分配预留空间来防⽌⽂件系统碎⽚。
16. 启⽤备份故障恢复需要多久?
从备份数据库声明主数据库宕机到选出⼀个备份数据库作为新的主数据库将花费10到30秒时间。这期间在主数据库上的操作将会失败--包括写⼊和强⼀致性读取(strong consistent read)操作。然⽽,你还能在第⼆数据库上执⾏最终⼀致性查询(eventually consistent query) (在slaveOk模式下),即使在这段时间⾥。
17. 什么是master或primary?
它是当前备份集(replica set)中负责处理所有写⼊操作的主要节点/成员。在⼀个备份集中,当失效备援(failover)事件发⽣时,⼀个另外的成员会变成primary。
18. 什么是secondary或slave?
Seconday从当前的primary上复制相应的操作。它是通过跟踪复制oplog(local.oplog.rs)做到的。
19. 我必须调⽤getLastError来确保写操作⽣效了么?
不⽤。不管你有没有调⽤getLastError(⼜叫"Safe Mode")服务器做的操作都⼀样。调⽤getLastError只是为了确认写操作成功提交了。当然,你经常想得到确认,但是写操作的安全性和是否⽣效不是由这个决定的。
20. 我应该启动⼀个集分⽚(sharded)还是⼀个⾮集分⽚的 MongoDB 环境?
为开发便捷起见,我们建议以⾮集分⽚(unsharded)⽅式开始⼀个 MongoDB 环境,除⾮⼀台服务器不⾜以存放你的初始数据集。从⾮集分⽚升级到集分⽚(sharding)是⽆缝的,所以在你的数据集还不是很⼤的时候没必要考虑集分⽚(sharding)。
21. 分⽚(sharding)和复制(replication)是怎样⼯作的?
每⼀个分⽚(shard)是⼀个分区数据的逻辑集合。分⽚可能由单⼀服务器或者集组成,我们推荐为每⼀个分⽚(shard)使⽤集。
22. 数据在什么时候才会扩展到多个分⽚(shard)⾥?
MongoDB 分⽚是基于区域(range)的。所以⼀个集合(collection)中的所有的对象都被存放到⼀个块(chunk)中。只有当存在多余⼀个块的时候,才会有多个分⽚获取数据的选项。现在,每个默认块的⼤⼩是 64Mb,所以你需要⾄少 64 Mb 空间才可以实施⼀个迁移。
23. 当我试图更新⼀个正在被迁移的块(chunk)上的⽂档时会发⽣什么? 更新操作会⽴即发⽣在旧的分⽚(shard)上,然后更改才会在所有权转移(ownership transfers)前复制到新的分⽚上。
24. 如果在⼀个分⽚(shard)停⽌或者很慢的时候,我发起⼀个查询会怎样?
如果⼀个分⽚(shard)停⽌了,除⾮查询设置了“Partial”选项,否则查询会返回⼀个错误。如果⼀个分⽚(shard)响应很慢,MongoDB则会等待它的响应。
25. 我可以把moveChunk⽬录⾥的旧⽂件删除吗?
没问题,这些⽂件是在分⽚(shard)进⾏均衡操作(balancing)的时候产⽣的临时⽂件。⼀旦这些操作已经完成,相关的临时⽂件也应该被删除掉。但⽬前清理⼯作是需要⼿动的,所以请⼩⼼地考虑再释放这些⽂件的空间。
26. 我怎么查看 Mongo 正在使⽤的链接?
db._adminCommand("connPoolStats");
27. 如果块移动操作(moveChunk)失败了,我需要⼿动清除部分转移的⽂档吗?
不需要,移动操作是⼀致(consistent)并且是确定性的(deterministic);⼀次失败后,移动操作会不断重试;当完成后,数据只会出现在新的分⽚⾥(shard)。
28. 如果我在使⽤复制技术(replication),可以⼀部分使⽤⽇志(journaling)⽽其他部分则不使⽤吗? 可以
1.什么是NoSQL数据库?NoSQL和RDBMS有什么区别?在哪些情况下使⽤和不使⽤NoSQL数据库?

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。