41|MongoDB:MongoDB 是怎么做到高可用的?
邓明

你好,我是大明。今天我们看另外一个 NoSQL 数据库,也就是大名鼎鼎的 MongoDB。
MongoDB 是出现得比较早的文档型数据库,应该说早期我们谈到 NoSQL 的时候,第一个想到的就是 MongoDB。到现在,很多公司内部都使用了 MongoDB 来保存一些偏向文档类型的数据。
今天我们就先来学习一下 MongoDB 的基本原理,并看看 MongoDB 是如何保证高可用的。
为什么用 MongoDB?
在讨论之前,你要知道我们为什么要用 MongoDB?因为在很多情况下用 MongoDB 能够解决的问题,MySQL 同样也可以解决。
就我个人来说,使用 MongoDB 的决策理由第一个就是灵活性,其次是它的横向扩展能力。
MongoDB 是灵活的文档模型。也就是说,如果我预计我的数据可以被一个稳定的模型来描述,那么我会倾向于使用 MySQL 等关系型数据库。而一旦我认为我的数据模型会经常变动,比如说我很难预料到用户会输入什么数据,这种情况下我就更加倾向于使用 MongoDB。
MongoDB 更容易进行横向扩展。虽然关系型数据库也可以通过分库分表来达成横向扩展的目标,但是比 MongoDB 要困难很多,后期运维也要复杂很多。而这一切在 MongoDB 里面都是自动的,你基本不需要操心。
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结

MongoDB是一种文档型数据库,以其灵活的文档模型和横向扩展能力而闻名。本文深入探讨了MongoDB的高可用性和可靠性机制,包括分片机制实现的数据自动平衡和再平衡、配置服务器存储元数据以及复制机制和oplog实现的主从数据同步。此外,文章还涉及了写入语义的控制和多数据中心的主从结构。这些机制保证了MongoDB在处理文档类型的数据存储需求时的高可用性和可靠性。文章内容详实,适合读者快速了解MongoDB的高可用性和可靠性机制,以及在实际应用中的一些经验和技巧。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《后端工程师的高阶面经》,新⼈⾸单¥59
《后端工程师的高阶面经》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(2)
- 最新
- 精选
- Geek_728b54我也请教老师几个问题: 1.“引入仲裁节点,就类似于 Elasticsearch 里的仅投票节点。”,es我不是很懂,是不是类似redis的哨兵节点? 2. redis集群模式迁移时支持重定向,那mongo在迁移块的时候,可以访问么? 跟着老师的收获: MongoDB的核心:快速横向扩展和灵活的文档模型。 主从同步原理:通过oplog日志传输,oplog日志是整条数据set日志,比redis的AOF日志还夸张@。@。另外MongoDB的日志超过配置大小,直接被删除这个时候,这个从节点就只能重新发起一次全量的数据同步了。redis主从同步是环形缓冲区,mysql是日志循环组;MongoDB好不负责啊? 落盘机制:和kafka很像,主从同步完成和落盘完成,但配置多了一个超时时间,在超时之后 MongoDB 就直接返回一个错误。 %如何逐步提高中间件的可用性% 1.如果是单节点,那么可以使用一主两从,通过主从同步提高可用性。缺点是需要手动把从节点升级为主节点,和redis一样 2.引入仲裁节点和redis哨兵一样,监控/选主;仲裁节点被部署在轻量级的服务器上,成本非常低。redis这里涉及了判定下线以及哨兵选主、新从节点切到主节点。 3.引入主从结构的配置服务器,如果配置服务器挂了整个集群就基本不可用了。这个redis没有。。无中心化和中心化的区别。 4.多数据中心的主从结构,除了同城机房从节点,还可以在其他节点部署从节点,提高可用性,还可以配置从节点的优先级,同城优先。 5.分片集群既可以提高性能,又可以提高可用性。而在 MongoDB 里面,它会自动平衡不同分片的数据。 分片集群是 MongoDB 的分布式版本,相较副本集,分片集群数据被均衡的分布在不同分片中。 Config Servers:配置服务器 Mongos:路由服务 Shard:每个分片是整体数据的一部分子集 每个分片又由多个块(chunk)组成。在最新版本的默认情况下,一个块的大小是 128 MB。数据太多和文档太多,就会被自动重平衡;根据内部阈值表的规则,触发块迁移,就像AVL一样。迁移过程由MongoDB自动实现。
作者回复: 1. 是的,也就是可以搞些事情,但是本身没有数据 2. 可以的,不然 mongodb 的用户不得炸了。
2024-01-08归属地:北京 - peter请教老师几个问题: Q1:采用MongoDB,主要是因为可以动态增删字段吗? Q2:仲裁节点,不单独部署,而部署在其他主要机器上吗? 比如,一台机器部署的是MySQL,或者某一个业务的服务,仲裁节点会部署在此机器上,而不会单独部署在一个机器上,对吗? 对于ES的选举节点,应该也是一样的。 Q3:分片多但没有超过128M,也会分片吗?分片阈值是可配置的吗? Q4:阈值定义中:“少于20块”,阈值为2。以此为例,“少于20块”是分片中的块数量?还是集合中的块数量?“如果一个集合里面最大的分片有 9 个块,而最少的集合有 7 个块” ,这句话中,“最少的集合”应该是笔误,应该是“最少的分片”吧。 Q5:配置服务器是采用主从结构吗?为什么可以在主节点崩溃以后还可以继续服务?是自动切换吗? Q6:某些操作导致oplog很大的时候,会表现为响应时间长吗?
作者回复: 1. 小规模的话,这是一个很大的优点,我就比较倾向于这个。如果是规模大的话,我觉得它自动管理分片的吸引力更大,毕竟我也不想处理分库分表。 2. 可以共用一个虚拟机啥的,但是要注意不要和核心中间件共用。你可以考虑和一些不太重要的中间件,服务部署在一起,MySQL 还是很关键的,害怕影响 MySQL。 3. 分片与否是你自己控制的,这个配置是可以改的。 4. 感谢勘误。是指分片中块的数量 5. 不是,是可以读从节点。配置服务器你可以用主从结构,也可以不用。 6. 会有点影响,但是影响不是特别明显,我基本没遇到过。
2023-09-25归属地:北京
收起评论