MongoDB 面试题

21-12-23 banq

您在创建MongoDB时想解决什么问题?
我们曾经并且正在尝试构建我们作为开发人员一直想要的数据库。对于纯报告,SQL 和关系是很好的,但是在构建数据时总是需要一些不同的东西:使编码水平扩展的东西。

MongoDB 早期的主要障碍是什么?
整个 nosql 领域的一大障碍是,从关系转向任何事物对用户来说都是一大步。关系是一个伟大的每个从学校毕业的人都知道。然而,计算机架构正在发生变化,云计算即将到来。我们需要在完全不同的环境中运行的解决方案。也很有趣——因此产品的动态模式性质。

未来 3 个月 MongoDB 将何去何从?6个月?12个月?
我们当然相信还有很多事情要做,而且需要数年甚至数月的时间。路线图中的重点是更快的聚合能力、全文搜索、更好的并发性以及轻松的大型集群设置和管理。目前的普遍关注点是确保产品适用于关键任务生产应用程序。

您希望对MongoDB做一些不同的事情吗?
事后看来,我对两三年前做出的许多设计决定感到非常高兴。我们在那里很幸运。我非常喜欢数据模型。我喜欢强一致的操作是可能的:有很多用例,例如只注册一个新用户,在那里人们需要它。更重要的是,还有一长串我们想做但还没有做的事情。

什么使 Mongodb 最好?
面向文档
高性能
高可用性
易于扩展
丰富的查询语言

如果我使用复制,某些成员可以使用日记功能而其他成员不可以吗?
是的

我可以使用日志功能来执行安全的热备份吗?
是的

什么是 32 位细微差别?
有日志记录的额外内存映射文件活动。这将进一步限制 32 位构建的有限数据库大小。因此,目前在 32 位系统上默认禁用日志记录。
如果条目不完整(例如失败发生在一个中间),日志重播是否会出现问题?
每个日志(组)写入都是一致的,除非完成,否则在恢复期间不会重放。

Profiler 在 MongoDB 中的作用是什么?
MongoDB 包含一个数据库分析器,它显示针对数据库的每个操作的性能特征。使用分析器,您可以找到比应有的速度慢的查询(和写入操作);例如,使用此信息来确定何时需要索引。

什么是“命名空间”?
MongoDB 将 BSON 对象存储在集合中。数据库名称和集合名称(中间有句点)的串联称为命名空间。
如果删除对象属性,它是否会从商店中删除?
是的,您删除该属性,然后 re-save() 对象。

是否允许空值?
对于对象的成员,是的。尽管 null 不是对象,但您不能将 null 添加到数据库集合中。不过,您可以添加 {}。

是否立即将 fsync 更新到磁盘?
不,默认情况下写入磁盘是惰性的。几秒钟后写入可能会命中磁盘。例如,如果数据库在一秒内收到一个对象的一千个增量,它只会被刷新到磁盘一次。(注意 fsync 选项在命令行和通过 getLastError_old 都可用。)

我如何进行交易/锁定?
MongoDB 不使用传统的锁定或带回滚的复杂事务,因为它被设计为轻量级、快速且性能可预测。它可以被认为类似于 MySQL MyISAM 自动提交模型。通过保持事务支持极其简单,性能得到了增强,尤其是在可能跨多个服务器运行的系统中。

为什么我的数据文件这么大?
MongoDB会主动预分配保留空间以避免文件系统碎片化。

副本集故障转移需要多长时间?
其他成员可能需要 10 到 30 秒的时间来宣布主要成员退出并选出新的主要成员。在这段时间内,集群因“主要”操作(即写入和强一致性读取)而关闭。但是,您可以随时(在 slaveOk 模式下)对辅助节点执行最终一致的查询,包括在此窗口期间。

什么是大师或初级?
这是一个节点/成员,它当前是主节点并处理副本集的所有写入。在副本集中,在发生故障转移事件时,不同的成员可以成为主要成员。

什么是次要或奴隶?
辅助节点是从当前主节点应用操作的节点/成员。这是通过拖尾复制 oplog (local.oplog.rs) 来完成的。
从主节点到辅助节点的复制是异步的,但是辅助节点会尽量保持最新状态(通常在 LAN 上只有几毫秒)。

我是否必须调用 getLastError 才能使写入持久化?
不。如果您不调用 getLastError(又名“安全模式”),服务器会执行与您调用时完全相同的行为。getLastError 调用只是让人们确认写入操作已成功提交。当然,通常您会需要这种确认,但写入的安全性及其耐用性是独立的。

我应该从分片还是非分片的 MongoDB 环境开始?
为了简单和快速启动,我们建议不分片开始,除非您的初始数据集不适合单个服务器。从未分片升级到分片是简单且无缝的,因此在数据集很大之前设置分片并没有太多优势。

分片如何与复制一起工作?
每个分片都是分区数据的逻辑集合。分片可以由单个服务器或一组副本组成。我们建议为每个分片使用一个副本集。

数据何时会在多个分片上?
MongoDB 分片是基于范围的。所以集合中的所有对象都被放入一个块中。只有当有超过 1 个块时,才有多个分片获取数据的选项。现在,默认块大小为 64mb,因此您至少需要 64mb 才能进行迁移。

如果我尝试更新正在迁移的块上的文档,会发生什么?
更新将立即在旧分片上进行,然后更改将在所有权转移之前复制到新分片。

如果分片出现故障或速度缓慢而我执行查询怎么办?
如果分片关闭,除非设置了“部分”查询选项,否则查询将返回错误。如果分片响应缓慢,mongos 将等待它。

我可以删除 moveChunk 目录中的旧文件吗?
是的,这些文件是在正常的分片平衡操作期间作为备份制作的。操作完成后就可以删除了。清理过程目前是手动的,因此请务必注意以释放空间。

如何查看 mongos 使用的连接?
db._adminCommand(“connPoolStats”);

如果 moveChunk 失败,我是否需要清理部分移动的文档?
不,块移动是一致且确定的;移动将重试,完成后数据将仅在新分片上。