MongoDB面试题
1、MongoDB是什么?
MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多
的节点,可以保证服务器性能。 MongoDB旨在为WEB应用提供可扩展的高性能数据存储解决方案,将数据存
储为一个文档,数据结构由键值(key=>value)对组成。MongoDB文档类似于 JSON 对象。字段值可以包含
其他文档,数组及文档数组。
2、MongoDB有哪些特点?
(1)MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易;
(2)可以在MongoDB记录中设置任何属性的索引;
(3)可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性:
(4)如果负载的增加(需要更多的存储空间和更强的处理能力),它可以分布在计算机网络中的其他节点上
这就是所谓的分片;
(5)支持丰富的查询表达式,查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
3、MySQL与MongoDB之间最基本的差别是什么?
MySQL和MongoDB两者都是免费开源的数据库。MySQL和MongoDB有许多基本差别包括数据的表示查询、关
系、事务、schema的设计和定义、标准化、速度和性能。通过比较MySQL和MongoDB,实际上我们是在比较
关系型和非关系型数据库,即数据存储结构不同。
4、monogodb中的分片什么意思?
分片是将数据水平切分到不同的物理节点,当应用数据越来越大的时候,数据量也会越来越大。当数据量增长
时,单台机器有可能无法存储数据或可接受的读取写入吞吐量,利用分片技术可以添加更多的机器来应对数据
量增加以及读写操作的要求。
5、MongoDB中的命名空间是什么意思?
mongodb存储bson对象在丛集(collection)中,数据库名字和丛集名字以句点连结起来叫做名字空间,一
个集合命名空间又有多个数据域(extent),集合命名空间里存储着集合的元数据,比如集合名称,集合的第
一个数据域和最后一个数据域的位置等等。而一个数据域由若干条文档(document)组成,每个数据域都有一
个头部,记录着第一条文档和最后一条文档的为知,以及该数据域的一些元数据。extent之间,document之
间通过双向链表连接,索引的存储数据结构是B树,索引命名空间存储着对B树的根节点的指针。
6、在MongoDb中索引是什么?
索引用于高效的执行查询,没有索引的MongoDB将扫描整个集合中的所有文档,这种扫描效率很低,需要处理
大量的数据,索引是一种特殊的数据结构,将一小块数据集合保存为容易遍历的形式。索引能够存储某种特殊
字段或字段集的值,并按照索引指定的方式将字段值进行排序。
7、MongoDB成为最好NoSQL数据库的原因是什么?
以下特点使得MongoDB成为最好的NoSQL数据库:面向文件的;高性能;高可用性;易扩展性;丰富的查询语
言。
8、解释一下什么是MongoDB中的GridFS ?
为了存储和检索大文件,例如图像,视频文件和音频文件,使用GridFS。默认情况下,它使用两个文件
fs.files和fs.chunks来存储文件的元数据和块
9、分析器在MongoDB中的作用是什么?
MongoDB中包括了一个可以显示数据库中每个操作性能特点的数据库分析器。通过这个分析器你可以找到比预
期慢的查询(或写操作);利用这一信息,比如,可以确定是否需要添加索引。
10、MongoDB更新操作会立刻 fsync 到磁盘?
不会,磁盘写操作默认是延迟执行的。写操作可能在两三秒(默认在 60 秒内)后到达磁盘。例如,如果一秒
内数据库收到一千个对一个对象递增的操作,仅刷新磁盘一次。(注意,尽管 fsync 选项在命令行和经过
getLastError_old 是有效的)
11、MongoDB副本集选举条件有那些?
1.复制集初始化。
2.主节点挂掉。
3.主节点脱离副本集(可能是网络原因)。
4.参与选举的节点数量必须大于副本集总节点数量的一半,如果已经小于一半了所有节点保持只读状态。
12、简单的描述下MongoDB选举流程
1、副本集中的主节点选举必须满足“大多数”的原则,所谓“大多数”是指副本中一半以上的成员。副本集中成员只有在得到大多数成员投票支持时,才能成为主节点。例如:有N个副本集成员节点,必须有N/2+1个成员
投票支持某个节点,此节点才能成为主节点。注意:副本集中若有成员节点处于不可用状态,并不会影响副本
集中的“大多数”,“大多数”是以副本集的配置来计算的。
2、仲裁节点(Arbiter)它并不保存数据,并且不能被选举为主节点,但是具有投票权。仲裁节点使用最小
的资源,不能将Arbiter部署在同一个数据集节点中。
3、副本集中最好是有奇数个成员节点,如果有偶数个节点,最好加一个仲裁节点。若副本集中有偶数个成员
节点,如图2所示,IDC1网络连不通IDC2,IDC1和IDC2内的成员节点分别会发生选举主节点的行为,然而选
举因都无法满足大多数的原则,都不能选出主节点;加入一个仲裁节点之后,则副本集就能满足大多数原则,
从中选出主节点了。
4.如果副本集成员节点数量是奇数,就不再需要仲裁者。但是如果在成员节点是奇数时,强行使用仲裁者,会
导致选举耗时变长。由于添加了仲裁者就可能出现两个成员节点票数相同的情况,从而导致选举耗时变长。
5.若在一轮投票中,副本集中成员节点被投了反对票,则本轮不能被选为主节点。例如,在一个10个成员节点
的副本集,某轮投票中,成员节点A由于数据延迟较大被某个成员节点投了反对票,则A同时收到了9票赞成
票,然而A仍然不能被选为主节点。
6.集群中的优先级为0的节点不能成为主节点,并且不能触发选举,但是具有投票权,并且拥有与主节点一致
的数据集。
13、什么是MongoDB分片集群?
Sharding cluster是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架
构去构建。sharding分片很好的解决了单台服务器磁盘空间、内存、cpu等硬件资源的限制问题,把数据水
平拆分出去,降低单节点的访问压力。每个分片都是一个独立的数据库,所有的分片组合起来构成一个逻辑上
的完整的数据库。因此,分片机制降低了每个分片的数据操作量及需要存储的数据量,达到多台服务器来应对
不断增加的负载和数据的效果。
14、MongoDB中为何需要水平分片?
1)减少单机请求数,将单机负载,提高总负载
2)减少单机的存储空间,提高总存空间
15、MongoDB中分片键的意义何在?
1、一个好的片键对分片至关重要。 片键必须是一个索引 ,通 过 sh.shardCollection 加会自动创建索
引。一个自增的片键对写入和数据均匀分布就不是很好, 因为自增的片键总会在一个分片上写入,后续达到某
个阀值可能会写到别的分片。但是按照片键查询会非常高效。随机片键对数据的均匀分布效果很好。注意尽量
避免在多个分片上进行查询。
2、在所有分片上查询,mongos 会对结果进行归并排序,提高查询效率和速度
16、什么情况下需要用到MongoDB的分片?
1)机器的磁盘不够用了。使用分片解决磁盘空间的问题。
2)单个mongod已经不能满足写数据的性能要求。通过分片让写压力分散到各个分片上面,使用分片服务器自
身的资源。
3)想把大量数据放到内存里提高性能。和上面一样,通过分片使用分片服务器自身的资源。
17、构建一个分片集群需要用的那些角色?分别是什么?
1)分片服务器(Shard Server)
mongod 实例,用于存储实际的数据块,实际生产环境中一个 shard server 角色可由几台机器组个一
个 relica set 承担,防止主机单点故障
这是一个独立普通的mongod进程,保存数据信息。可以是一个副本集也可以是单独的一台服务器。
2)配置服务器(Config Server)
mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息。
这是一个独立的mongod进程,保存集群和分片的元数据,即各分片包含了哪些数据的信息。最先开始建立,
启用日志功能。像启动普通的 mongod 一样启动
配置服务器,指定configsvr 选项。不需要太多的空间和资源,配置服务器的 1KB 空间相当于真是数据
的 200MB。保存的只是数据的分布表。
3)路由服务器(Route Server)
mongos实例,前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用
起到一个路由的功能,供程序连接。本身不保存数据,在启动时从配置服务器加载集群信息,开启 mongos
进程需要知道配置服务器的地址,指定configdb选项。
18、如何执行事务/加锁?
MongoDB没有使用传统的锁或者复杂的带回滚的事务,因为它设计的宗旨是轻量,快速以及可预计的高性能。
可以把它类比成MySQL MylSAM的自动提交模式。通过精简对事务的支持,性能得到了提升,特别是在一个可
能会穿过多个服务器的系统里。
19、副本集角色有那些?做是什么?
1. 主节点(Primary)
接收所有的写请求,然后把修改同步到所有Secondary。一个Replica Set只能有一个Primary节点,当
Primary挂掉后,其他Secondary或者Arbiter节点会重新选举出来一个主节点。
默认读请求也是发到Primary节点处理的,可以通过修改客户端连接配置以支持读取Secondary节点。
2. 副本节点(Secondary)
与主节点保持同样的数据集。当主节点挂掉的时候,参与选主。
3. 仲裁者(Arbiter)
不保有数据,不参与选主,只进行选主投票。使用Arbiter可以减轻数据存储的硬件需求,Arbiter几乎没什
么大的硬件资源需求,但重要的一点是,在生产环境下它和其他数据节点不要部署在同一台机器上。
20、非关系型数据库有哪些类型?
1、 Key-Value 存储 Eg:Amazon S3
2、图表 Eg:Neo4J
3、文档存储 Eg:MongoDB
4、基于列存储 Eg:Cassandra
21、数据在什么时候才会扩展到多个分片(shard)里?
MongoDB 分片是基于区域(range)的。所以一个集合(collection)中的所有的对象都被存放到一个块
(chunk)中。只有当存在多余一个块的时候,才会有多个分片获取数据的选项。现在,每个默认块的大小是
64Mb,所以你需要至少 64 Mb 空间才可以实施一个迁移。
22、如果在一个分片(shard)停止或者很慢的时候,我发起一个查询会怎样?
如果一个分片(shard)停止了,除非查询设置了“Partial”选项,否则查询会返回一个错误。如果一个分片
(shard)响应很慢,MongoDB则会等待它的响应。
23、如何理解MongoDB中的GridFS机制,MongoDB为
何使用GridFS来存储文件?
GridFS是一种将大型文件存储在MongoDB中的文件规范。使用GridFS可以将大文件分隔成多个小文档存放,
这样我们能够有效的保存大文档,而且解决了BSON对象有限制的问题。
24、我应该启动一个集群分片(sharded)还是一个非集群分片的 MongoDB 环境?
为开发便捷起见,我们建议以非集群分片(unsharded)方式开始一个 MongoDB 环境,除非一台服务器不足
以存放你的初始数据集。从非集群分片升级到集群分片(sharding)是无缝的,所以在你的数据集还不是很大
的时候没必要考虑集群分片(sharding)。
25、MongoDB适合应用在那些场景?
从目前阿里云 MongoDB 云数据库上的用户看,MongoDB 的应用已经渗透到各个领域,比如游戏、物流、电
商、内容管理、社交、物联网、视频直播等,以下是几个实际的应用案例。
游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、
更新物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形
式来存储,一次查询就能将订单所有的变更读取出来。
社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的
人、地点等功能物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析视频直播,使用 MongoDB 存储用户信息、礼物信息等
26、"ObjectID"有哪些部分组成
一共有四部分组成:时间戳、客户端ID、客户进程ID、三个字节的增量计数器。
_id是一个 12 字节长的十六进制数,它保证了每一个文档的唯一性。在插入文档时,需要提供_id。如果你
不提供,那么 MongoDB 就会为每一文档提供一个唯一的 id。_id的头 4 个字节代表的是当前的时间戳,
接着的后 3 个字节表示的是机器 id 号,接着的 2 个字节表示 MongoDB 服务器进程 id,最后的 3 个
字节代表递增值。
27、如何使用"AND"或"OR"条件循环查询集合中的文档
在 find() 方法中,如果传入多个键,并用逗号( , )分隔它们,那么 MongoDB 会把它看成是AND条件。
>db.mycol.find({key1:value1, key2:value2}).pretty()
若基于OR条件来查询文档,可以使用关键字$or。
>db.mycol.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
28、在MongoDB中如何排序?
MongoDB 中的文档排序是通过 sort() 方法来实现的。 sort() 方法可以通过一些参数来指定要进行排序
的字段,并使用 1 和 -1 来指定排序方式,其中 1 表示升序,而 -1 表示降序。
>db.connectionName.find({key:value}).sort({columnName:1})
29、什么是聚合?
聚合操作能够处理数据记录并返回计算结果。聚合操作能将多个文档中的值组合起来,对成组数据执行各种操
作,返回单一的结果。它相当于 SQL 中的 count(*) 组合 group by。对于 MongoDB 中的聚合操作,
应该使用 aggregate() 方法。
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
30、raft选举过程,投票规则?
选举过程:
当系统启动好之后,初始选举后系统由1个Leader和若干个Follower角色组成。然后突然由于某个异常
原因,Leader服务出现了异常,导致Follower角色检测到和Leader的上次RPC更新时间超过给定阈值时间
时。此时Follower会认为Leader服务已出现异常,然后它将会发起一次新的Leader选举行为,同时将自身
的状态从Follower切换为Candidate身份。随后请求其它Follower投票选择自己。
投票规则:
当一个候选人获得了同一个任期号内的大多数选票,就成为领导人。
每个节点最多在一个任期内投出一张选票。并且按照先来先服务的原则。
一旦候选人赢得选举,立刻成为领导,并发送心跳维持权威,同时阻止新领导人的诞生