MongoDB面试题整理-四年经验
介绍
MongoDB是一个文档数据库,提供好的性能,领先的非关系型数据库。采用BSON存储文档数据。
BSON()是一种类json的一种二进制形式的存储格式,简称Binary JSON.
相对于json多了date类型和二进制数组。
一、MongoDB的优势有哪些
- 面向文档的存储:以 JSON 格式的文档保存数据。
- 任何属性都可以建立索引。
- 复制以及高可扩展性。
- 自动分片。
- 丰富的查询功能。
- 快速的即时更新。
二、使用MongoDB的场景
- 大数据
- 内容管理系统
- 移动端Apps
- 数据管理
三、MongoDB的命名空间
mongodb存储bson对象在丛集(collection)中.数据库名字和丛集名字以句点连结起来叫做名字空间(namespace).
-
一个集合命名空间又有多个数据域(extent),集合命名空间里存储着集合的元数据,比如集合名称,集合的第一个数据域和最后一个数据域的位置等等。而一个数据域由若干条文档(document)组成,每个数据域都有一个头部,记录着第一条文档和最后一条文档的为知,以及该数据域的一些元数据。
-
extent之间,document之间通过双向链表连接。 索引的存储数据结构是B树,索引命名空间存储着对B树的根节点的指针。
四、MongoDB的数据类型
String
Integer
Double
Boolean
Object
Object ID
Arrays
Min/Max Keys
Datetime
Code
Regular Expression等
Code是用来存储代码的。
正则表达式则是在文档中存储正则。
五、ObjectID有哪几部分组成
时间戳、客户端ID、客户进程ID、三个字节的增量计数器
- 前4个字节表示时间戳;
- 接下来的3个字节是机器标识码;
- 紧接的两个字节由进程id组成(PID);
- 最后三个字节是自增计数器生成的随机数;
六、副本集与主从同步
1. 选举
-
如果主挂了,mongodb保证只有操作序列为最大的从才能成为新的主,这只保证了数据尽可能地少丢,如果写操作是写1个节点以上成功才认为成功,可保证不丢数据
-
如果新的主丢了老的主的部分操作,而且老的主又重新加入副本集,这时老的主会回滚操作以保证与新的主状态一致。回滚日志会被记录到文件里,通过工具可手动将回滚操作来新的主上执行,以恢复数据。另外,如果需要的回滚数据超过300M,老的主不会进行回滚,并log异常;如果要强制回滚到300M之前,可采用重新同步数据的方法来保证与新主状态一致,但不能恢复这300M数据了。
-
mongodb可保证优先级最高的从节点变为主;
-
优先级为0的从节点不进行选主,即不能成为主;
-
除了主从节点,还有仲裁者节点,不保存副本数据,只用于选主投
2.变更主从
副本集支持手动变更主从关系吗?支持的话,变更会不会出现数据丢失呢?可对比下redis cluster
(1)You can force a replica set member to become primary by giving it a higher priority value than any other member in the set.(所以是支持的)
(2)变更不会出现数据丢失,因为mongodb会停止原主的更新操作,直到新主追上最新的plog后并成功变为主,才恢复更新操作(跟redis cluster的no force变更策略一样)。
副本集一般是三个数据库。