【MongoDB训练营】第一课:走进 MongoDB 答疑汇总

  1. 什么是网络脑裂?
    简单来说,就是在分布式集群环境下,往往会有一个主节点(大脑),在网络发生分区,可能会出现同时有两个节点都认为自己是主节点,这种情况需要通过一致性协议来避免,否则同时修改了集群状态,可能导致数据错乱,具体可参考:https://juejin.cn/post/6844903895387340813
  2. 分片依据的字段有什么选择依据么
    可以参考三个指标:值的多样性(cardinality,越大越好),单一值出现的频率(frequency,越小越好),shard key 对应的 value 后续发生变更的可能性(尽量不变),更多可参考 MongoDB 大学的这个视频:https://university.mongodb.com/videos/y/ujlNVJK5dMc
  3. 每个复制集存储的东西一样吗?
    一样的,这个也是MongoDB 复制协议必须要保证的。
  4. MongoDB有自己的时间同步工具吗?
    MongoDB 使用了本地的物理时钟,但是为了实现因果一致性、分布式事务和 changeStream 等功能,也实现了自己的混合逻辑时钟,混合逻辑时钟会在副本集和分片集群节点间进行同步,具体机制比较复杂,这里不做特别详细的展开,感兴趣可参考:https://www.mongodb.com/presentations/implementation-of-cluster-wide-causal-consistency-in-mongodb?_ga=2.86791323.22579815.1608534765-1541357686.1598933927
  5. 分片集群部署的话,数据的聚合是在mongos中么
    对于 find 查询,是的,但是对于 aggregation ,也可能是在某个 shard 上。
  6. MongoDB选注机制
    这个后面有课程会讲,稍安勿躁。
  7. MongoDB底层用的B tree还是B+ tree
    默认的是 WiredTiger 存储引擎,是B+ tree
  8. oplog的刷新机制
    这个后面的副本集课程也会讲。
  9. 线上环境哪个阈值的配置最佳?
    如果是阿里云 MongoDB 实例,参数已经根据规格调整到最佳,正常不需要修改,如果是自建,这个需要根据具体的workload 和 机器配置具体来看,比如 cache size,oplog 大小,是否使用线程池等等,没有标准答案。
  10. net.serviceExecutor的adaptive模式有什么弊端吗
    这个参数主要是针对高并发模式下,相比于 thread per client 模式可以降低线程切换的开销,降低机器负载和请求延迟,缺点是,如果不是高并发场景下,吞吐相比于 synchronize 模式会下降。
  11. HBase和Mongdb在哪些地方有区别?
    这个问题问的比较宽泛,简单从数据模型来说 MongoDB 的是文档模型,HBase是宽表模型,都具备存储半结构化和非结构化数据的能力,从服务的业务场景来说,MongoDB 服务于互联网业务比较多,比如游戏,在线教育等,HBase 更多的服务于大数据分析等场景;具体的大家去互联网上慢慢探索吧。
  12. insertMany可以一次插入多少条记录,一百万的记录如何插入
    建议使用 bulk insert 的方式插入,一批不要超过 1000 条。
  13. find可以最多返回多少记录,如果记录太多如何处理,有类似翻页功能吗?
    有 skip,limit 功能,翻页需要业务配合来实现。
  14. push和pop是原子操作吗?会出现资源竞争吗?
    单文档操作保证原子,资源的竞争(contention)通过文档级锁来解决。
  15. 集群配置的是时钟同步,有什么解决方案。
    前面回答过了,通过混合逻辑时钟。
  16. 对单个字段创建b树索引和哈希索引,查询时用哪个索引?
  17. select,hash 索引会更好,range 查询使用 b 树索引。
  18. 请问mongo多表关联查询时,有没有临时索引提交查询效率?
  19. 目前的多表联合查询能力相比于其他数据库,比如 MySQL 还是相对较弱的,只有一个 $lookup 和 4.4 的 union,目前没有临时索引的设计。
  20. 请问多表关联时,如何增加索引提高查询效率?
    索引的设计也是一个比较有学问的事情,需要综合考虑到索引的查询加速功能和索引维护本身的开销,具体多表关联查询上,如果不考虑 4.4 的 union,其实就只有 $lookup,这个需要根据query 条件结合 explain 结果具体来看,索引优化本身的一些基本原则,像索引选择性这些都是适用的,具体可参考官方的一些建议:https://docs.mongodb.com/manual/applications/indexes/
  21. 多表关联查询 $lookup不支持分片,是否有其它方法解决还是不建议使用关联查询
    4.4 的 $unionWith是支持分片集群的,可以进一步看下能否满足业务需求:https://docs.mongodb.com/manual/reference/operator/aggregation/unionWith/
  22. 什么情况下选择复制模式,什么情况下选择集群模式;
    这里 mongodb 官方其实有一个建议,就是从成本的角度,先选择副本集,然后 scale up,但是到一定阶段,成本必然很高,甚至容量无法满足业务需求,这时候再去考虑采用分片集群。这么建议的原因是使用分片集群本身会引入一定的复杂性,而且如果要用好,还需要业务做配合,比如选择好的 shard key 等。
  23. 在复制模式下,所有节点都部署在同一台服务器上的话,请问这样还有意义吗?
    从可用性角度,意义不大,从读性能扩展性角度,有意义。
  24. MongoDB 中存在的事务 和 关系型数据库中的事务有区别么? 是自动提交的 还是 需要手动提交?
    如果是普通的单条操作,比如 find,insert,update,可以称之为单文档事务,默认提交如果是显示开启的多文档事务,需要手动提交。
  25. 复制集有多写节点的情况吗?
    在切换的时候,有可能同时存在两个 primary的情况,进而多个节点写,但是使用更高的 writeConcern level ,比如 majority 可以避免,这个后面课程会讲。
  26. BSON文档大小限制16M,这样是不是不能一味的文档内嵌,而使用引用就要消耗额外的查询?
    是的,理解的很正确
上一篇:喜讯 | 阿里云李飞飞荣膺“2020数据风云奖——年度数据风云人物奖”


下一篇:共话实战 深剖企业那些年为何如此青睐云原生